diff --git a/.abi-compliance-history b/.abi-compliance-history index a4bf3336cac..df5bb72128a 100644 --- a/.abi-compliance-history +++ b/.abi-compliance-history @@ -18,6 +18,30 @@ # Be sure to replace "" with details of your change and # why it is deemed acceptable. +2780538433fc3b40b4e1e7bc7cbd350e37b6d550 +# +# Check for USAGE privilege on types used by stored expressions. +# 2026-08-10 06:38:12 -0700 +# +# The addition of a parameter to AlterDomainAddConstraint() breaks ABI +# compatibility, but we are unaware of any impacted third-party code. + +2a29b607dbbba47c8e1c97458708e775bfa0e9bb +# +# Add an output_plugin_libraries GUC to bless trusted output plugins +# 2026-08-10 06:38:12 -0700 +# +# Addition of a new GUC enlarges ConfigureNamesString[], +# but that is not harmful. + +a1fa24127d6a24611e5ec8e5b00584b333a3a06c +# +# Preserve the owner of extended statistics rebuilt by ALTER TABLE. +# 2026-08-10 06:38:11 -0700 +# +# CreateStatistics()'s signature changes and CreateStatsStmt gains a field, +# but no known third-party code calls the former or constructs the latter. + 8d9a97e0bb6d820dac553848f0d5d8cc3f3e219d # # Avoid name collision with NOT NULL constraints diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml index 1f32c53bf83..09ee1a47674 100644 --- a/.cirrus.tasks.yml +++ b/.cirrus.tasks.yml @@ -406,7 +406,7 @@ task: # print_stacktraces=1,verbosity=2, duh # detect_leaks=0: too many uninteresting leak errors in short-lived binaries UBSAN_OPTIONS: print_stacktrace=1:disable_coredump=0:abort_on_error=1:verbosity=2 - ASAN_OPTIONS: print_stacktrace=1:disable_coredump=0:abort_on_error=1:detect_leaks=0:detect_stack_use_after_return=0 + ASAN_OPTIONS: print_stacktrace=1:disable_coredump=0:abort_on_error=1:detect_leaks=0 # SANITIZER_FLAGS is set in the tasks below CFLAGS: -Og -ggdb -fno-sanitize-recover=all $SANITIZER_FLAGS diff --git a/configure b/configure index 472e4bb8cf7..6cef1a552e5 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for PostgreSQL 18.4. +# Generated by GNU Autoconf 2.69 for PostgreSQL 18.6. # # Report bugs to . # @@ -582,8 +582,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='PostgreSQL' PACKAGE_TARNAME='postgresql' -PACKAGE_VERSION='18.4' -PACKAGE_STRING='PostgreSQL 18.4' +PACKAGE_VERSION='18.6' +PACKAGE_STRING='PostgreSQL 18.6' PACKAGE_BUGREPORT='pgsql-bugs@lists.postgresql.org' PACKAGE_URL='https://www.postgresql.org/' @@ -1468,7 +1468,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures PostgreSQL 18.4 to adapt to many kinds of systems. +\`configure' configures PostgreSQL 18.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1533,7 +1533,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of PostgreSQL 18.4:";; + short | recursive ) echo "Configuration of PostgreSQL 18.6:";; esac cat <<\_ACEOF @@ -1724,7 +1724,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -PostgreSQL configure 18.4 +PostgreSQL configure 18.6 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2477,7 +2477,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by PostgreSQL $as_me 18.4, which was +It was created by PostgreSQL $as_me 18.6, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -20179,7 +20179,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by PostgreSQL $as_me 18.4, which was +This file was extended by PostgreSQL $as_me 18.6, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20250,7 +20250,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -PostgreSQL config.status 18.4 +PostgreSQL config.status 18.6 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 636ba548920..527437e0d20 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ dnl Read the Autoconf manual for details. dnl m4_pattern_forbid(^PGAC_)dnl to catch undefined macros -AC_INIT([PostgreSQL], [18.4], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/]) +AC_INIT([PostgreSQL], [18.6], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/]) m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.69], [], [m4_fatal([Autoconf version 2.69 is required. Untested combinations of 'autoconf' and PostgreSQL versions are not diff --git a/contrib/amcheck/expected/check_btree.out b/contrib/amcheck/expected/check_btree.out index c6f4b16c556..cad1d4c91fe 100644 --- a/contrib/amcheck/expected/check_btree.out +++ b/contrib/amcheck/expected/check_btree.out @@ -178,7 +178,8 @@ SELECT bt_index_check('toasty', true); (1 row) -- --- Check that index expressions and predicates are run as the table's owner +-- Check that index expressions and predicates are run as the table's owner, +-- with empty search_path -- TRUNCATE bttest_a; INSERT INTO bttest_a SELECT * FROM generate_series(1, 1000); @@ -186,19 +187,31 @@ ALTER TABLE bttest_a OWNER TO regress_bttest_role; -- A dummy index function checking current_user CREATE FUNCTION ifun(int8) RETURNS int8 AS $$ BEGIN - ASSERT current_user = 'regress_bttest_role', + ASSERT current_setting('search_path') = 'pg_catalog, pg_temp', + format('ifun(%s) called with current_schemas %s, search_path %s', + $1, current_schemas(true), current_setting('search_path')); + ASSERT "current_user"() = 'regress_bttest_role', format('ifun(%s) called by %s', $1, current_user); RETURN $1; END; $$ LANGUAGE plpgsql IMMUTABLE; CREATE INDEX bttest_a_expr_idx ON bttest_a ((ifun(id) + ifun(0))) WHERE ifun(id + 10) > ifun(10); +BEGIN; +SET LOCAL check_function_bodies = off; +CREATE SCHEMA preempt; +GRANT USAGE ON SCHEMA preempt TO regress_bttest_role; +SET LOCAL search_path = preempt, pg_catalog, public; +CREATE FUNCTION "current_user"() RETURNS name AS $$ + broken +$$ LANGUAGE sql STABLE PARALLEL SAFE STRICT; SELECT bt_index_check('bttest_a_expr_idx', true); bt_index_check ---------------- (1 row) +ROLLBACK; -- UNIQUE constraint check SELECT bt_index_check('bttest_a_idx', heapallindexed => true, checkunique => true); bt_index_check diff --git a/contrib/amcheck/sql/check_btree.sql b/contrib/amcheck/sql/check_btree.sql index 0793dbfeebd..9bd484b92a6 100644 --- a/contrib/amcheck/sql/check_btree.sql +++ b/contrib/amcheck/sql/check_btree.sql @@ -116,7 +116,8 @@ INSERT INTO toast_bug SELECT repeat('a', 2200); SELECT bt_index_check('toasty', true); -- --- Check that index expressions and predicates are run as the table's owner +-- Check that index expressions and predicates are run as the table's owner, +-- with empty search_path -- TRUNCATE bttest_a; INSERT INTO bttest_a SELECT * FROM generate_series(1, 1000); @@ -124,7 +125,10 @@ ALTER TABLE bttest_a OWNER TO regress_bttest_role; -- A dummy index function checking current_user CREATE FUNCTION ifun(int8) RETURNS int8 AS $$ BEGIN - ASSERT current_user = 'regress_bttest_role', + ASSERT current_setting('search_path') = 'pg_catalog, pg_temp', + format('ifun(%s) called with current_schemas %s, search_path %s', + $1, current_schemas(true), current_setting('search_path')); + ASSERT "current_user"() = 'regress_bttest_role', format('ifun(%s) called by %s', $1, current_user); RETURN $1; END; @@ -132,8 +136,16 @@ $$ LANGUAGE plpgsql IMMUTABLE; CREATE INDEX bttest_a_expr_idx ON bttest_a ((ifun(id) + ifun(0))) WHERE ifun(id + 10) > ifun(10); - +BEGIN; +SET LOCAL check_function_bodies = off; +CREATE SCHEMA preempt; +GRANT USAGE ON SCHEMA preempt TO regress_bttest_role; +SET LOCAL search_path = preempt, pg_catalog, public; +CREATE FUNCTION "current_user"() RETURNS name AS $$ + broken +$$ LANGUAGE sql STABLE PARALLEL SAFE STRICT; SELECT bt_index_check('bttest_a_expr_idx', true); +ROLLBACK; -- UNIQUE constraint check SELECT bt_index_check('bttest_a_idx', heapallindexed => true, checkunique => true); diff --git a/contrib/amcheck/verify_common.c b/contrib/amcheck/verify_common.c index d095e62ce55..c3bc833c5c8 100644 --- a/contrib/amcheck/verify_common.c +++ b/contrib/amcheck/verify_common.c @@ -92,6 +92,7 @@ amcheck_lock_relation_and_check(Oid indrelid, SetUserIdAndSecContext(heaprel->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); } else { diff --git a/contrib/amcheck/verify_gin.c b/contrib/amcheck/verify_gin.c index c615d950736..0455ea2a2c1 100644 --- a/contrib/amcheck/verify_gin.c +++ b/contrib/amcheck/verify_gin.c @@ -638,6 +638,9 @@ gin_check_parent_keys_consistency(Relation rel, pfree(ipd); } + if (prev_tuple) + pfree(prev_tuple); + prev_tuple = CopyIndexTuple(idxtuple); prev_attnum = current_attnum; } diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c index 3de1c06c7cf..c7cd8d3f043 100644 --- a/contrib/amcheck/verify_nbtree.c +++ b/contrib/amcheck/verify_nbtree.c @@ -336,14 +336,16 @@ bt_index_check_callback(Relation indrel, Relation heaprel, void *state, bool rea if (indrel->rd_opfamily[i] == INTERVAL_BTREE_FAM_OID) { has_interval_ops = true; - ereport(ERROR, - (errcode(ERRCODE_INDEX_CORRUPTED), - errmsg("index \"%s\" metapage incorrectly indicates that deduplication is safe", - RelationGetRelationName(indrel)), - has_interval_ops - ? errhint("This is known of \"interval\" indexes last built on a version predating 2023-11.") - : 0)); + break; } + + ereport(ERROR, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg("index \"%s\" metapage incorrectly indicates that deduplication is safe", + RelationGetRelationName(indrel)), + has_interval_ops + ? errhint("This is known of \"interval\" indexes last built on a version predating 2023-11.") + : 0)); } /* Check index, possibly against table it is an index on */ @@ -2891,7 +2893,7 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup) ItemPointerGetOffsetNumber(&(itup->t_tid)), RelationGetRelationName(state->rel)))); else if (!VARATT_IS_COMPRESSED(DatumGetPointer(normalized[i])) && - VARSIZE(DatumGetPointer(normalized[i])) > TOAST_INDEX_TARGET && + VARSIZE_ANY(DatumGetPointer(normalized[i])) > TOAST_INDEX_TARGET && (att->attstorage == TYPSTORAGE_EXTENDED || att->attstorage == TYPSTORAGE_MAIN)) { diff --git a/contrib/btree_gist/btree_bit.c b/contrib/btree_gist/btree_bit.c index 0df2ae20d8b..a8f2636c638 100644 --- a/contrib/btree_gist/btree_bit.c +++ b/contrib/btree_gist/btree_bit.c @@ -215,7 +215,7 @@ gbt_bit_ssup_cmp(Datum x, Datum y, SortSupport ssup) Datum result; /* for leaf items we expect lower == upper, so only compare lower */ - result = DirectFunctionCall2(byteacmp, + result = DirectFunctionCall2(bitcmp, PointerGetDatum(arg1.lower), PointerGetDatum(arg2.lower)); diff --git a/contrib/btree_gist/btree_float4.c b/contrib/btree_gist/btree_float4.c index bec026a923a..90cfef5742b 100644 --- a/contrib/btree_gist/btree_float4.c +++ b/contrib/btree_gist/btree_float4.c @@ -25,30 +25,36 @@ PG_FUNCTION_INFO_V1(gbt_float4_penalty); PG_FUNCTION_INFO_V1(gbt_float4_same); PG_FUNCTION_INFO_V1(gbt_float4_sortsupport); +/* + * Use the NaN-aware comparators from utils/float.h, so that our results + * will agree with standard btree indexes. Note that penalty and distance + * functions below must also cope with NaNs, in particular with the policy + * that all NaNs are equal. + */ static bool gbt_float4gt(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float4 *) a) > *((const float4 *) b)); + return float4_gt(*((const float4 *) a), *((const float4 *) b)); } static bool gbt_float4ge(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float4 *) a) >= *((const float4 *) b)); + return float4_ge(*((const float4 *) a), *((const float4 *) b)); } static bool gbt_float4eq(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float4 *) a) == *((const float4 *) b)); + return float4_eq(*((const float4 *) a), *((const float4 *) b)); } static bool gbt_float4le(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float4 *) a) <= *((const float4 *) b)); + return float4_le(*((const float4 *) a), *((const float4 *) b)); } static bool gbt_float4lt(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float4 *) a) < *((const float4 *) b)); + return float4_lt(*((const float4 *) a), *((const float4 *) b)); } static int @@ -56,22 +62,33 @@ gbt_float4key_cmp(const void *a, const void *b, FmgrInfo *flinfo) { float4KEY *ia = (float4KEY *) (((const Nsrt *) a)->t); float4KEY *ib = (float4KEY *) (((const Nsrt *) b)->t); + int res; - if (ia->lower == ib->lower) - { - if (ia->upper == ib->upper) - return 0; - - return (ia->upper > ib->upper) ? 1 : -1; - } - - return (ia->lower > ib->lower) ? 1 : -1; + res = float4_cmp_internal(ia->lower, ib->lower); + if (res != 0) + return res; + return float4_cmp_internal(ia->upper, ib->upper); } static float8 gbt_float4_dist(const void *a, const void *b, FmgrInfo *flinfo) { - return GET_FLOAT_DISTANCE(float4, a, b); + float8 arg1 = *(const float4 *) a; + float8 arg2 = *(const float4 *) b; + float8 r; + + r = arg1 - arg2; + /* needn't consider isinf case here, must be due to input infinity */ + if (unlikely(isnan(r))) + { + if (isnan(arg1) && isnan(arg2)) + r = 0.0; /* treat NaNs as equal */ + else if (isnan(arg1) || isnan(arg2)) + r = get_float8_infinity(); /* max dist for NaN vs non-NaN */ + else + r = 0.0; /* must be Inf - Inf case */ + } + return fabs(r); } @@ -101,7 +118,15 @@ float4_dist(PG_FUNCTION_ARGS) r = a - b; if (unlikely(isinf(r)) && !isinf(a) && !isinf(b)) float_overflow_error(); - + if (unlikely(isnan(r))) + { + if (isnan(a) && isnan(b)) + r = 0.0; /* treat NaNs as equal */ + else if (isnan(a) || isnan(b)) + r = get_float4_infinity(); /* max dist for NaN vs non-NaN */ + else + r = 0.0; /* must be Inf - Inf case */ + } PG_RETURN_FLOAT4(fabsf(r)); } @@ -183,7 +208,7 @@ gbt_float4_penalty(PG_FUNCTION_ARGS) float4KEY *newentry = (float4KEY *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(1))->key); float *result = (float *) PG_GETARG_POINTER(2); - penalty_num(result, origentry->lower, origentry->upper, newentry->lower, newentry->upper); + float_penalty_num(result, origentry->lower, origentry->upper, newentry->lower, newentry->upper); PG_RETURN_POINTER(result); } diff --git a/contrib/btree_gist/btree_float8.c b/contrib/btree_gist/btree_float8.c index 43e7cde2b69..e1df74a6af4 100644 --- a/contrib/btree_gist/btree_float8.c +++ b/contrib/btree_gist/btree_float8.c @@ -26,30 +26,36 @@ PG_FUNCTION_INFO_V1(gbt_float8_same); PG_FUNCTION_INFO_V1(gbt_float8_sortsupport); +/* + * Use the NaN-aware comparators from utils/float.h, so that our results + * will agree with standard btree indexes. Note that penalty and distance + * functions below must also cope with NaNs, in particular with the policy + * that all NaNs are equal. + */ static bool gbt_float8gt(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float8 *) a) > *((const float8 *) b)); + return float8_gt(*((const float8 *) a), *((const float8 *) b)); } static bool gbt_float8ge(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float8 *) a) >= *((const float8 *) b)); + return float8_ge(*((const float8 *) a), *((const float8 *) b)); } static bool gbt_float8eq(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float8 *) a) == *((const float8 *) b)); + return float8_eq(*((const float8 *) a), *((const float8 *) b)); } static bool gbt_float8le(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float8 *) a) <= *((const float8 *) b)); + return float8_le(*((const float8 *) a), *((const float8 *) b)); } static bool gbt_float8lt(const void *a, const void *b, FmgrInfo *flinfo) { - return (*((const float8 *) a) < *((const float8 *) b)); + return float8_lt(*((const float8 *) a), *((const float8 *) b)); } static int @@ -57,16 +63,12 @@ gbt_float8key_cmp(const void *a, const void *b, FmgrInfo *flinfo) { float8KEY *ia = (float8KEY *) (((const Nsrt *) a)->t); float8KEY *ib = (float8KEY *) (((const Nsrt *) b)->t); + int res; - if (ia->lower == ib->lower) - { - if (ia->upper == ib->upper) - return 0; - - return (ia->upper > ib->upper) ? 1 : -1; - } - - return (ia->lower > ib->lower) ? 1 : -1; + res = float8_cmp_internal(ia->lower, ib->lower); + if (res != 0) + return res; + return float8_cmp_internal(ia->upper, ib->upper); } static float8 @@ -79,6 +81,15 @@ gbt_float8_dist(const void *a, const void *b, FmgrInfo *flinfo) r = arg1 - arg2; if (unlikely(isinf(r)) && !isinf(arg1) && !isinf(arg2)) float_overflow_error(); + if (unlikely(isnan(r))) + { + if (isnan(arg1) && isnan(arg2)) + r = 0.0; /* treat NaNs as equal */ + else if (isnan(arg1) || isnan(arg2)) + r = get_float8_infinity(); /* max dist for NaN vs non-NaN */ + else + r = 0.0; /* must be Inf - Inf case */ + } return fabs(r); } @@ -109,7 +120,15 @@ float8_dist(PG_FUNCTION_ARGS) r = a - b; if (unlikely(isinf(r)) && !isinf(a) && !isinf(b)) float_overflow_error(); - + if (unlikely(isnan(r))) + { + if (isnan(a) && isnan(b)) + r = 0.0; /* treat NaNs as equal */ + else if (isnan(a) || isnan(b)) + r = get_float8_infinity(); /* max dist for NaN vs non-NaN */ + else + r = 0.0; /* must be Inf - Inf case */ + } PG_RETURN_FLOAT8(fabs(r)); } @@ -191,7 +210,7 @@ gbt_float8_penalty(PG_FUNCTION_ARGS) float8KEY *newentry = (float8KEY *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(1))->key); float *result = (float *) PG_GETARG_POINTER(2); - penalty_num(result, origentry->lower, origentry->upper, newentry->lower, newentry->upper); + float_penalty_num(result, origentry->lower, origentry->upper, newentry->lower, newentry->upper); PG_RETURN_POINTER(result); } diff --git a/contrib/btree_gist/btree_utils_num.c b/contrib/btree_gist/btree_utils_num.c index 346ee837d75..50b031d1e74 100644 --- a/contrib/btree_gist/btree_utils_num.c +++ b/contrib/btree_gist/btree_utils_num.c @@ -297,8 +297,19 @@ gbt_num_consistent(const GBT_NUMKEY_R *key, retval = tinfo->f_le(query, key->upper, flinfo); break; case BtreeGistNotEqualStrategyNumber: - retval = (!(tinfo->f_eq(query, key->lower, flinfo) && - tinfo->f_eq(query, key->upper, flinfo))); + if (is_leaf) + retval = !(tinfo->f_eq(query, key->lower, flinfo)); + else + { + /* + * If the upper/lower bounds are equal, then all entries below + * this node must have exactly that value. So we can avoid + * descending if the query equals both bounds. In all other + * cases, we must descend. + */ + retval = !(tinfo->f_eq(query, key->lower, flinfo) && + tinfo->f_eq(query, key->upper, flinfo)); + } break; default: retval = false; diff --git a/contrib/btree_gist/btree_utils_num.h b/contrib/btree_gist/btree_utils_num.h index 53e477d8b1e..d42d1e61585 100644 --- a/contrib/btree_gist/btree_utils_num.h +++ b/contrib/btree_gist/btree_utils_num.h @@ -9,6 +9,7 @@ #include "access/gist.h" #include "btree_gist.h" +#include "utils/float.h" typedef char GBT_NUMKEY; @@ -58,21 +59,124 @@ typedef struct /* - * Note: The factor 0.49 in following macro avoids floating point overflows + * Compute penalty for expanding a range olower..oupper to nlower..nupper. + * + * Although the arguments are declared double, they must not be NaN nor + * large enough to risk overflows in the calculations herein. We only + * actually use this for integral data types, so there's no hazard. + */ +static inline float +penalty_num_impl(double olower, double oupper, + double nlower, double nupper, + int natts) +{ + float result = 0.0F; + double tmp = 0.0; + + /* Add penalty for expanding upper bound */ + if (nupper > oupper) + tmp += nupper - oupper; + /* Add penalty for expanding lower bound */ + if (olower > nlower) + tmp += olower - nlower; + if (tmp > 0.0) + { + /* Ensure result is non-zero, even if next step underflows to zero */ + result += FLT_MIN; + /* Scale penalty to 0 .. 1 */ + result += (float) (tmp / (tmp + (oupper - olower))); + /* Scale to 0 .. FLT_MAX / (natts + 1) */ + result *= FLT_MAX / (natts + 1); + } + return result; +} + +/* + * As above, but the input values are float4 or float8, so we must cope + * with NaNs, infinities, and overflows. + */ +static inline float +float_penalty_num_impl(double olower, double oupper, + double nlower, double nupper, + int natts) +{ + float result = 0.0F; + double tmp = 0.0; + + /* Add penalty for expanding upper bound */ + if (float8_gt(nupper, oupper)) + { + double delta = nupper - oupper; + + if (unlikely(isnan(delta))) + { + /* oupper couldn't be NaN here, see float8_gt */ + if (isnan(nupper)) + delta = FLT_MAX; /* max penalty for NaN vs non-NaN */ + else + delta = 0.0; /* must be Inf - Inf case */ + } + else if (delta > FLT_MAX) + delta = FLT_MAX; /* clamp to FLT_MAX, esp for infinity */ + tmp += delta; + } + /* Add penalty for expanding lower bound */ + if (float8_gt(olower, nlower)) + { + double delta = olower - nlower; + + if (unlikely(isnan(delta))) + { + /* nlower couldn't be NaN here, see float8_gt */ + if (isnan(olower)) + delta = FLT_MAX; /* max penalty for NaN vs non-NaN */ + else + delta = 0.0; /* must be Inf - Inf case */ + } + else if (delta > FLT_MAX) + delta = FLT_MAX; /* clamp to FLT_MAX, esp for infinity */ + tmp += delta; + } + if (tmp > 0.0) + { + double delta = oupper - olower; + + /* Clamp delta (the original range size) to 0 .. FLT_MAX */ + if (unlikely(isnan(delta))) + { + /* here, we must deal with olower possibly being NaN */ + if (isnan(oupper) && isnan(olower)) + delta = 0.0; /* treat NaNs as equal */ + else if (isnan(oupper) || isnan(olower)) + delta = FLT_MAX; /* max penalty for NaN vs non-NaN */ + else + delta = 0.0; /* must be Inf - Inf case */ + } + else if (delta > FLT_MAX) + delta = FLT_MAX; /* clamp to FLT_MAX, esp for infinity */ + /* Ensure result is non-zero, even if next step underflows to zero */ + result += FLT_MIN; + /* Scale penalty to 0 .. 1 */ + result += (float) (tmp / (tmp + delta)); + /* Scale to 0 .. FLT_MAX / (natts + 1) */ + result *= FLT_MAX / (natts + 1); + } + return result; +} + +/* + * These macros provide backwards-compatible notation for callers. */ #define penalty_num(result,olower,oupper,nlower,nupper) do { \ - double tmp = 0.0F; \ - (*(result)) = 0.0F; \ - if ( (nupper) > (oupper) ) \ - tmp += ( ((double)nupper)*0.49F - ((double)oupper)*0.49F ); \ - if ( (olower) > (nlower) ) \ - tmp += ( ((double)olower)*0.49F - ((double)nlower)*0.49F ); \ - if (tmp > 0.0F) \ - { \ - (*(result)) += FLT_MIN; \ - (*(result)) += (float) ( ((double)(tmp)) / ( (double)(tmp) + ( ((double)(oupper))*0.49F - ((double)(olower))*0.49F ) ) ); \ - (*(result)) *= (FLT_MAX / (((GISTENTRY *) PG_GETARG_POINTER(0))->rel->rd_att->natts + 1)); \ - } \ + GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); \ + *(result) = penalty_num_impl(olower, oupper, nlower, nupper, \ + entry->rel->rd_att->natts); \ +} while (0) + +#define float_penalty_num(result,olower,oupper,nlower,nupper) do { \ + GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); \ + *(result) = float_penalty_num_impl(olower, oupper, nlower, nupper, \ + entry->rel->rd_att->natts); \ } while (0) @@ -86,6 +190,7 @@ typedef struct (ivp)->day * (24.0 * SECS_PER_HOUR) + \ (ivp)->month * (30.0 * SECS_PER_DAY)) +/* This macro is not safe to use with actual float inputs, only integers */ #define GET_FLOAT_DISTANCE(t, arg1, arg2) fabs( ((float8) *((const t *) (arg1))) - ((float8) *((const t *) (arg2))) ) diff --git a/contrib/btree_gist/btree_utils_var.c b/contrib/btree_gist/btree_utils_var.c index 96cc08f9054..ae2191de37a 100644 --- a/contrib/btree_gist/btree_utils_var.c +++ b/contrib/btree_gist/btree_utils_var.c @@ -571,6 +571,13 @@ gbt_var_consistent(GBT_VARKEY_R *key, { bool retval = false; + /* + * Remember that f_cmp is for internal pages, f_eq etc for leaf pages, and + * on internal pages we need to check gbt_var_node_pf_match too. + * + * The leaf-page tests use swapped operands (e.g., f_gt(query, lower) + * means "lower < query"), which is why they look reversed. + */ switch (strategy) { case BTLessEqualStrategyNumber: @@ -611,8 +618,20 @@ gbt_var_consistent(GBT_VARKEY_R *key, || gbt_var_node_pf_match(key, query, tinfo); break; case BtreeGistNotEqualStrategyNumber: - retval = !(tinfo->f_eq(query, key->lower, collation, flinfo) && - tinfo->f_eq(query, key->upper, collation, flinfo)); + if (is_leaf) + retval = !(tinfo->f_eq(query, key->lower, collation, flinfo)); + else + { + /* + * If the upper/lower bounds are equal and not truncated, then + * all entries below this node must have exactly that value. + * So we can avoid descending if the query equals both bounds. + * In all other cases, we must descend. + */ + retval = tinfo->trnc || + !(tinfo->f_cmp(query, key->lower, collation, flinfo) == 0 && + tinfo->f_cmp(query, key->upper, collation, flinfo) == 0); + } break; default: retval = false; diff --git a/contrib/btree_gist/data/float4.data b/contrib/btree_gist/data/float4.data index 947955e4680..af7d09f00d6 100644 --- a/contrib/btree_gist/data/float4.data +++ b/contrib/btree_gist/data/float4.data @@ -298,6 +298,9 @@ \N 2972.381398 220.199877 +Infinity +-Infinity +NaN 3542.561032 -2168.024176 -3305.714558 diff --git a/contrib/btree_gist/data/float8.data b/contrib/btree_gist/data/float8.data index ff21226e066..b60e22f957f 100644 --- a/contrib/btree_gist/data/float8.data +++ b/contrib/btree_gist/data/float8.data @@ -298,6 +298,9 @@ 27770.539968 13275.355549 -4267.695804 +Infinity +-Infinity +NaN \N \N 38915.525185 diff --git a/contrib/btree_gist/expected/float4.out b/contrib/btree_gist/expected/float4.out index dfe732049e6..a917b79a63b 100644 --- a/contrib/btree_gist/expected/float4.out +++ b/contrib/btree_gist/expected/float4.out @@ -5,13 +5,13 @@ SET enable_seqscan=on; SELECT count(*) FROM float4tmp WHERE a < -179.0; count ------- - 244 + 245 (1 row) SELECT count(*) FROM float4tmp WHERE a <= -179.0; count ------- - 245 + 246 (1 row) SELECT count(*) FROM float4tmp WHERE a = -179.0; @@ -23,13 +23,13 @@ SELECT count(*) FROM float4tmp WHERE a = -179.0; SELECT count(*) FROM float4tmp WHERE a >= -179.0; count ------- - 303 + 305 (1 row) SELECT count(*) FROM float4tmp WHERE a > -179.0; count ------- - 302 + 304 (1 row) SELECT a, a <-> '-179.0' FROM float4tmp ORDER BY a <-> '-179.0' LIMIT 3; @@ -45,13 +45,13 @@ SET enable_seqscan=off; SELECT count(*) FROM float4tmp WHERE a < -179.0::float4; count ------- - 244 + 245 (1 row) SELECT count(*) FROM float4tmp WHERE a <= -179.0::float4; count ------- - 245 + 246 (1 row) SELECT count(*) FROM float4tmp WHERE a = -179.0::float4; @@ -63,13 +63,13 @@ SELECT count(*) FROM float4tmp WHERE a = -179.0::float4; SELECT count(*) FROM float4tmp WHERE a >= -179.0::float4; count ------- - 303 + 305 (1 row) SELECT count(*) FROM float4tmp WHERE a > -179.0::float4; count ------- - 302 + 304 (1 row) EXPLAIN (COSTS OFF) @@ -89,3 +89,38 @@ SELECT a, a <-> '-179.0' FROM float4tmp ORDER BY a <-> '-179.0' LIMIT 3; -158.17741 | 20.822586 (3 rows) +-- EXCLUDE constraint must block a duplicate NaN, same as it does for finite +-- values. +CREATE TABLE float4excl (a float4, EXCLUDE USING gist (a WITH =)); +INSERT INTO float4excl VALUES ('NaN'::float4); +INSERT INTO float4excl VALUES ('NaN'::float4); -- expect: violates EXCLUDE +ERROR: conflicting key value violates exclusion constraint "float4excl_a_excl" +DETAIL: Key (a)=(NaN) conflicts with existing key (a)=(NaN). +SELECT count(*) FROM float4excl; + count +------- + 1 +(1 row) + +-- Test double-column index +CREATE INDEX float4idx2 ON float4tmp USING gist ( a, abs(a) ); +EXPLAIN (COSTS OFF) +SELECT count(*) FROM float4tmp WHERE abs(a) = 179.0::float4; + QUERY PLAN +-------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on float4tmp + Recheck Cond: (abs(a) = '179'::real) + -> Bitmap Index Scan on float4idx2 + Index Cond: (abs(a) = '179'::real) +(5 rows) + +SELECT count(*) FROM float4tmp WHERE abs(a) = 179.0::float4; + count +------- + 1 +(1 row) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/contrib/btree_gist/expected/float8.out b/contrib/btree_gist/expected/float8.out index ebd0ef3d689..194bd210ac6 100644 --- a/contrib/btree_gist/expected/float8.out +++ b/contrib/btree_gist/expected/float8.out @@ -5,13 +5,13 @@ SET enable_seqscan=on; SELECT count(*) FROM float8tmp WHERE a < -1890.0; count ------- - 237 + 238 (1 row) SELECT count(*) FROM float8tmp WHERE a <= -1890.0; count ------- - 238 + 239 (1 row) SELECT count(*) FROM float8tmp WHERE a = -1890.0; @@ -23,13 +23,13 @@ SELECT count(*) FROM float8tmp WHERE a = -1890.0; SELECT count(*) FROM float8tmp WHERE a >= -1890.0; count ------- - 307 + 309 (1 row) SELECT count(*) FROM float8tmp WHERE a > -1890.0; count ------- - 306 + 308 (1 row) SELECT a, a <-> '-1890.0' FROM float8tmp ORDER BY a <-> '-1890.0' LIMIT 3; @@ -45,13 +45,13 @@ SET enable_seqscan=off; SELECT count(*) FROM float8tmp WHERE a < -1890.0::float8; count ------- - 237 + 238 (1 row) SELECT count(*) FROM float8tmp WHERE a <= -1890.0::float8; count ------- - 238 + 239 (1 row) SELECT count(*) FROM float8tmp WHERE a = -1890.0::float8; @@ -63,13 +63,13 @@ SELECT count(*) FROM float8tmp WHERE a = -1890.0::float8; SELECT count(*) FROM float8tmp WHERE a >= -1890.0::float8; count ------- - 307 + 309 (1 row) SELECT count(*) FROM float8tmp WHERE a > -1890.0::float8; count ------- - 306 + 308 (1 row) EXPLAIN (COSTS OFF) @@ -89,3 +89,38 @@ SELECT a, a <-> '-1890.0' FROM float8tmp ORDER BY a <-> '-1890.0' LIMIT 3; -1769.73634 | 120.26366000000007 (3 rows) +-- EXCLUDE constraint must block a duplicate NaN, same as it does for finite +-- values. +CREATE TABLE float8excl (a float8, EXCLUDE USING gist (a WITH =)); +INSERT INTO float8excl VALUES ('NaN'::float8); +INSERT INTO float8excl VALUES ('NaN'::float8); -- expect: violates EXCLUDE +ERROR: conflicting key value violates exclusion constraint "float8excl_a_excl" +DETAIL: Key (a)=(NaN) conflicts with existing key (a)=(NaN). +SELECT count(*) FROM float8excl; + count +------- + 1 +(1 row) + +-- Test double-column index +CREATE INDEX float8idx2 ON float8tmp USING gist ( a, abs(a) ); +EXPLAIN (COSTS OFF) +SELECT count(*) FROM float8tmp WHERE abs(a) = 1890.0::float8; + QUERY PLAN +--------------------------------------------------------------- + Aggregate + -> Bitmap Heap Scan on float8tmp + Recheck Cond: (abs(a) = '1890'::double precision) + -> Bitmap Index Scan on float8idx2 + Index Cond: (abs(a) = '1890'::double precision) +(5 rows) + +SELECT count(*) FROM float8tmp WHERE abs(a) = 1890.0::float8; + count +------- + 1 +(1 row) + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/contrib/btree_gist/expected/numeric.out b/contrib/btree_gist/expected/numeric.out index ae839b8ec83..34c1e568063 100644 --- a/contrib/btree_gist/expected/numeric.out +++ b/contrib/btree_gist/expected/numeric.out @@ -7,13 +7,13 @@ SET enable_seqscan=on; SELECT count(*) FROM numerictmp WHERE a < -1890.0; count ------- - 505 + 506 (1 row) SELECT count(*) FROM numerictmp WHERE a <= -1890.0; count ------- - 506 + 507 (1 row) SELECT count(*) FROM numerictmp WHERE a = -1890.0; @@ -25,37 +25,37 @@ SELECT count(*) FROM numerictmp WHERE a = -1890.0; SELECT count(*) FROM numerictmp WHERE a >= -1890.0; count ------- - 597 + 599 (1 row) SELECT count(*) FROM numerictmp WHERE a > -1890.0; count ------- - 596 + 598 (1 row) SELECT count(*) FROM numerictmp WHERE a < 'NaN' ; count ------- - 1100 + 1102 (1 row) SELECT count(*) FROM numerictmp WHERE a <= 'NaN' ; count ------- - 1102 + 1105 (1 row) SELECT count(*) FROM numerictmp WHERE a = 'NaN' ; count ------- - 2 + 3 (1 row) SELECT count(*) FROM numerictmp WHERE a >= 'NaN' ; count ------- - 2 + 3 (1 row) SELECT count(*) FROM numerictmp WHERE a > 'NaN' ; @@ -67,13 +67,13 @@ SELECT count(*) FROM numerictmp WHERE a > 'NaN' ; SELECT count(*) FROM numerictmp WHERE a < 0 ; count ------- - 523 + 524 (1 row) SELECT count(*) FROM numerictmp WHERE a <= 0 ; count ------- - 526 + 527 (1 row) SELECT count(*) FROM numerictmp WHERE a = 0 ; @@ -85,13 +85,13 @@ SELECT count(*) FROM numerictmp WHERE a = 0 ; SELECT count(*) FROM numerictmp WHERE a >= 0 ; count ------- - 579 + 581 (1 row) SELECT count(*) FROM numerictmp WHERE a > 0 ; count ------- - 576 + 578 (1 row) CREATE INDEX numericidx ON numerictmp USING gist ( a ); @@ -99,13 +99,13 @@ SET enable_seqscan=off; SELECT count(*) FROM numerictmp WHERE a < -1890.0; count ------- - 505 + 506 (1 row) SELECT count(*) FROM numerictmp WHERE a <= -1890.0; count ------- - 506 + 507 (1 row) SELECT count(*) FROM numerictmp WHERE a = -1890.0; @@ -117,37 +117,37 @@ SELECT count(*) FROM numerictmp WHERE a = -1890.0; SELECT count(*) FROM numerictmp WHERE a >= -1890.0; count ------- - 597 + 599 (1 row) SELECT count(*) FROM numerictmp WHERE a > -1890.0; count ------- - 596 + 598 (1 row) SELECT count(*) FROM numerictmp WHERE a < 'NaN' ; count ------- - 1100 + 1102 (1 row) SELECT count(*) FROM numerictmp WHERE a <= 'NaN' ; count ------- - 1102 + 1105 (1 row) SELECT count(*) FROM numerictmp WHERE a = 'NaN' ; count ------- - 2 + 3 (1 row) SELECT count(*) FROM numerictmp WHERE a >= 'NaN' ; count ------- - 2 + 3 (1 row) SELECT count(*) FROM numerictmp WHERE a > 'NaN' ; @@ -159,13 +159,13 @@ SELECT count(*) FROM numerictmp WHERE a > 'NaN' ; SELECT count(*) FROM numerictmp WHERE a < 0 ; count ------- - 523 + 524 (1 row) SELECT count(*) FROM numerictmp WHERE a <= 0 ; count ------- - 526 + 527 (1 row) SELECT count(*) FROM numerictmp WHERE a = 0 ; @@ -177,13 +177,13 @@ SELECT count(*) FROM numerictmp WHERE a = 0 ; SELECT count(*) FROM numerictmp WHERE a >= 0 ; count ------- - 579 + 581 (1 row) SELECT count(*) FROM numerictmp WHERE a > 0 ; count ------- - 576 + 578 (1 row) -- Test index-only scans diff --git a/contrib/btree_gist/sql/float4.sql b/contrib/btree_gist/sql/float4.sql index 3da1ce953c8..71de5d5cf49 100644 --- a/contrib/btree_gist/sql/float4.sql +++ b/contrib/btree_gist/sql/float4.sql @@ -35,3 +35,20 @@ SELECT count(*) FROM float4tmp WHERE a > -179.0::float4; EXPLAIN (COSTS OFF) SELECT a, a <-> '-179.0' FROM float4tmp ORDER BY a <-> '-179.0' LIMIT 3; SELECT a, a <-> '-179.0' FROM float4tmp ORDER BY a <-> '-179.0' LIMIT 3; + +-- EXCLUDE constraint must block a duplicate NaN, same as it does for finite +-- values. +CREATE TABLE float4excl (a float4, EXCLUDE USING gist (a WITH =)); +INSERT INTO float4excl VALUES ('NaN'::float4); +INSERT INTO float4excl VALUES ('NaN'::float4); -- expect: violates EXCLUDE +SELECT count(*) FROM float4excl; + +-- Test double-column index +CREATE INDEX float4idx2 ON float4tmp USING gist ( a, abs(a) ); +EXPLAIN (COSTS OFF) +SELECT count(*) FROM float4tmp WHERE abs(a) = 179.0::float4; +SELECT count(*) FROM float4tmp WHERE abs(a) = 179.0::float4; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/contrib/btree_gist/sql/float8.sql b/contrib/btree_gist/sql/float8.sql index e1e819b37f9..a0fc84f94bb 100644 --- a/contrib/btree_gist/sql/float8.sql +++ b/contrib/btree_gist/sql/float8.sql @@ -35,3 +35,20 @@ SELECT count(*) FROM float8tmp WHERE a > -1890.0::float8; EXPLAIN (COSTS OFF) SELECT a, a <-> '-1890.0' FROM float8tmp ORDER BY a <-> '-1890.0' LIMIT 3; SELECT a, a <-> '-1890.0' FROM float8tmp ORDER BY a <-> '-1890.0' LIMIT 3; + +-- EXCLUDE constraint must block a duplicate NaN, same as it does for finite +-- values. +CREATE TABLE float8excl (a float8, EXCLUDE USING gist (a WITH =)); +INSERT INTO float8excl VALUES ('NaN'::float8); +INSERT INTO float8excl VALUES ('NaN'::float8); -- expect: violates EXCLUDE +SELECT count(*) FROM float8excl; + +-- Test double-column index +CREATE INDEX float8idx2 ON float8tmp USING gist ( a, abs(a) ); +EXPLAIN (COSTS OFF) +SELECT count(*) FROM float8tmp WHERE abs(a) = 1890.0::float8; +SELECT count(*) FROM float8tmp WHERE abs(a) = 1890.0::float8; + +RESET enable_seqscan; +RESET enable_indexscan; +RESET enable_bitmapscan; diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index ec0c832e921..62706dae004 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -2010,6 +2010,9 @@ dblink_fdw_validator(PG_FUNCTION_ARGS) closest_match) : 0 : errhint("There are no valid options in this context."))); } + + if (strcmp(def->defname, "use_scram_passthrough") == 0) + (void) defGetBoolean(def); /* accept only boolean values */ } PG_RETURN_VOID(); @@ -3133,8 +3136,15 @@ static bool is_valid_dblink_fdw_option(const PQconninfoOption *options, const char *option, Oid context) { - if (strcmp(option, "use_scram_passthrough") == 0) - return true; + /* + * These options are only valid for foreign server or user mapping + * contexts + */ + if (context == ForeignServerRelationId || context == UserMappingRelationId) + { + if (strcmp(option, "use_scram_passthrough") == 0) + return true; + } return is_valid_dblink_option(options, option, context); } @@ -3248,12 +3258,18 @@ appendSCRAMKeysInfo(StringInfo buf) } +/* + * Return whether SCRAM pass-through is enabled. + * + * If use_scram_passthrough is specified in both the foreign server + * and the user mapping, the user mapping setting takes precedence. + */ static bool UseScramPassthrough(ForeignServer *foreign_server, UserMapping *user) { ListCell *cell; - foreach(cell, foreign_server->options) + foreach(cell, user->options) { DefElem *def = lfirst(cell); @@ -3261,7 +3277,7 @@ UseScramPassthrough(ForeignServer *foreign_server, UserMapping *user) return defGetBoolean(def); } - foreach(cell, user->options) + foreach(cell, foreign_server->options) { DefElem *def = (DefElem *) lfirst(cell); diff --git a/contrib/dblink/expected/dblink.out b/contrib/dblink/expected/dblink.out index c70c79574fd..1d2759def9e 100644 --- a/contrib/dblink/expected/dblink.out +++ b/contrib/dblink/expected/dblink.out @@ -1220,6 +1220,11 @@ SHOW intervalstyle; postgres (1 row) +-- Check that adding use_scram_passthrough option on an foreign data wrapper is +-- not allowed +ALTER FOREIGN DATA WRAPPER dblink_fdw OPTIONS(add use_scram_passthrough 'true'); +ERROR: invalid option "use_scram_passthrough" +HINT: There are no valid options in this context. -- Clean up GUC-setting tests SELECT dblink_disconnect('myconn'); dblink_disconnect diff --git a/contrib/dblink/sql/dblink.sql b/contrib/dblink/sql/dblink.sql index 365b21036e8..d67a0a5992e 100644 --- a/contrib/dblink/sql/dblink.sql +++ b/contrib/dblink/sql/dblink.sql @@ -635,6 +635,10 @@ FROM dblink_fetch('myconn','error_cursor', 1) AS t(i int); SHOW datestyle; SHOW intervalstyle; +-- Check that adding use_scram_passthrough option on an foreign data wrapper is +-- not allowed +ALTER FOREIGN DATA WRAPPER dblink_fdw OPTIONS(add use_scram_passthrough 'true'); + -- Clean up GUC-setting tests SELECT dblink_disconnect('myconn'); RESET datestyle; diff --git a/contrib/dblink/t/001_auth_scram.pl b/contrib/dblink/t/001_auth_scram.pl index ef3dea6c5ad..0a37f2d06f8 100644 --- a/contrib/dblink/t/001_auth_scram.pl +++ b/contrib/dblink/t/001_auth_scram.pl @@ -24,6 +24,7 @@ my $db2 = "db2"; # For node2 my $fdw_server = "db1_fdw"; my $fdw_server2 = "db2_fdw"; +my $fdw_server3 = "db1_fdw_override"; my $fdw_invalid_server = "db2_fdw_invalid"; # For invalid fdw options my $fdw_invalid_server2 = "db2_fdw_invalid2"; # For invalid scram keys fdw options @@ -55,10 +56,12 @@ setup_fdw_server($node1, $db0, $fdw_server2, $node2, $db2); setup_invalid_fdw_server($node1, $db0, $fdw_invalid_server, $node2, $db2); setup_fdw_server($node1, $db0, $fdw_invalid_server2, $node2, $db2); +setup_fdw_server($node1, $db0, $fdw_server3, $node1, $db1); setup_user_mapping($node1, $db0, $fdw_server); setup_user_mapping($node1, $db0, $fdw_server2); setup_user_mapping($node1, $db0, $fdw_invalid_server); +setup_user_mapping($node1, $db0, $fdw_server3); # Make the user have the same SCRAM key on both servers. Forcing to have the # same iteration and salt. @@ -96,6 +99,27 @@ test_fdw_auth_with_invalid_overwritten_require_auth($fdw_invalid_server); +# Test that use_scram_passthrough=false on user mapping overrides server setting +{ + my $connstr = $node1->connstr($db0) . qq' user=$user'; + + $node1->safe_psql($db0, + qq'ALTER USER MAPPING FOR $user SERVER $fdw_server3 OPTIONS(add use_scram_passthrough \'false\')', + connstr => $connstr + ); + + my ($ret, $stdout, $stderr) = $node1->psql( + $db0, + "select * from dblink('$fdw_server3', 'select * from t') as t(a int, b int)", + connstr => $connstr); + + is($ret, 3, 'SCRAM passthrough disabled on user mapping should fail'); + like( + $stderr, + qr/password/i, + 'expected password-related error when scram passthrough disabled on user mapping'); +} + # Ensure that trust connections fail without superuser opt-in. unlink($node1->data_dir . '/pg_hba.conf'); unlink($node2->data_dir . '/pg_hba.conf'); diff --git a/contrib/fuzzystrmatch/expected/fuzzystrmatch.out b/contrib/fuzzystrmatch/expected/fuzzystrmatch.out index 3195e1ec3c8..aeab031a2ed 100644 --- a/contrib/fuzzystrmatch/expected/fuzzystrmatch.out +++ b/contrib/fuzzystrmatch/expected/fuzzystrmatch.out @@ -41,6 +41,14 @@ SELECT levenshtein('GUMBO', 'GAMBOL', 2, 1, 1); 3 (1 row) +SELECT levenshtein('GUMBO', 'GAMBOL', 1, 1, 2000000000); + levenshtein +------------- + 3 +(1 row) + +SELECT levenshtein('GUMBO', 'GAMBOL', 2000000000, 2000000000, 2000000000); +ERROR: levenshtein distance out of range SELECT levenshtein_less_equal('extensive', 'exhaustive', 2); levenshtein_less_equal ------------------------ @@ -53,6 +61,12 @@ SELECT levenshtein_less_equal('extensive', 'exhaustive', 4); 4 (1 row) +SELECT levenshtein_less_equal('aaa', 'aaaaa', 1073741824, 0, 1073741824, 10); + levenshtein_less_equal +------------------------ + 11 +(1 row) + SELECT metaphone('GUMBO', 4); metaphone ----------- diff --git a/contrib/fuzzystrmatch/sql/fuzzystrmatch.sql b/contrib/fuzzystrmatch/sql/fuzzystrmatch.sql index 0b4bb9be57e..c1d55f823d7 100644 --- a/contrib/fuzzystrmatch/sql/fuzzystrmatch.sql +++ b/contrib/fuzzystrmatch/sql/fuzzystrmatch.sql @@ -11,8 +11,11 @@ SELECT soundex(''), difference('', ''); SELECT levenshtein('GUMBO', 'GAMBOL'); SELECT levenshtein('GUMBO', 'GAMBOL', 2, 1, 1); +SELECT levenshtein('GUMBO', 'GAMBOL', 1, 1, 2000000000); +SELECT levenshtein('GUMBO', 'GAMBOL', 2000000000, 2000000000, 2000000000); SELECT levenshtein_less_equal('extensive', 'exhaustive', 2); SELECT levenshtein_less_equal('extensive', 'exhaustive', 4); +SELECT levenshtein_less_equal('aaa', 'aaaaa', 1073741824, 0, 1073741824, 10); SELECT metaphone('GUMBO', 4); diff --git a/contrib/hstore_plperl/hstore_plperl.c b/contrib/hstore_plperl/hstore_plperl.c index 2727a5f2ceb..07eff0e3bd3 100644 --- a/contrib/hstore_plperl/hstore_plperl.c +++ b/contrib/hstore_plperl/hstore_plperl.c @@ -2,6 +2,7 @@ #include "fmgr.h" #include "hstore/hstore.h" +#include "miscadmin.h" #include "plperl.h" PG_MODULE_MAGIC_EXT( @@ -110,7 +111,15 @@ plperl_to_hstore(PG_FUNCTION_ARGS) /* Dereference references recursively. */ while (SvROK(in)) + { + /* + * It's possible for circular references to make this an infinite + * loop. Checking for such a situation seems like much more trouble + * than it's worth, but let's provide a way to break out of the loop. + */ + CHECK_FOR_INTERRUPTS(); in = SvRV(in); + } /* Now we must have a hash. */ if (SvTYPE(in) != SVt_PVHV) @@ -119,8 +128,9 @@ plperl_to_hstore(PG_FUNCTION_ARGS) errmsg("cannot transform non-hash Perl value to hstore"))); hv = (HV *) in; - pcount = hv_iterinit(hv); + (void) hv_iterinit(hv); + pcount = 64; /* arbitrary initial guess */ pairs = palloc_array(Pairs, pcount); i = 0; @@ -129,6 +139,12 @@ plperl_to_hstore(PG_FUNCTION_ARGS) char *key = sv2cstr(HeSVKEY_force(he)); SV *value = HeVAL(he); + if (i >= pcount) + { + pcount *= 2; + pairs = repalloc_array(pairs, Pairs, pcount); + } + pairs[i].key = pstrdup(key); pairs[i].keylen = hstoreCheckKeyLen(strlen(pairs[i].key)); pairs[i].needfree = true; @@ -149,7 +165,7 @@ plperl_to_hstore(PG_FUNCTION_ARGS) i++; } - pcount = hstoreUniquePairs(pairs, pcount, &buflen); + pcount = hstoreUniquePairs(pairs, i, &buflen); out = hstorePairs(pairs, pcount, buflen); PG_RETURN_POINTER(out); } diff --git a/contrib/hstore_plpython/expected/hstore_plpython.out b/contrib/hstore_plpython/expected/hstore_plpython.out index 5fb56a2f65d..5f8315e84dd 100644 --- a/contrib/hstore_plpython/expected/hstore_plpython.out +++ b/contrib/hstore_plpython/expected/hstore_plpython.out @@ -43,6 +43,71 @@ SELECT test1bad(); ERROR: not a Python mapping CONTEXT: while creating return value PL/Python function "test1bad" +-- A mapping whose items() raises should be reported as an error, not crash +-- the backend +CREATE FUNCTION test1broken() RETURNS hstore +LANGUAGE plpython3u +TRANSFORM FOR TYPE hstore +AS $$ +class C(dict): + def items(self): + raise ValueError('items failed') +d = C() +d['x'] = 1 +return d +$$; +SELECT test1broken(); +ERROR: could not get items from Python mapping +CONTEXT: while creating return value +PL/Python function "test1broken" +-- Likewise for a mapping whose items() does not return key/value pairs +CREATE FUNCTION test1malformed() RETURNS hstore +LANGUAGE plpython3u +TRANSFORM FOR TYPE hstore +AS $$ +class C(dict): + def items(self): + return [42] +d = C() +d['x'] = 1 +return d +$$; +SELECT test1malformed(); +ERROR: items() of a Python mapping must return key/value pairs +CONTEXT: while creating return value +PL/Python function "test1malformed" +-- Likewise for a mapping whose items() yields fewer pairs than its length +CREATE FUNCTION test1short() RETURNS hstore +LANGUAGE plpython3u +TRANSFORM FOR TYPE hstore +AS $$ +class C(dict): + def items(self): + return [] +d = C() +d['x'] = 1 +return d +$$; +SELECT test1short(); +ERROR: items() of a Python mapping must return key/value pairs +CONTEXT: while creating return value +PL/Python function "test1short" +-- Likewise for a mapping whose __len__() raises +CREATE FUNCTION test1brokenlen() RETURNS hstore +LANGUAGE plpython3u +TRANSFORM FOR TYPE hstore +AS $$ +class C(dict): + def __len__(self): + raise ValueError('len failed') +d = C() +d['x'] = 1 +return d +$$; +SELECT test1brokenlen(); +ERROR: could not get size of Python mapping +CONTEXT: while creating return value +PL/Python function "test1brokenlen" -- test hstore[] -> python CREATE FUNCTION test1arr(val hstore[]) RETURNS int LANGUAGE plpython3u diff --git a/contrib/hstore_plpython/hstore_plpython.c b/contrib/hstore_plpython/hstore_plpython.c index b0af13945bb..6877cc63ce7 100644 --- a/contrib/hstore_plpython/hstore_plpython.c +++ b/contrib/hstore_plpython/hstore_plpython.c @@ -142,7 +142,16 @@ plpython_to_hstore(PG_FUNCTION_ARGS) errmsg("not a Python mapping"))); pcount = PyMapping_Size(dict); + if (pcount < 0) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("could not get size of Python mapping"))); + items = PyMapping_Items(dict); + if (items == NULL) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("could not get items from Python mapping"))); PG_TRY(); { @@ -159,6 +168,13 @@ plpython_to_hstore(PG_FUNCTION_ARGS) PyObject *value; tuple = PyList_GetItem(items, i); + + /* The mapping's items() must yield key/value pairs */ + if (tuple == NULL || !PyTuple_Check(tuple) || PyTuple_Size(tuple) < 2) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("items() of a Python mapping must return key/value pairs"))); + key = PyTuple_GetItem(tuple, 0); value = PyTuple_GetItem(tuple, 1); diff --git a/contrib/hstore_plpython/sql/hstore_plpython.sql b/contrib/hstore_plpython/sql/hstore_plpython.sql index ebd61e6c467..a2b2046380f 100644 --- a/contrib/hstore_plpython/sql/hstore_plpython.sql +++ b/contrib/hstore_plpython/sql/hstore_plpython.sql @@ -38,6 +38,71 @@ $$; SELECT test1bad(); +-- A mapping whose items() raises should be reported as an error, not crash +-- the backend +CREATE FUNCTION test1broken() RETURNS hstore +LANGUAGE plpython3u +TRANSFORM FOR TYPE hstore +AS $$ +class C(dict): + def items(self): + raise ValueError('items failed') +d = C() +d['x'] = 1 +return d +$$; + +SELECT test1broken(); + + +-- Likewise for a mapping whose items() does not return key/value pairs +CREATE FUNCTION test1malformed() RETURNS hstore +LANGUAGE plpython3u +TRANSFORM FOR TYPE hstore +AS $$ +class C(dict): + def items(self): + return [42] +d = C() +d['x'] = 1 +return d +$$; + +SELECT test1malformed(); + + +-- Likewise for a mapping whose items() yields fewer pairs than its length +CREATE FUNCTION test1short() RETURNS hstore +LANGUAGE plpython3u +TRANSFORM FOR TYPE hstore +AS $$ +class C(dict): + def items(self): + return [] +d = C() +d['x'] = 1 +return d +$$; + +SELECT test1short(); + + +-- Likewise for a mapping whose __len__() raises +CREATE FUNCTION test1brokenlen() RETURNS hstore +LANGUAGE plpython3u +TRANSFORM FOR TYPE hstore +AS $$ +class C(dict): + def __len__(self): + raise ValueError('len failed') +d = C() +d['x'] = 1 +return d +$$; + +SELECT test1brokenlen(); + + -- test hstore[] -> python CREATE FUNCTION test1arr(val hstore[]) RETURNS int LANGUAGE plpython3u diff --git a/contrib/intarray/_int_selfuncs.c b/contrib/intarray/_int_selfuncs.c index 60fd163668f..43f4638a8a6 100644 --- a/contrib/intarray/_int_selfuncs.c +++ b/contrib/intarray/_int_selfuncs.c @@ -151,7 +151,10 @@ _int_matchsel(PG_FUNCTION_ARGS) * query_int. */ if (vardata.vartype != INT4ARRAYOID) + { + ReleaseVariableStats(vardata); PG_RETURN_FLOAT8(DEFAULT_EQ_SEL); + } /* * Can't do anything useful if the something is not a constant, either. diff --git a/contrib/intarray/expected/_int.out b/contrib/intarray/expected/_int.out index d0e68d0447f..fb4086a95ca 100644 --- a/contrib/intarray/expected/_int.out +++ b/contrib/intarray/expected/_int.out @@ -398,6 +398,21 @@ SELECT '1&(2&(4&(5|!6)))'::query_int; 1 & 2 & 4 & ( 5 | !6 ) (1 row) +-- Test for overflow of the int16 "left" field in findoprnd(). +-- This query uses a balanced binary tree to avoid using too much stack. +DO $$ +DECLARE + e text := '1'; +BEGIN + FOR i IN 1..15 LOOP + e := '(' || e || '&' || e || ')'; + END LOOP; + PERFORM ('0|' || e)::query_int; +END; +$$; +ERROR: query_int expression is too complex +CONTEXT: SQL statement "SELECT ('0|' || e)::query_int" +PL/pgSQL function inline_code_block line 8 at PERFORM -- test non-error-throwing input SELECT str as "query_int", pg_input_is_valid(str,'query_int') as ok, diff --git a/contrib/intarray/sql/_int.sql b/contrib/intarray/sql/_int.sql index 5668ab40704..0d30914725e 100644 --- a/contrib/intarray/sql/_int.sql +++ b/contrib/intarray/sql/_int.sql @@ -75,6 +75,19 @@ SELECT '1&2&4&5&6'::query_int; SELECT '1&(2&(4&(5|6)))'::query_int; SELECT '1&(2&(4&(5|!6)))'::query_int; +-- Test for overflow of the int16 "left" field in findoprnd(). +-- This query uses a balanced binary tree to avoid using too much stack. +DO $$ +DECLARE + e text := '1'; +BEGIN + FOR i IN 1..15 LOOP + e := '(' || e || '&' || e || ')'; + END LOOP; + PERFORM ('0|' || e)::query_int; +END; +$$; + -- test non-error-throwing input SELECT str as "query_int", diff --git a/contrib/jsonb_plperl/jsonb_plperl.c b/contrib/jsonb_plperl/jsonb_plperl.c index c02e2d41af1..7375a66a6ab 100644 --- a/contrib/jsonb_plperl/jsonb_plperl.c +++ b/contrib/jsonb_plperl/jsonb_plperl.c @@ -3,6 +3,7 @@ #include #include "fmgr.h" +#include "miscadmin.h" #include "plperl.h" #include "utils/fmgrprotos.h" #include "utils/jsonb.h" @@ -66,6 +67,9 @@ Jsonb_to_SV(JsonbContainer *jsonb) JsonbIterator *it; JsonbIteratorToken r; + /* this can recurse via JsonbValue_to_SV() */ + check_stack_depth(); + it = JsonbIteratorInit(jsonb); r = JsonbIteratorNext(&it, &v, true); @@ -179,9 +183,20 @@ SV_to_JsonbValue(SV *in, JsonbParseState **jsonb_state, bool is_elem) dTHX; JsonbValue out; /* result */ + /* this can recurse via AV_to_JsonbValue() or HV_to_JsonbValue() */ + check_stack_depth(); + /* Dereference references recursively. */ while (SvROK(in)) + { + /* + * It's possible for circular references to make this an infinite + * loop. Checking for such a situation seems like much more trouble + * than it's worth, but let's provide a way to break out of the loop. + */ + CHECK_FOR_INTERRUPTS(); in = SvRV(in); + } switch (SvTYPE(in)) { diff --git a/contrib/jsonb_plpython/expected/jsonb_plpython.out b/contrib/jsonb_plpython/expected/jsonb_plpython.out index cac963de69c..8d3f5328809 100644 --- a/contrib/jsonb_plpython/expected/jsonb_plpython.out +++ b/contrib/jsonb_plpython/expected/jsonb_plpython.out @@ -304,3 +304,92 @@ SELECT test_dict1(); {"": 2, "a": 1, "33": 3} (1 row) +-- A custom sequence whose __getitem__ raises should be reported as an error, +-- not crash the backend +CREATE FUNCTION test_broken_sequence() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C: + def __len__(self): + return 2 + def __getitem__(self, i): + raise ValueError('getitem failed') +return C() +$$; +SELECT test_broken_sequence(); +ERROR: could not get element 0 from sequence +DETAIL: ValueError: getitem failed +CONTEXT: Traceback (most recent call last): +while creating return value +PL/Python function "test_broken_sequence" +-- A mapping whose items() raises should be reported as an error, not crash +-- the backend +CREATE FUNCTION test_broken_mapping() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C(dict): + def items(self): + raise ValueError('items failed') +d = C() +d['x'] = 1 +return d +$$; +SELECT test_broken_mapping(); +ERROR: could not get items from Python mapping +DETAIL: ValueError: items failed +CONTEXT: Traceback (most recent call last): +while creating return value +PL/Python function "test_broken_mapping" +-- Likewise for a mapping whose items() does not return key/value pairs +CREATE FUNCTION test_malformed_mapping() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C(dict): + def items(self): + return [42] +d = C() +d['x'] = 1 +return d +$$; +SELECT test_malformed_mapping(); +ERROR: items() of a Python mapping must return key/value pairs +CONTEXT: while creating return value +PL/Python function "test_malformed_mapping" +-- Likewise for a mapping whose items() yields fewer pairs than its length +CREATE FUNCTION test_short_mapping() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C(dict): + def items(self): + return [] +d = C() +d['x'] = 1 +return d +$$; +SELECT test_short_mapping(); +ERROR: items() of a Python mapping must return key/value pairs +DETAIL: IndexError: list index out of range +CONTEXT: while creating return value +PL/Python function "test_short_mapping" +-- Likewise for a mapping whose __len__() raises +CREATE FUNCTION test_broken_len_mapping() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C(dict): + def __len__(self): + raise ValueError('len failed') +d = C() +d['x'] = 1 +return d +$$; +SELECT test_broken_len_mapping(); +ERROR: could not get size of Python mapping +DETAIL: ValueError: len failed +CONTEXT: Traceback (most recent call last): +while creating return value +PL/Python function "test_broken_len_mapping" diff --git a/contrib/jsonb_plpython/jsonb_plpython.c b/contrib/jsonb_plpython/jsonb_plpython.c index 9383615abbf..657e686ba8f 100644 --- a/contrib/jsonb_plpython/jsonb_plpython.c +++ b/contrib/jsonb_plpython/jsonb_plpython.c @@ -1,5 +1,6 @@ #include "postgres.h" +#include "miscadmin.h" #include "plpy_elog.h" #include "plpy_typeio.h" #include "plpy_util.h" @@ -141,6 +142,9 @@ PLyObject_FromJsonbContainer(JsonbContainer *jsonb) JsonbIterator *it; PyObject *result; + /* this can recurse via PLyObject_FromJsonbValue() */ + check_stack_depth(); + it = JsonbIteratorInit(jsonb); r = JsonbIteratorNext(&it, &v, true); @@ -269,7 +273,12 @@ PLyMapping_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state) JsonbValue *volatile out; pcount = PyMapping_Size(obj); + if (pcount < 0) + PLy_elog(ERROR, "could not get size of Python mapping"); + items = PyMapping_Items(obj); + if (items == NULL) + PLy_elog(ERROR, "could not get items from Python mapping"); PG_TRY(); { @@ -281,8 +290,15 @@ PLyMapping_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state) { JsonbValue jbvKey; PyObject *item = PyList_GetItem(items, i); - PyObject *key = PyTuple_GetItem(item, 0); - PyObject *value = PyTuple_GetItem(item, 1); + PyObject *key; + PyObject *value; + + /* The mapping's items() must yield key/value pairs */ + if (item == NULL || !PyTuple_Check(item) || PyTuple_Size(item) < 2) + PLy_elog(ERROR, "items() of a Python mapping must return key/value pairs"); + + key = PyTuple_GetItem(item, 0); + value = PyTuple_GetItem(item, 1); /* Python dictionary can have None as key */ if (key == Py_None) @@ -334,7 +350,10 @@ PLySequence_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state) for (i = 0; i < pcount; i++) { value = PySequence_GetItem(obj, i); - Assert(value); + + /* PySequence_GetItem() can return NULL, with an exception set */ + if (value == NULL) + PLy_elog(ERROR, "could not get element %d from sequence", (int) i); (void) PLyObject_ToJsonbValue(value, jsonb_state, true); Py_XDECREF(value); @@ -411,6 +430,9 @@ PLyObject_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state, bool is_ele { JsonbValue *out; + /* this can recurse via PLyMapping_ToJsonbValue() */ + check_stack_depth(); + if (!PyUnicode_Check(obj)) { if (PySequence_Check(obj)) diff --git a/contrib/jsonb_plpython/sql/jsonb_plpython.sql b/contrib/jsonb_plpython/sql/jsonb_plpython.sql index 29dc33279a0..fd8485c89c1 100644 --- a/contrib/jsonb_plpython/sql/jsonb_plpython.sql +++ b/contrib/jsonb_plpython/sql/jsonb_plpython.sql @@ -181,3 +181,80 @@ return x $$; SELECT test_dict1(); + +-- A custom sequence whose __getitem__ raises should be reported as an error, +-- not crash the backend +CREATE FUNCTION test_broken_sequence() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C: + def __len__(self): + return 2 + def __getitem__(self, i): + raise ValueError('getitem failed') +return C() +$$; + +SELECT test_broken_sequence(); + +-- A mapping whose items() raises should be reported as an error, not crash +-- the backend +CREATE FUNCTION test_broken_mapping() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C(dict): + def items(self): + raise ValueError('items failed') +d = C() +d['x'] = 1 +return d +$$; + +SELECT test_broken_mapping(); + +-- Likewise for a mapping whose items() does not return key/value pairs +CREATE FUNCTION test_malformed_mapping() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C(dict): + def items(self): + return [42] +d = C() +d['x'] = 1 +return d +$$; + +SELECT test_malformed_mapping(); + +-- Likewise for a mapping whose items() yields fewer pairs than its length +CREATE FUNCTION test_short_mapping() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C(dict): + def items(self): + return [] +d = C() +d['x'] = 1 +return d +$$; + +SELECT test_short_mapping(); + +-- Likewise for a mapping whose __len__() raises +CREATE FUNCTION test_broken_len_mapping() RETURNS jsonb +LANGUAGE plpython3u +TRANSFORM FOR TYPE jsonb +AS $$ +class C(dict): + def __len__(self): + raise ValueError('len failed') +d = C() +d['x'] = 1 +return d +$$; + +SELECT test_broken_len_mapping(); diff --git a/contrib/ltree/expected/ltree.out b/contrib/ltree/expected/ltree.out index c8eac3f6b21..d4a89f28ce1 100644 --- a/contrib/ltree/expected/ltree.out +++ b/contrib/ltree/expected/ltree.out @@ -1281,6 +1281,21 @@ SELECT 'tree.awdfg_qwerty'::ltree @ 'tree & aw_rw%*'::ltxtquery; f (1 row) +-- Test for overflow of the int16 "left" field in findoprnd(). +-- This query uses a balanced binary tree to avoid using too much stack. +DO $$ +DECLARE + e text := 'a'; +BEGIN + FOR i IN 1..14 LOOP + e := '(' || e || '&' || e || ')'; + END LOOP; + PERFORM ('b|' || e)::ltxtquery; +END; +$$; +ERROR: ltxtquery is too large +CONTEXT: SQL statement "SELECT ('b|' || e)::ltxtquery" +PL/pgSQL function inline_code_block line 8 at PERFORM --arrays SELECT '{1.2.3}'::ltree[] @> '1.2.3.4'; ?column? @@ -8200,3 +8215,22 @@ FROM (VALUES ('.2.3', 'ltree'), !tree & aWdf@* | ltxtquery | t | | | | (8 rows) +-- Test for overflow of lquery_level.totallen. +SELECT (repeat('x', 255) || repeat('|' || repeat('x', 255), 256))::lquery; +ERROR: lquery level is too large +DETAIL: Total size of level exceeds the maximum allowed (65535 bytes). +--- Test for overflow of lquery_level.numvar, with a set of single-char +--- variants in one level. +SELECT (repeat('a|', 65535) || 'a')::lquery; +ERROR: lquery level has too many variants +DETAIL: Number of variants exceeds the maximum allowed (65535). +-- Test that ltree_compare() does not overflow with very deep paths. +WITH s AS (SELECT 'a'::ltree AS v), + l AS (SELECT (repeat('a.', 14999) || 'a')::ltree AS v) +SELECT (l.v > s.v) AS gt_ok, (l.v < s.v) AS lt_ok, (l.v = s.v) AS eq_ok + FROM s, l; + gt_ok | lt_ok | eq_ok +-------+-------+------- + t | f | f +(1 row) + diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h index 226c1cb2115..89c5b932292 100644 --- a/contrib/ltree/ltree.h +++ b/contrib/ltree/ltree.h @@ -206,6 +206,7 @@ bool ltree_execute(ITEM *curitem, void *checkval, bool calcnot, bool (*chkcond) (void *checkval, ITEM *val)); int ltree_compare(const ltree *a, const ltree *b); +float ltree_compare_distance(const ltree *a, const ltree *b); bool inner_isparent(const ltree *c, const ltree *p); bool compare_subnode(ltree_level *t, char *qn, int len, bool prefix, bool ci); ltree *lca_inner(ltree **a, int len); diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c index 932f69bff2d..3e48aa382e2 100644 --- a/contrib/ltree/ltree_gist.c +++ b/contrib/ltree/ltree_gist.c @@ -264,11 +264,11 @@ ltree_penalty(PG_FUNCTION_ARGS) ltree_gist *newval = (ltree_gist *) DatumGetPointer(((GISTENTRY *) PG_GETARG_POINTER(1))->key); float *penalty = (float *) PG_GETARG_POINTER(2); int siglen = LTREE_GET_SIGLEN(); - int32 cmpr, + float cmpr, cmpl; - cmpl = ltree_compare(LTG_GETLNODE(origval, siglen), LTG_GETLNODE(newval, siglen)); - cmpr = ltree_compare(LTG_GETRNODE(newval, siglen), LTG_GETRNODE(origval, siglen)); + cmpl = ltree_compare_distance(LTG_GETLNODE(origval, siglen), LTG_GETLNODE(newval, siglen)); + cmpr = ltree_compare_distance(LTG_GETRNODE(newval, siglen), LTG_GETRNODE(origval, siglen)); *penalty = Max(cmpl, 0) + Max(cmpr, 0); diff --git a/contrib/ltree/ltree_op.c b/contrib/ltree/ltree_op.c index ce9f4caad4f..18368c4bc7d 100644 --- a/contrib/ltree/ltree_op.c +++ b/contrib/ltree/ltree_op.c @@ -42,6 +42,9 @@ PG_FUNCTION_INFO_V1(ltree2text); PG_FUNCTION_INFO_V1(text2ltree); PG_FUNCTION_INFO_V1(ltreeparentsel); +/* + * btree-comparison function. + */ int ltree_compare(const ltree *a, const ltree *b) { @@ -54,18 +57,52 @@ ltree_compare(const ltree *a, const ltree *b) { int res; - if ((res = memcmp(al->name, bl->name, Min(al->len, bl->len))) == 0) + res = memcmp(al->name, bl->name, Min(al->len, bl->len)); + if (res == 0) + { + if (al->len != bl->len) + return (int) al->len - (int) bl->len; + } + else + return res; + + an--; + bn--; + al = LEVEL_NEXT(al); + bl = LEVEL_NEXT(bl); + } + + return a->numlevel - b->numlevel; +} + +/* + * Returns a "distance" between a and b. If a < b, the distance is negative, + * consistent with the ltree_compare() ordering. + */ +float +ltree_compare_distance(const ltree *a, const ltree *b) +{ + ltree_level *al = LTREE_FIRST(a); + ltree_level *bl = LTREE_FIRST(b); + int an = a->numlevel; + int bn = b->numlevel; + + while (an > 0 && bn > 0) + { + int res; + + res = memcmp(al->name, bl->name, Min(al->len, bl->len)); + if (res == 0) { if (al->len != bl->len) - return (al->len - bl->len) * 10 * (an + 1); + return (float) (al->len - bl->len) * 10.0 * (an + 1); } else { if (res < 0) - res = -1; + return -1.0 * 10.0 * (an + 1); else - res = 1; - return res * 10 * (an + 1); + return 1.0 * 10.0 * (an + 1); } an--; @@ -74,7 +111,7 @@ ltree_compare(const ltree *a, const ltree *b) bl = LEVEL_NEXT(bl); } - return (a->numlevel - b->numlevel) * 10 * (an + 1); + return ((float) (a->numlevel - b->numlevel)) * 10.0 * (an + 1); } #define RUNCMP \ diff --git a/contrib/ltree/sql/ltree.sql b/contrib/ltree/sql/ltree.sql index dd705d9d7ca..bad5647fb42 100644 --- a/contrib/ltree/sql/ltree.sql +++ b/contrib/ltree/sql/ltree.sql @@ -252,6 +252,19 @@ SELECT 'tree.awdfg'::ltree @ 'tree & aWdfg@'::ltxtquery; SELECT 'tree.awdfg_qwerty'::ltree @ 'tree & aw_qw%*'::ltxtquery; SELECT 'tree.awdfg_qwerty'::ltree @ 'tree & aw_rw%*'::ltxtquery; +-- Test for overflow of the int16 "left" field in findoprnd(). +-- This query uses a balanced binary tree to avoid using too much stack. +DO $$ +DECLARE + e text := 'a'; +BEGIN + FOR i IN 1..14 LOOP + e := '(' || e || '&' || e || ')'; + END LOOP; + PERFORM ('b|' || e)::ltxtquery; +END; +$$; + --arrays SELECT '{1.2.3}'::ltree[] @> '1.2.3.4'; @@ -456,3 +469,16 @@ FROM (VALUES ('.2.3', 'ltree'), ('!tree & aWdf@*','ltxtquery')) AS a(str,typ), LATERAL pg_input_error_info(a.str, a.typ) as errinfo; + +-- Test for overflow of lquery_level.totallen. +SELECT (repeat('x', 255) || repeat('|' || repeat('x', 255), 256))::lquery; + +--- Test for overflow of lquery_level.numvar, with a set of single-char +--- variants in one level. +SELECT (repeat('a|', 65535) || 'a')::lquery; + +-- Test that ltree_compare() does not overflow with very deep paths. +WITH s AS (SELECT 'a'::ltree AS v), + l AS (SELECT (repeat('a.', 14999) || 'a')::ltree AS v) +SELECT (l.v > s.v) AS gt_ok, (l.v < s.v) AS lt_ok, (l.v = s.v) AS eq_ok + FROM s, l; diff --git a/contrib/pg_prewarm/autoprewarm.c b/contrib/pg_prewarm/autoprewarm.c index c01b9c7e6a4..b5ac0e9ceb8 100644 --- a/contrib/pg_prewarm/autoprewarm.c +++ b/contrib/pg_prewarm/autoprewarm.c @@ -573,16 +573,23 @@ autoprewarm_database_main(Datum main_arg) * move on. */ while (i < apw_state->prewarm_stop_idx && - blk.tablespace == tablespace && - blk.filenumber == filenumber && have_free_buffer()) { - ForkNumber forknum = blk.forknum; + ForkNumber forknum; BlockNumber nblocks; struct AutoPrewarmReadStreamData p; ReadStream *stream; Buffer buf; + blk = block_info[i]; + + /* Stop when we reach a different relation. */ + if (blk.tablespace != tablespace || + blk.filenumber != filenumber) + break; + + forknum = blk.forknum; + /* * smgrexists is not safe for illegal forknum, hence check whether * the passed forknum is valid before using it in smgrexists. @@ -644,9 +651,12 @@ autoprewarm_database_main(Datum main_arg) read_stream_end(stream); - /* Advance i past all the blocks just prewarmed. */ + /* + * Advance i past all the blocks just prewarmed. Note that the + * callback might have advanced the index beyond the last valid + * block, so don't access block_info[i] yet. + */ i = p.pos; - blk = block_info[i]; } relation_close(rel, AccessShareLock); diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 1c07acf231e..44ada5a0acf 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -2812,33 +2812,27 @@ static char * generate_normalized_query(JumbleState *jstate, const char *query, int query_loc, int *query_len_p) { - char *norm_query; + StringInfoData norm_query; int query_len = *query_len_p; - int norm_query_buflen, /* Space allowed for norm_query */ - len_to_wrt, /* Length (in bytes) to write */ + int len_to_wrt, /* Length (in bytes) to write */ quer_loc = 0, /* Source query byte location */ - n_quer_loc = 0, /* Normalized query byte location */ last_off = 0, /* Offset from start for previous tok */ last_tok_len = 0; /* Length (in bytes) of that tok */ int num_constants_replaced = 0; /* - * Get constants' lengths (core system only gives us locations). Note - * this also ensures the items are sorted by location. + * Our output buffer is an expansible StringInfo, but avoid enlarging it + * in most cases by reserving extra space for each constant location. */ - fill_in_constant_lengths(jstate, query, query_loc); + Assert(jstate->clocations_count > 0); + initStringInfoExt(&norm_query, query_len + jstate->clocations_count * 10); /* - * Allow for $n symbols to be longer than the constants they replace. - * Constants must take at least one byte in text form, while a $n symbol - * certainly isn't more than 11 bytes, even if n reaches INT_MAX. We - * could refine that limit based on the max value of n for the current - * query, but it hardly seems worth any extra effort to do so. + * Determine constants' lengths (core system only gives us locations), and + * return a sorted copy of jstate's LocationLen data with lengths filled + * in. */ - norm_query_buflen = query_len + jstate->clocations_count * 10; - - /* Allocate result buffer */ - norm_query = palloc(norm_query_buflen + 1); + fill_in_constant_lengths(jstate, query, query_loc); for (int i = 0; i < jstate->clocations_count; i++) { @@ -2869,17 +2863,16 @@ generate_normalized_query(JumbleState *jstate, const char *query, len_to_wrt = off - last_off; len_to_wrt -= last_tok_len; Assert(len_to_wrt >= 0); - memcpy(norm_query + n_quer_loc, query + quer_loc, len_to_wrt); - n_quer_loc += len_to_wrt; + appendBinaryStringInfo(&norm_query, query + quer_loc, len_to_wrt); /* * And insert a param symbol in place of the constant token; and, if * we have a squashable list, insert a placeholder comment starting * from the list's second value. */ - n_quer_loc += sprintf(norm_query + n_quer_loc, "$%d%s", - num_constants_replaced + 1 + jstate->highest_extern_param_id, - jstate->clocations[i].squashed ? " /*, ... */" : ""); + appendStringInfo(&norm_query, "$%d%s", + num_constants_replaced + 1 + jstate->highest_extern_param_id, + jstate->clocations[i].squashed ? " /*, ... */" : ""); num_constants_replaced++; /* move forward */ @@ -2895,14 +2888,10 @@ generate_normalized_query(JumbleState *jstate, const char *query, len_to_wrt = query_len - quer_loc; Assert(len_to_wrt >= 0); - memcpy(norm_query + n_quer_loc, query + quer_loc, len_to_wrt); - n_quer_loc += len_to_wrt; - - Assert(n_quer_loc <= norm_query_buflen); - norm_query[n_quer_loc] = '\0'; + appendBinaryStringInfo(&norm_query, query + quer_loc, len_to_wrt); - *query_len_p = n_quer_loc; - return norm_query; + *query_len_p = norm_query.len; + return norm_query.data; } /* diff --git a/contrib/pg_surgery/expected/heap_surgery.out b/contrib/pg_surgery/expected/heap_surgery.out index df7d13b0908..42586137d88 100644 --- a/contrib/pg_surgery/expected/heap_surgery.out +++ b/contrib/pg_surgery/expected/heap_surgery.out @@ -134,6 +134,23 @@ select heap_force_kill('htab2'::regclass, ARRAY['(0, 3)']::tid[]); (1 row) +-- a tid[] larger than 65535 entries must still finish +create temp table htab3(a int); +insert into htab3 values (1); +select heap_force_kill( + 'htab3'::regclass, + array(select '(0,1)'::tid from generate_series(1, 65536))); + heap_force_kill +----------------- + +(1 row) + +select count(*) from htab3; + count +------- + 0 +(1 row) + -- materialized view. -- note that we don't commit the transaction, so autovacuum can't interfere. begin; diff --git a/contrib/pg_surgery/heap_surgery.c b/contrib/pg_surgery/heap_surgery.c index 3e86283beb7..337fe92e615 100644 --- a/contrib/pg_surgery/heap_surgery.c +++ b/contrib/pg_surgery/heap_surgery.c @@ -17,6 +17,7 @@ #include "access/visibilitymap.h" #include "access/xloginsert.h" #include "catalog/pg_am_d.h" +#include "catalog/pg_control.h" #include "miscadmin.h" #include "storage/bufmgr.h" #include "utils/acl.h" @@ -43,7 +44,7 @@ static Datum heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt); static void sanity_check_tid_array(ArrayType *ta, int *ntids); static BlockNumber find_tids_one_page(ItemPointer tids, int ntids, - OffsetNumber *next_start_ptr); + int *next_start_ptr); /*------------------------------------------------------------------------- * heap_force_kill() @@ -90,7 +91,7 @@ heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt) int ntids, nblocks; Relation rel; - OffsetNumber curr_start_ptr, + int curr_start_ptr, next_start_ptr; bool include_this_tid[MaxHeapTuplesPerPage]; @@ -146,6 +147,7 @@ heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt) { Buffer buf; Buffer vmbuf = InvalidBuffer; + bool unlock_vmbuf = false; Page page; BlockNumber blkno; OffsetNumber curoff; @@ -228,16 +230,20 @@ heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt) } /* Mark it for processing. */ - Assert(offno < MaxHeapTuplesPerPage); - include_this_tid[offno] = true; + Assert(offno <= MaxHeapTuplesPerPage); + include_this_tid[offno - 1] = true; } /* - * Before entering the critical section, pin the visibility map page - * if it appears to be necessary. + * Before entering the critical section, pin and lock the visibility + * map page if it appears to be necessary. */ if (heap_force_opt == HEAP_FORCE_KILL && PageIsAllVisible(page)) + { visibilitymap_pin(rel, blkno, &vmbuf); + LockBuffer(vmbuf, BUFFER_LOCK_EXCLUSIVE); + unlock_vmbuf = true; + } /* No ereport(ERROR) from here until all the changes are logged. */ START_CRIT_SECTION(); @@ -247,7 +253,7 @@ heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt) { ItemId itemid; - if (!include_this_tid[curoff]) + if (!include_this_tid[curoff - 1]) continue; itemid = PageGetItemId(page, curoff); @@ -266,10 +272,11 @@ heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt) */ if (PageIsAllVisible(page)) { + if (visibilitymap_clear_locked(rel, blkno, vmbuf, + VISIBILITYMAP_VALID_BITS)) + did_modify_vm = true; + PageClearAllVisible(page); - visibilitymap_clear(rel, blkno, vmbuf, - VISIBILITYMAP_VALID_BITS); - did_modify_vm = true; } } else @@ -320,18 +327,29 @@ heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt) /* XLOG stuff */ if (RelationNeedsWAL(rel)) - log_newpage_buffer(buf, true); + { + XLogRecPtr recptr; + + XLogBeginInsert(); + XLogRegisterBuffer(0, buf, REGBUF_STANDARD | REGBUF_FORCE_IMAGE); + /* Include the VM page if it was modified. */ + if (did_modify_vm) + XLogRegisterBuffer(1, vmbuf, REGBUF_FORCE_IMAGE); + recptr = XLogInsert(RM_XLOG_ID, XLOG_FPI); + if (did_modify_vm) + PageSetLSN(BufferGetPage(vmbuf), recptr); + PageSetLSN(BufferGetPage(buf), recptr); + } } - /* WAL log the VM page if it was modified. */ - if (did_modify_vm && RelationNeedsWAL(rel)) - log_newpage_buffer(vmbuf, false); - END_CRIT_SECTION(); UnlockReleaseBuffer(buf); - if (vmbuf != InvalidBuffer) + if (unlock_vmbuf) + LockBuffer(vmbuf, BUFFER_LOCK_UNLOCK); + + if (BufferIsValid(vmbuf)) ReleaseBuffer(vmbuf); /* Update the current_start_ptr before moving to the next page. */ @@ -395,7 +413,7 @@ sanity_check_tid_array(ArrayType *ta, int *ntids) * ------------------------------------------------------------------------ */ static BlockNumber -find_tids_one_page(ItemPointer tids, int ntids, OffsetNumber *next_start_ptr) +find_tids_one_page(ItemPointer tids, int ntids, int *next_start_ptr) { int i; BlockNumber prev_blkno, diff --git a/contrib/pg_surgery/sql/heap_surgery.sql b/contrib/pg_surgery/sql/heap_surgery.sql index 6526b27535d..c4e933da13a 100644 --- a/contrib/pg_surgery/sql/heap_surgery.sql +++ b/contrib/pg_surgery/sql/heap_surgery.sql @@ -65,6 +65,14 @@ select heap_force_kill('htab2'::regclass, ARRAY[NULL]::tid[]); -- but we should be able to kill the one tuple we have select heap_force_kill('htab2'::regclass, ARRAY['(0, 3)']::tid[]); +-- a tid[] larger than 65535 entries must still finish +create temp table htab3(a int); +insert into htab3 values (1); +select heap_force_kill( + 'htab3'::regclass, + array(select '(0,1)'::tid from generate_series(1, 65536))); +select count(*) from htab3; + -- materialized view. -- note that we don't commit the transaction, so autovacuum can't interfere. begin; diff --git a/contrib/pg_trgm/trgm_gist.c b/contrib/pg_trgm/trgm_gist.c index 43afd11fa67..0b5b349bbe9 100644 --- a/contrib/pg_trgm/trgm_gist.c +++ b/contrib/pg_trgm/trgm_gist.c @@ -900,7 +900,7 @@ gtrgm_picksplit(PG_FUNCTION_ARGS) else size_alpha = SIGLENBIT(siglen) - sizebitvec((cache[j].allistrue) ? GETSIGN(datum_l) : - GETSIGN(cache[j].sign), + cache[j].sign, siglen); } else @@ -913,7 +913,7 @@ gtrgm_picksplit(PG_FUNCTION_ARGS) else size_beta = SIGLENBIT(siglen) - sizebitvec((cache[j].allistrue) ? GETSIGN(datum_r) : - GETSIGN(cache[j].sign), + cache[j].sign, siglen); } else diff --git a/contrib/pgcrypto/expected/pgp-decrypt.out b/contrib/pgcrypto/expected/pgp-decrypt.out index 8ce6466f2e9..cd62d52242b 100644 --- a/contrib/pgcrypto/expected/pgp-decrypt.out +++ b/contrib/pgcrypto/expected/pgp-decrypt.out @@ -439,3 +439,29 @@ UCAAw2JRIISttRHMfDpDuZJpvYo= '), 'key', 'debug=1'); NOTICE: dbg: parse_compressed_data: bzip2 unsupported ERROR: Unsupported compression algorithm +-- Check ignore-cipher-failure. This message isn't actually encrypted; it was +-- created with cipher-algo=bf using an OpenSSL that didn't actually support +-- Blowfish. After the fix for CVE-2026-14663, we no longer create these broken +-- ciphertexts, but we allow users to return to the previous behavior during +-- decryption so that the bad wrapper can be stripped. +-- +-- Note that if Blowfish is supported by the linked OpenSSL, both decryptions +-- will fail. +select pgp_sym_decrypt(dearmor(' +-----BEGIN PGP MESSAGE----- + +ww0EBAMC8wIKbtvzJtxi0jABUleCwFJWGCkYKcsNdABqdtXaU2VjcmV0LtMUlnPH3A2QBmZrcucm +1GPb/s2Bkdg= +=6aqD +-----END PGP MESSAGE----- +'), 'wrong key'); +ERROR: Wrong key or corrupt data +select pgp_sym_decrypt(dearmor(' +-----BEGIN PGP MESSAGE----- + +ww0EBAMC8wIKbtvzJtxi0jABUleCwFJWGCkYKcsNdABqdtXaU2VjcmV0LtMUlnPH3A2QBmZrcucm +1GPb/s2Bkdg= +=6aqD +-----END PGP MESSAGE----- +'), 'wrong key', 'ignore-cipher-failure=1'); +ERROR: Wrong key or corrupt data diff --git a/contrib/pgcrypto/expected/pgp-decrypt_1.out b/contrib/pgcrypto/expected/pgp-decrypt_1.out index ee57ad43cb7..df4d28872b5 100644 --- a/contrib/pgcrypto/expected/pgp-decrypt_1.out +++ b/contrib/pgcrypto/expected/pgp-decrypt_1.out @@ -11,7 +11,7 @@ yA6Ce1QTMK3KdL2MPfamsTUSAML8huCJMwYQFfE= =JcP+ -----END PGP MESSAGE----- '), 'foobar'); -ERROR: Wrong key or corrupt data +ERROR: encrypt error: Cipher cannot be initialized select pgp_sym_decrypt(dearmor(' -----BEGIN PGP MESSAGE----- Comment: dat1.aes.sha1.mdc.s2k3.z0 @@ -435,3 +435,33 @@ UCAAw2JRIISttRHMfDpDuZJpvYo= '), 'key', 'debug=1'); NOTICE: dbg: parse_compressed_data: bzip2 unsupported ERROR: Unsupported compression algorithm +-- Check ignore-cipher-failure. This message isn't actually encrypted; it was +-- created with cipher-algo=bf using an OpenSSL that didn't actually support +-- Blowfish. After the fix for CVE-2026-14663, we no longer create these broken +-- ciphertexts, but we allow users to return to the previous behavior during +-- decryption so that the bad wrapper can be stripped. +-- +-- Note that if Blowfish is supported by the linked OpenSSL, both decryptions +-- will fail. +select pgp_sym_decrypt(dearmor(' +-----BEGIN PGP MESSAGE----- + +ww0EBAMC8wIKbtvzJtxi0jABUleCwFJWGCkYKcsNdABqdtXaU2VjcmV0LtMUlnPH3A2QBmZrcucm +1GPb/s2Bkdg= +=6aqD +-----END PGP MESSAGE----- +'), 'wrong key'); +ERROR: encrypt error: Cipher cannot be initialized +select pgp_sym_decrypt(dearmor(' +-----BEGIN PGP MESSAGE----- + +ww0EBAMC8wIKbtvzJtxi0jABUleCwFJWGCkYKcsNdABqdtXaU2VjcmV0LtMUlnPH3A2QBmZrcucm +1GPb/s2Bkdg= +=6aqD +-----END PGP MESSAGE----- +'), 'wrong key', 'ignore-cipher-failure=1'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + diff --git a/contrib/pgcrypto/expected/pgp-encrypt_1.out b/contrib/pgcrypto/expected/pgp-encrypt_1.out new file mode 100644 index 00000000000..36b1052809c --- /dev/null +++ b/contrib/pgcrypto/expected/pgp-encrypt_1.out @@ -0,0 +1,192 @@ +-- +-- PGP encrypt +-- +select pgp_sym_decrypt(pgp_sym_encrypt('Secret.', 'key'), 'key'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- check whether the defaults are ok +select pgp_sym_decrypt(pgp_sym_encrypt('Secret.', 'key'), + 'key', 'expect-cipher-algo=aes128, + expect-disable-mdc=0, + expect-sess-key=0, + expect-s2k-mode=3, + expect-s2k-digest-algo=sha1, + expect-compress-algo=0 + '); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- maybe the expect- stuff simply does not work +select pgp_sym_decrypt(pgp_sym_encrypt('Secret.', 'key'), + 'key', 'expect-cipher-algo=bf, + expect-disable-mdc=1, + expect-sess-key=1, + expect-s2k-mode=0, + expect-s2k-digest-algo=md5, + expect-compress-algo=1 + '); +NOTICE: pgp_decrypt: unexpected cipher_algo: expected 4 got 7 +NOTICE: pgp_decrypt: unexpected s2k_mode: expected 0 got 3 +NOTICE: pgp_decrypt: unexpected s2k_digest_algo: expected 1 got 2 +NOTICE: pgp_decrypt: unexpected use_sess_key: expected 1 got 0 +NOTICE: pgp_decrypt: unexpected disable_mdc: expected 1 got 0 +NOTICE: pgp_decrypt: unexpected compress_algo: expected 1 got 0 + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- bytea as text +select pgp_sym_decrypt(pgp_sym_encrypt_bytea('Binary', 'baz'), 'baz'); +ERROR: Not text data +-- text as bytea +select encode(pgp_sym_decrypt_bytea(pgp_sym_encrypt('Text', 'baz'), 'baz'), 'escape'); + encode +-------- + Text +(1 row) + +-- algorithm change +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 'cipher-algo=bf'), + 'key', 'expect-cipher-algo=bf'); +ERROR: encrypt error: Cipher cannot be initialized +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 'cipher-algo=aes'), + 'key', 'expect-cipher-algo=aes128'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 'cipher-algo=aes192'), + 'key', 'expect-cipher-algo=aes192'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- s2k change +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 's2k-mode=0'), + 'key', 'expect-s2k-mode=0'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 's2k-mode=1'), + 'key', 'expect-s2k-mode=1'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 's2k-mode=3'), + 'key', 'expect-s2k-mode=3'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- s2k count change +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 's2k-count=1024'), + 'key', 'expect-s2k-count=1024'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- s2k_count rounds up +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 's2k-count=65000000'), + 'key', 'expect-s2k-count=65000000'); +NOTICE: pgp_decrypt: unexpected s2k_count: expected 65000000 got 65011712 + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- s2k digest change +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 's2k-digest-algo=sha1'), + 'key', 'expect-s2k-digest-algo=sha1'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- sess key +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 'sess-key=0'), + 'key', 'expect-sess-key=0'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 'sess-key=1'), + 'key', 'expect-sess-key=1'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 'sess-key=1, cipher-algo=bf'), + 'key', 'expect-sess-key=1, expect-cipher-algo=bf'); +ERROR: encrypt error: Cipher cannot be initialized +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 'sess-key=1, cipher-algo=aes192'), + 'key', 'expect-sess-key=1, expect-cipher-algo=aes192'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 'sess-key=1, cipher-algo=aes256'), + 'key', 'expect-sess-key=1, expect-cipher-algo=aes256'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- no mdc +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 'disable-mdc=1'), + 'key', 'expect-disable-mdc=1'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + +-- crlf +select pgp_sym_decrypt_bytea( + pgp_sym_encrypt(E'1\n2\n3\r\n', 'key', 'convert-crlf=1'), + 'key'); + pgp_sym_decrypt_bytea +------------------------ + \x310d0a320d0a330d0d0a +(1 row) + +-- conversion should be lossless +select digest(pgp_sym_decrypt( + pgp_sym_encrypt(E'\r\n0\n1\r\r\n\n2\r', 'key', 'convert-crlf=1'), + 'key', 'convert-crlf=1'), 'sha1') as result, + digest(E'\r\n0\n1\r\r\n\n2\r', 'sha1') as expect; + result | expect +--------------------------------------------+-------------------------------------------- + \x47bde5d88d6ef8770572b9cbb4278b402aa69966 | \x47bde5d88d6ef8770572b9cbb4278b402aa69966 +(1 row) + diff --git a/contrib/pgcrypto/expected/pgp-info.out b/contrib/pgcrypto/expected/pgp-info.out index 90648383730..909e7f7851e 100644 --- a/contrib/pgcrypto/expected/pgp-info.out +++ b/contrib/pgcrypto/expected/pgp-info.out @@ -75,5 +75,6 @@ from encdata order by id; B68504FD128E1FF9 FD0206C409B74875 FD0206C409B74875 -(5 rows) + D936CF64BB73F466 +(6 rows) diff --git a/contrib/pgcrypto/expected/pgp-pubkey-decrypt.out b/contrib/pgcrypto/expected/pgp-pubkey-decrypt.out index b4b6810a3c5..d3bb5f1b06d 100644 --- a/contrib/pgcrypto/expected/pgp-pubkey-decrypt.out +++ b/contrib/pgcrypto/expected/pgp-pubkey-decrypt.out @@ -585,6 +585,20 @@ blH2nKZC9d6fi4YzSYMepZpMOFR65M80MCMiDUGnZBB8sEADu2/iVtqDUeG8mAA= =PHJ1 -----END PGP MESSAGE----- '); +-- CVE-2026-14663. This message was created with cipher-algo=bf using an OpenSSL +-- that didn't actually support Blowfish. +insert into encdata (id, data) values (6, ' +-----BEGIN PGP MESSAGE----- + +wcBOA9k2z2S7c/RmEAP8DYbU6AeEo6riMMdnf2G62BM9gC0Z32ODydewy3Ki8AnSzpwBDAHuDMcr +P6RJDWvBOVOwgxHEwR7ZHMoFRDJEXdo6rQ9dQpDtbasMLyi6Lm1q+PbEefVd9WkU7fvFAFQx8k3t +lxrlWg/byoNplc7/hFxIFO8bN+FIlLgilAdApNcD/3Mg2/nd7pczovsYoryf9ib04kQ+SVWs3iNE +StoyEXT+oaT8u1vAxiY7fzPpQX1pnlHBUXn+v1J6LQL5Bwi5CTqOyDSyaFfgU0gQwTReFjS6L4Fs +Cv+2cFwbJBGIzr1aI4DLbzSelkmVm4hbOVeET4DJVlUVhhIyy6ZfoXiTEG6s0jMB2JdRGIl0EUQR +RMsQdABqdt5jU2VjcmV0IG1zZ9MUIIP4SPiU2pM/nF/A1hrltMhn/ZI= +=Mkdj +-----END PGP MESSAGE----- +'); -- successful decrypt select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=1 and encdata.id=1; @@ -600,6 +614,13 @@ from keytbl, encdata where keytbl.id=2 and encdata.id=2; Secret msg (1 row) +select pgp_pub_decrypt(dearmor(data), dearmor(seckey), '', 'ignore-cipher-failure=1') +from keytbl, encdata where keytbl.id=2 and encdata.id=2; + pgp_pub_decrypt +----------------- + Secret msg +(1 row) + select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=3 and encdata.id=3; pgp_pub_decrypt @@ -654,3 +675,12 @@ from keytbl, encdata where keytbl.id=5 and encdata.id=1; select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=6 and encdata.id=5; ERROR: Wrong key or corrupt data +-- Check that ignore-cipher-failure can strip faulty encryption if OpenSSL +-- doesn't support the cipher. (The decryption will correctly fail both times if +-- OpenSSL does support it.) +select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) +from keytbl, encdata where keytbl.id=1 and encdata.id=6; +ERROR: Wrong key or corrupt data +select pgp_pub_decrypt(dearmor(data), dearmor(seckey), '', 'ignore-cipher-failure=1') +from keytbl, encdata where keytbl.id=1 and encdata.id=6; +ERROR: Wrong key or corrupt data diff --git a/contrib/pgcrypto/expected/pgp-pubkey-decrypt_1.out b/contrib/pgcrypto/expected/pgp-pubkey-decrypt_1.out index f41c6c9893a..ac9307daf5e 100644 --- a/contrib/pgcrypto/expected/pgp-pubkey-decrypt_1.out +++ b/contrib/pgcrypto/expected/pgp-pubkey-decrypt_1.out @@ -585,6 +585,20 @@ blH2nKZC9d6fi4YzSYMepZpMOFR65M80MCMiDUGnZBB8sEADu2/iVtqDUeG8mAA= =PHJ1 -----END PGP MESSAGE----- '); +-- CVE-2026-14663. This message was created with cipher-algo=bf using an OpenSSL +-- that didn't actually support Blowfish. +insert into encdata (id, data) values (6, ' +-----BEGIN PGP MESSAGE----- + +wcBOA9k2z2S7c/RmEAP8DYbU6AeEo6riMMdnf2G62BM9gC0Z32ODydewy3Ki8AnSzpwBDAHuDMcr +P6RJDWvBOVOwgxHEwR7ZHMoFRDJEXdo6rQ9dQpDtbasMLyi6Lm1q+PbEefVd9WkU7fvFAFQx8k3t +lxrlWg/byoNplc7/hFxIFO8bN+FIlLgilAdApNcD/3Mg2/nd7pczovsYoryf9ib04kQ+SVWs3iNE +StoyEXT+oaT8u1vAxiY7fzPpQX1pnlHBUXn+v1J6LQL5Bwi5CTqOyDSyaFfgU0gQwTReFjS6L4Fs +Cv+2cFwbJBGIzr1aI4DLbzSelkmVm4hbOVeET4DJVlUVhhIyy6ZfoXiTEG6s0jMB2JdRGIl0EUQR +RMsQdABqdt5jU2VjcmV0IG1zZ9MUIIP4SPiU2pM/nF/A1hrltMhn/ZI= +=Mkdj +-----END PGP MESSAGE----- +'); -- successful decrypt select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=1 and encdata.id=1; @@ -595,6 +609,9 @@ from keytbl, encdata where keytbl.id=1 and encdata.id=1; select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=2 and encdata.id=2; +ERROR: encrypt error: Cipher cannot be initialized +select pgp_pub_decrypt(dearmor(data), dearmor(seckey), '', 'ignore-cipher-failure=1') +from keytbl, encdata where keytbl.id=2 and encdata.id=2; ERROR: Wrong key or corrupt data select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=3 and encdata.id=3; @@ -650,3 +667,16 @@ from keytbl, encdata where keytbl.id=5 and encdata.id=1; select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=6 and encdata.id=5; ERROR: Wrong key or corrupt data +-- Check that ignore-cipher-failure can strip faulty encryption if OpenSSL +-- doesn't support the cipher. (The decryption will correctly fail both times if +-- OpenSSL does support it.) +select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) +from keytbl, encdata where keytbl.id=1 and encdata.id=6; +ERROR: encrypt error: Cipher cannot be initialized +select pgp_pub_decrypt(dearmor(data), dearmor(seckey), '', 'ignore-cipher-failure=1') +from keytbl, encdata where keytbl.id=1 and encdata.id=6; + pgp_pub_decrypt +----------------- + Secret msg +(1 row) + diff --git a/contrib/pgcrypto/openssl.c b/contrib/pgcrypto/openssl.c index f179e80c842..51f28799a41 100644 --- a/contrib/pgcrypto/openssl.c +++ b/contrib/pgcrypto/openssl.c @@ -832,7 +832,10 @@ px_find_cipher(const char *name, PX_Cipher **res) static void ResOwnerReleaseOSSLCipher(Datum res) { - free_openssl_cipher((OSSLCipher *) DatumGetPointer(res)); + OSSLCipher *cipher = (OSSLCipher *) DatumGetPointer(res); + + cipher->owner = NULL; + free_openssl_cipher(cipher); } /* diff --git a/contrib/pgcrypto/pgp-cfb.c b/contrib/pgcrypto/pgp-cfb.c index de41e825b0c..c81534bf1ef 100644 --- a/contrib/pgcrypto/pgp-cfb.c +++ b/contrib/pgcrypto/pgp-cfb.c @@ -43,6 +43,7 @@ struct PGP_CFB int pos; int block_no; int resync; + int ignore_decrypt_cipher_failure; /* for CVE-2026-14663 recovery */ uint8 fr[PGP_MAX_BLOCK]; uint8 fre[PGP_MAX_BLOCK]; uint8 encbuf[PGP_MAX_BLOCK]; @@ -50,7 +51,7 @@ struct PGP_CFB int pgp_cfb_create(PGP_CFB **ctx_p, int algo, const uint8 *key, int key_len, - int resync, uint8 *iv) + int resync, uint8 *iv, int ignore_decrypt_cipher_failure) { int res; PX_Cipher *ciph; @@ -71,6 +72,7 @@ pgp_cfb_create(PGP_CFB **ctx_p, int algo, const uint8 *key, int key_len, ctx->ciph = ciph; ctx->block_size = px_cipher_block_size(ciph); ctx->resync = resync; + ctx->ignore_decrypt_cipher_failure = ignore_decrypt_cipher_failure; if (iv) memcpy(ctx->fr, iv, ctx->block_size); @@ -195,7 +197,7 @@ mix_decrypt_resync(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) */ static int cfb_process(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst, - mix_data_t mix_data) + mix_data_t mix_data, int ignore_cipher_failure) { int n; int res; @@ -221,8 +223,21 @@ cfb_process(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst, while (len > 0) { unsigned rlen; + int err; + + err = px_cipher_encrypt(ctx->ciph, 0, ctx->fr, ctx->block_size, ctx->fre, &rlen); + + /* + * XXX Ignoring cipher failures is dangerous, but we allow it during + * decryption to return to the behavior prior to the fix for + * CVE-2026-14663. This lets users recover data from a badly-encrypted + * message. + */ + if (err && !ignore_cipher_failure) + ereport(ERROR, + (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION), + errmsg("encrypt error: %s", px_strerror(err)))); - px_cipher_encrypt(ctx->ciph, 0, ctx->fr, ctx->block_size, ctx->fre, &rlen); if (ctx->block_no < 5) ctx->block_no++; @@ -253,7 +268,8 @@ pgp_cfb_encrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) { mix_data_t mix = ctx->resync ? mix_encrypt_resync : mix_encrypt_normal; - return cfb_process(ctx, data, len, dst, mix); + return cfb_process(ctx, data, len, dst, mix, + 0 /* never ignore cipher failures for encrypt */ ); } int @@ -261,5 +277,6 @@ pgp_cfb_decrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst) { mix_data_t mix = ctx->resync ? mix_decrypt_resync : mix_decrypt_normal; - return cfb_process(ctx, data, len, dst, mix); + return cfb_process(ctx, data, len, dst, mix, + ctx->ignore_decrypt_cipher_failure); } diff --git a/contrib/pgcrypto/pgp-decrypt.c b/contrib/pgcrypto/pgp-decrypt.c index e1ea5b3e58d..887fbc19278 100644 --- a/contrib/pgcrypto/pgp-decrypt.c +++ b/contrib/pgcrypto/pgp-decrypt.c @@ -595,7 +595,8 @@ decrypt_key(PGP_Context *ctx, const uint8 *src, int len) PGP_CFB *cfb; res = pgp_cfb_create(&cfb, ctx->s2k_cipher_algo, - ctx->s2k.key, ctx->s2k.key_len, 0, NULL); + ctx->s2k.key, ctx->s2k.key_len, 0, NULL, + ctx->ignore_cipher_failure); if (res < 0) return res; @@ -983,7 +984,8 @@ parse_symenc_data(PGP_Context *ctx, PullFilter *pkt, MBuf *dst) PullFilter *pf_prefix = NULL; res = pgp_cfb_create(&cfb, ctx->cipher_algo, - ctx->sess_key, ctx->sess_key_len, 1, NULL); + ctx->sess_key, ctx->sess_key_len, 1, NULL, + ctx->ignore_cipher_failure); if (res < 0) goto out; @@ -1026,7 +1028,8 @@ parse_symenc_mdc_data(PGP_Context *ctx, PullFilter *pkt, MBuf *dst) } res = pgp_cfb_create(&cfb, ctx->cipher_algo, - ctx->sess_key, ctx->sess_key_len, 0, NULL); + ctx->sess_key, ctx->sess_key_len, 0, NULL, + ctx->ignore_cipher_failure); if (res < 0) goto out; diff --git a/contrib/pgcrypto/pgp-encrypt.c b/contrib/pgcrypto/pgp-encrypt.c index f7467c9b1cb..968e8c92ce4 100644 --- a/contrib/pgcrypto/pgp-encrypt.c +++ b/contrib/pgcrypto/pgp-encrypt.c @@ -174,7 +174,8 @@ encrypt_init(PushFilter *next, void *init_arg, void **priv_p) return res; } res = pgp_cfb_create(&ciph, ctx->cipher_algo, - ctx->sess_key, ctx->sess_key_len, resync, NULL); + ctx->sess_key, ctx->sess_key_len, resync, NULL, + 0 /* never ignore cipher failures for encrypt */ ); if (res < 0) return res; @@ -505,7 +506,8 @@ symencrypt_sesskey(PGP_Context *ctx, uint8 *dst) uint8 algo = ctx->cipher_algo; res = pgp_cfb_create(&cfb, ctx->s2k_cipher_algo, - ctx->s2k.key, ctx->s2k.key_len, 0, NULL); + ctx->s2k.key, ctx->s2k.key_len, 0, NULL, + 0 /* never ignore cipher failures for encrypt */ ); if (res < 0) return res; diff --git a/contrib/pgcrypto/pgp-pgsql.c b/contrib/pgcrypto/pgp-pgsql.c index 464ca6e06c9..c9d10a27f1d 100644 --- a/contrib/pgcrypto/pgp-pgsql.c +++ b/contrib/pgcrypto/pgp-pgsql.c @@ -192,6 +192,8 @@ set_arg(PGP_Context *ctx, char *key, char *val, res = pgp_set_convert_crlf(ctx, atoi(val)); else if (strcmp(key, "unicode-mode") == 0) res = pgp_set_unicode_mode(ctx, atoi(val)); + else if (strcmp(key, "ignore-cipher-failure") == 0) + res = pgp_set_ignore_cipher_failure(ctx, atoi(val)); /* * The remaining options are for debugging/testing and are therefore not diff --git a/contrib/pgcrypto/pgp-pubkey.c b/contrib/pgcrypto/pgp-pubkey.c index 9a6561caf9d..470e0debbb0 100644 --- a/contrib/pgcrypto/pgp-pubkey.c +++ b/contrib/pgcrypto/pgp-pubkey.c @@ -382,8 +382,15 @@ process_secret_key(PullFilter *pkt, PGP_PubKey **pk_p, /* * create decrypt filter + * + * ignore-cipher-failure doesn't apply here; pgcrypto didn't encrypt + * the secret key to begin with, and any stored encrypted data was + * generated using the public key, so users don't have a reason to + * want to incorrectly decrypt this. We'll ignore failures during + * decryption with the session key, instead. */ - res = pgp_cfb_create(&cfb, cipher_algo, s2k.key, s2k.key_len, 0, iv); + res = pgp_cfb_create(&cfb, cipher_algo, s2k.key, s2k.key_len, 0, iv, + 0 /* don't ignore cipher failures */ ); if (res < 0) return res; res = pullf_create(&pf_decrypt, &pgp_decrypt_filter, cfb, pkt); diff --git a/contrib/pgcrypto/pgp.c b/contrib/pgcrypto/pgp.c index 8a6a6c2adf1..cf3fff90fa2 100644 --- a/contrib/pgcrypto/pgp.c +++ b/contrib/pgcrypto/pgp.c @@ -49,6 +49,7 @@ static int def_use_sess_key = 0; static int def_text_mode = 0; static int def_unicode_mode = 0; static int def_convert_crlf = 0; +static int def_ignore_cipher_failure = 0; struct digest_info { @@ -204,6 +205,7 @@ pgp_init(PGP_Context **ctx_p) ctx->unicode_mode = def_unicode_mode; ctx->convert_crlf = def_convert_crlf; ctx->text_mode = def_text_mode; + ctx->ignore_cipher_failure = def_ignore_cipher_failure; *ctx_p = ctx; return 0; @@ -349,6 +351,13 @@ pgp_set_unicode_mode(PGP_Context *ctx, int mode) return 0; } +int +pgp_set_ignore_cipher_failure(PGP_Context *ctx, int ignore) +{ + ctx->ignore_cipher_failure = ignore ? 1 : 0; + return 0; +} + int pgp_set_symkey(PGP_Context *ctx, const uint8 *key, int len) { diff --git a/contrib/pgcrypto/pgp.h b/contrib/pgcrypto/pgp.h index 0bbfd0217ba..7b130388fcc 100644 --- a/contrib/pgcrypto/pgp.h +++ b/contrib/pgcrypto/pgp.h @@ -150,6 +150,9 @@ struct PGP_Context int convert_crlf; int unicode_mode; + /* DANGEROUS recovery aid for CVE-2026-14663. Applies only to decryption. */ + int ignore_cipher_failure; + /* * internal variables */ @@ -258,6 +261,7 @@ int pgp_set_compress_level(PGP_Context *ctx, int level); int pgp_set_text_mode(PGP_Context *ctx, int mode); int pgp_set_unicode_mode(PGP_Context *ctx, int mode); int pgp_get_unicode_mode(PGP_Context *ctx); +int pgp_set_ignore_cipher_failure(PGP_Context *ctx, int ignore); int pgp_set_symkey(PGP_Context *ctx, const uint8 *key, int len); int pgp_set_pubkey(PGP_Context *ctx, MBuf *keypkt, @@ -278,7 +282,8 @@ int pgp_s2k_process(PGP_S2K *s2k, int cipher, const uint8 *key, int key_len); typedef struct PGP_CFB PGP_CFB; int pgp_cfb_create(PGP_CFB **ctx_p, int algo, - const uint8 *key, int key_len, int resync, uint8 *iv); + const uint8 *key, int key_len, int resync, uint8 *iv, + int ignore_decrypt_cipher_failure); void pgp_cfb_free(PGP_CFB *ctx); int pgp_cfb_encrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst); int pgp_cfb_decrypt(PGP_CFB *ctx, const uint8 *data, int len, uint8 *dst); diff --git a/contrib/pgcrypto/sql/pgp-decrypt.sql b/contrib/pgcrypto/sql/pgp-decrypt.sql index b499bf757b0..7e7dc189e58 100644 --- a/contrib/pgcrypto/sql/pgp-decrypt.sql +++ b/contrib/pgcrypto/sql/pgp-decrypt.sql @@ -328,3 +328,29 @@ UCAAw2JRIISttRHMfDpDuZJpvYo= =AZ9M -----END PGP MESSAGE----- '), 'key', 'debug=1'); + +-- Check ignore-cipher-failure. This message isn't actually encrypted; it was +-- created with cipher-algo=bf using an OpenSSL that didn't actually support +-- Blowfish. After the fix for CVE-2026-14663, we no longer create these broken +-- ciphertexts, but we allow users to return to the previous behavior during +-- decryption so that the bad wrapper can be stripped. +-- +-- Note that if Blowfish is supported by the linked OpenSSL, both decryptions +-- will fail. +select pgp_sym_decrypt(dearmor(' +-----BEGIN PGP MESSAGE----- + +ww0EBAMC8wIKbtvzJtxi0jABUleCwFJWGCkYKcsNdABqdtXaU2VjcmV0LtMUlnPH3A2QBmZrcucm +1GPb/s2Bkdg= +=6aqD +-----END PGP MESSAGE----- +'), 'wrong key'); + +select pgp_sym_decrypt(dearmor(' +-----BEGIN PGP MESSAGE----- + +ww0EBAMC8wIKbtvzJtxi0jABUleCwFJWGCkYKcsNdABqdtXaU2VjcmV0LtMUlnPH3A2QBmZrcucm +1GPb/s2Bkdg= +=6aqD +-----END PGP MESSAGE----- +'), 'wrong key', 'ignore-cipher-failure=1'); diff --git a/contrib/pgcrypto/sql/pgp-pubkey-decrypt.sql b/contrib/pgcrypto/sql/pgp-pubkey-decrypt.sql index 3f2bae9e40b..40a11e0b2dc 100644 --- a/contrib/pgcrypto/sql/pgp-pubkey-decrypt.sql +++ b/contrib/pgcrypto/sql/pgp-pubkey-decrypt.sql @@ -601,6 +601,21 @@ blH2nKZC9d6fi4YzSYMepZpMOFR65M80MCMiDUGnZBB8sEADu2/iVtqDUeG8mAA= -----END PGP MESSAGE----- '); +-- CVE-2026-14663. This message was created with cipher-algo=bf using an OpenSSL +-- that didn't actually support Blowfish. +insert into encdata (id, data) values (6, ' +-----BEGIN PGP MESSAGE----- + +wcBOA9k2z2S7c/RmEAP8DYbU6AeEo6riMMdnf2G62BM9gC0Z32ODydewy3Ki8AnSzpwBDAHuDMcr +P6RJDWvBOVOwgxHEwR7ZHMoFRDJEXdo6rQ9dQpDtbasMLyi6Lm1q+PbEefVd9WkU7fvFAFQx8k3t +lxrlWg/byoNplc7/hFxIFO8bN+FIlLgilAdApNcD/3Mg2/nd7pczovsYoryf9ib04kQ+SVWs3iNE +StoyEXT+oaT8u1vAxiY7fzPpQX1pnlHBUXn+v1J6LQL5Bwi5CTqOyDSyaFfgU0gQwTReFjS6L4Fs +Cv+2cFwbJBGIzr1aI4DLbzSelkmVm4hbOVeET4DJVlUVhhIyy6ZfoXiTEG6s0jMB2JdRGIl0EUQR +RMsQdABqdt5jU2VjcmV0IG1zZ9MUIIP4SPiU2pM/nF/A1hrltMhn/ZI= +=Mkdj +-----END PGP MESSAGE----- +'); + -- successful decrypt select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=1 and encdata.id=1; @@ -608,6 +623,9 @@ from keytbl, encdata where keytbl.id=1 and encdata.id=1; select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=2 and encdata.id=2; +select pgp_pub_decrypt(dearmor(data), dearmor(seckey), '', 'ignore-cipher-failure=1') +from keytbl, encdata where keytbl.id=2 and encdata.id=2; + select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=3 and encdata.id=3; @@ -645,3 +663,12 @@ from keytbl, encdata where keytbl.id=5 and encdata.id=1; -- test for a short read from prefix_init select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) from keytbl, encdata where keytbl.id=6 and encdata.id=5; + +-- Check that ignore-cipher-failure can strip faulty encryption if OpenSSL +-- doesn't support the cipher. (The decryption will correctly fail both times if +-- OpenSSL does support it.) +select pgp_pub_decrypt(dearmor(data), dearmor(seckey)) +from keytbl, encdata where keytbl.id=1 and encdata.id=6; + +select pgp_pub_decrypt(dearmor(data), dearmor(seckey), '', 'ignore-cipher-failure=1') +from keytbl, encdata where keytbl.id=1 and encdata.id=6; diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index 776866f0015..1d3d86f2494 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -680,12 +680,18 @@ UserMappingPasswordRequired(UserMapping *user) return true; } +/* + * Return whether SCRAM pass-through is enabled. + * + * If use_scram_passthrough is specified in both the foreign server + * and the user mapping, the user mapping setting takes precedence. + */ static bool UseScramPassthrough(ForeignServer *server, UserMapping *user) { ListCell *cell; - foreach(cell, server->options) + foreach(cell, user->options) { DefElem *def = (DefElem *) lfirst(cell); @@ -693,7 +699,7 @@ UseScramPassthrough(ForeignServer *server, UserMapping *user) return defGetBoolean(def); } - foreach(cell, user->options) + foreach(cell, server->options) { DefElem *def = (DefElem *) lfirst(cell); diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index f975ceff200..e357c3170bc 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -7132,6 +7132,70 @@ RESET enable_material; DROP FOREIGN TABLE remt2; DROP TABLE loct1; DROP TABLE loct2; +-- Test that direct modify and foreign modify work with runtime pruning of +-- result relations (bug #19484) +create table fdw_part_update (a int not null, b int) partition by list (a); +create table fdw_part_update_p1 partition of fdw_part_update for values in (1); +create table fdw_part_update_remote (a int not null, b int); +create foreign table fdw_part_update_p2 partition of fdw_part_update + for values in (2) + server loopback options (table_name 'fdw_part_update_remote'); +insert into fdw_part_update_p1 values (1, 10); +insert into fdw_part_update_remote values (2, 20); +set plan_cache_mode = force_generic_plan; +-- Check DirectModify case +prepare fdw_part_upd(int) as + update fdw_part_update set b = b + 1 where a = $1 + returning tableoid::regclass, a, b; +explain (verbose, costs off) + execute fdw_part_upd(2); + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------- + Update on public.fdw_part_update + Output: (fdw_part_update_1.tableoid)::regclass, fdw_part_update_1.a, fdw_part_update_1.b + Foreign Update on public.fdw_part_update_p2 fdw_part_update_2 + -> Append + Subplans Removed: 1 + -> Foreign Update on public.fdw_part_update_p2 fdw_part_update_2 + Remote SQL: UPDATE public.fdw_part_update_remote SET b = (b + 1) WHERE ((a = $1::integer)) RETURNING a, b +(7 rows) + +execute fdw_part_upd(2); + tableoid | a | b +--------------------+---+---- + fdw_part_update_p2 | 2 | 21 +(1 row) + +deallocate fdw_part_upd; +-- Check ForeignModify case +prepare fdw_part_upd2(int) as + update fdw_part_update set b = b + random()::int * 0 + 1 where a = $1 + returning tableoid::regclass, a, b; +explain (verbose, costs off) + execute fdw_part_upd2(2); + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------- + Update on public.fdw_part_update + Output: (fdw_part_update_1.tableoid)::regclass, fdw_part_update_1.a, fdw_part_update_1.b + Foreign Update on public.fdw_part_update_p2 fdw_part_update_2 + Remote SQL: UPDATE public.fdw_part_update_remote SET b = $2 WHERE ctid = $1 RETURNING a, b + -> Append + Subplans Removed: 1 + -> Foreign Scan on public.fdw_part_update_p2 fdw_part_update_2 + Output: ((fdw_part_update_2.b + ((random())::integer * 0)) + 1), fdw_part_update_2.tableoid, fdw_part_update_2.ctid, fdw_part_update_2.* + Remote SQL: SELECT a, b, ctid FROM public.fdw_part_update_remote WHERE ((a = $1::integer)) FOR UPDATE +(9 rows) + +execute fdw_part_upd2(2); + tableoid | a | b +--------------------+---+---- + fdw_part_update_p2 | 2 | 22 +(1 row) + +deallocate fdw_part_upd2; +reset plan_cache_mode; +drop table fdw_part_update; +drop table fdw_part_update_remote; -- =================================================================== -- test check constraints -- =================================================================== @@ -11599,6 +11663,72 @@ SELECT * FROM result_tbl ORDER BY a; (3 rows) DELETE FROM result_tbl; +-- Test ExecAppendAsyncReset code path that drains outstanding async requests +-- (case where subplans are re-scanned with parameter changes) +EXPLAIN (VERBOSE, COSTS OFF) +SELECT o.x FROM (VALUES (2505), (3505)) o(x), LATERAL (SELECT a FROM async_pt WHERE a = o.x OR a = 1505 LIMIT 1) s ORDER BY o.x; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------- + Sort + Output: "*VALUES*".column1 + Sort Key: "*VALUES*".column1 + -> Nested Loop + Output: "*VALUES*".column1 + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 + -> Limit + Output: NULL::integer + -> Append + -> Async Foreign Scan on public.async_p1 async_pt_1 + Output: NULL::integer + Remote SQL: SELECT NULL FROM public.base_tbl1 WHERE (((a = $1::integer) OR (a = 1505))) + -> Async Foreign Scan on public.async_p2 async_pt_2 + Output: NULL::integer + Remote SQL: SELECT NULL FROM public.base_tbl2 WHERE (((a = $1::integer) OR (a = 1505))) + -> Async Foreign Scan on public.async_p3 async_pt_3 + Output: NULL::integer + Remote SQL: SELECT NULL FROM public.base_tbl3 WHERE (((a = $1::integer) OR (a = 1505))) +(19 rows) + +SELECT o.x FROM (VALUES (2505), (3505)) o(x), LATERAL (SELECT a FROM async_pt WHERE a = o.x OR a = 1505 LIMIT 1) s ORDER BY o.x; + x +------ + 2505 + 3505 +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT o.x FROM (VALUES (2505), (3505)) o(x), LATERAL (SELECT a FROM async_pt WHERE a = o.x OR (a = 1505 AND o.x = 2505) LIMIT 1) s ORDER BY o.x; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: "*VALUES*".column1 + Sort Key: "*VALUES*".column1 + -> Nested Loop + Output: "*VALUES*".column1 + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 + -> Limit + Output: NULL::integer + -> Append + -> Async Foreign Scan on public.async_p1 async_pt_1 + Output: NULL::integer + Remote SQL: SELECT NULL FROM public.base_tbl1 WHERE (((a = $1::integer) OR ((a = 1505) AND ($1::integer = 2505)))) + -> Async Foreign Scan on public.async_p2 async_pt_2 + Output: NULL::integer + Remote SQL: SELECT NULL FROM public.base_tbl2 WHERE (((a = $1::integer) OR ((a = 1505) AND ($1::integer = 2505)))) + -> Async Foreign Scan on public.async_p3 async_pt_3 + Output: NULL::integer + Remote SQL: SELECT NULL FROM public.base_tbl3 WHERE (((a = $1::integer) OR ((a = 1505) AND ($1::integer = 2505)))) +(19 rows) + +SELECT o.x FROM (VALUES (2505), (3505)) o(x), LATERAL (SELECT a FROM async_pt WHERE a = o.x OR (a = 1505 AND o.x = 2505) LIMIT 1) s ORDER BY o.x; + x +------ + 2505 + 3505 +(2 rows) + DROP FOREIGN TABLE async_p3; DROP TABLE base_tbl3; -- Check case where the partitioned table has local/remote partitions @@ -12379,8 +12509,8 @@ DROP TABLE base_tbl1; DROP TABLE base_tbl2; DROP TABLE result_tbl; DROP TABLE join_tbl; --- Test that an asynchronous fetch is processed before restarting the scan in --- ReScanForeignScan +-- Test ExecAppendAsyncReset code path that drains outstanding async requests +-- (case where subplans are re-scanned without parameter changes) CREATE TABLE base_tbl (a int, b int); INSERT INTO base_tbl VALUES (1, 11), (2, 22), (3, 33); CREATE FOREIGN TABLE foreign_tbl (b int) @@ -12694,23 +12824,67 @@ SELECT server_name, loopback | f | t (1 row) --- After terminating the remote backend, since the connection is closed, --- "closed" should be TRUE, or NULL if the connection status check --- is not available. Despite the termination, remote_backend_pid should --- still show the non-zero PID of the terminated remote backend. +-- After terminating the remote backend, if the connection entry is still in +-- the cache, "closed" should be TRUE, or NULL if the connection status check +-- is not available, and remote_backend_pid should still show the non-zero PID +-- of the terminated remote backend. Concurrent invalidation can remove the +-- idle cached connection before the next statement, in which case +-- postgres_fdw_get_connections(true) can legitimately return no rows. DO $$ BEGIN PERFORM pg_terminate_backend(pid, 180000) FROM pg_stat_activity WHERE application_name = 'fdw_conn_check'; END $$; -SELECT server_name, +WITH terminated_conn AS ( + SELECT server_name, + CASE WHEN closed IS NOT false THEN true ELSE false END AS closed, + remote_backend_pid <> 0 AS remote_backend_pid + FROM postgres_fdw_get_connections(true) +) +SELECT CASE + WHEN count(*) = 0 THEN true + WHEN count(*) = 1 THEN bool_and(server_name = 'loopback' + AND closed + AND remote_backend_pid) + ELSE false +END AS ok +FROM terminated_conn; + ok +---- + t +(1 row) + +-- In an explicit transaction, concurrent invalidation may mark the +-- connection invalid but cannot discard it before transaction end, so the +-- terminated connection should remain visible in the cache. +SELECT 1 FROM postgres_fdw_disconnect_all(); + ?column? +---------- + 1 +(1 row) + +SET client_min_messages = 'ERROR'; +BEGIN; +SELECT 1 FROM ft1 LIMIT 1; + ?column? +---------- + 1 +(1 row) + +DO $$ BEGIN +PERFORM pg_terminate_backend(pid, 180000) FROM pg_stat_activity + WHERE application_name = 'fdw_conn_check'; +END $$; +SELECT server_name, used_in_xact, CASE WHEN closed IS NOT false THEN true ELSE false END AS closed, remote_backend_pid <> 0 AS remote_backend_pid FROM postgres_fdw_get_connections(true); - server_name | closed | remote_backend_pid --------------+--------+-------------------- - loopback | t | t + server_name | used_in_xact | closed | remote_backend_pid +-------------+--------------+--------+-------------------- + loopback | t | t | t (1 row) +ABORT; +RESET client_min_messages; -- Clean up \set VERBOSITY default RESET debug_discard_caches; diff --git a/contrib/postgres_fdw/option.c b/contrib/postgres_fdw/option.c index 6d5795b9fa9..0ab1fd70186 100644 --- a/contrib/postgres_fdw/option.c +++ b/contrib/postgres_fdw/option.c @@ -125,7 +125,8 @@ postgres_fdw_validator(PG_FUNCTION_ARGS) strcmp(def->defname, "async_capable") == 0 || strcmp(def->defname, "parallel_commit") == 0 || strcmp(def->defname, "parallel_abort") == 0 || - strcmp(def->defname, "keep_connections") == 0) + strcmp(def->defname, "keep_connections") == 0 || + strcmp(def->defname, "use_scram_passthrough") == 0) { /* these accept only boolean values */ (void) defGetBoolean(def); diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index 4283ce9f962..ed23dedc542 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -1658,16 +1658,11 @@ postgresReScanForeignScan(ForeignScanState *node) return; /* - * If the node is async-capable, and an asynchronous fetch for it has - * begun, the asynchronous fetch might not have yet completed. Check if - * the node is async-capable, and an asynchronous fetch for it is still in - * progress; if so, complete the asynchronous fetch before restarting the - * scan. - */ - if (fsstate->async_capable && - fsstate->conn_state->pendingAreq && - fsstate->conn_state->pendingAreq->requestee == (PlanState *) node) - fetch_more_data(node); + * If the node is async-capable, any asynchronous fetch made for it should + * have been processed before we get here (see ExecAppendAsyncReset()). + */ + Assert(!fsstate->async_capable || !fsstate->conn_state->pendingAreq || + fsstate->conn_state->pendingAreq->requestee != (PlanState *) node); /* * If any internal parameters affecting this node have changed, we'd diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index 04a5a1244e8..c7802e4dd45 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -1732,6 +1732,40 @@ DROP FOREIGN TABLE remt2; DROP TABLE loct1; DROP TABLE loct2; +-- Test that direct modify and foreign modify work with runtime pruning of +-- result relations (bug #19484) +create table fdw_part_update (a int not null, b int) partition by list (a); +create table fdw_part_update_p1 partition of fdw_part_update for values in (1); +create table fdw_part_update_remote (a int not null, b int); +create foreign table fdw_part_update_p2 partition of fdw_part_update + for values in (2) + server loopback options (table_name 'fdw_part_update_remote'); +insert into fdw_part_update_p1 values (1, 10); +insert into fdw_part_update_remote values (2, 20); +set plan_cache_mode = force_generic_plan; + +-- Check DirectModify case +prepare fdw_part_upd(int) as + update fdw_part_update set b = b + 1 where a = $1 + returning tableoid::regclass, a, b; +explain (verbose, costs off) + execute fdw_part_upd(2); +execute fdw_part_upd(2); +deallocate fdw_part_upd; + +-- Check ForeignModify case +prepare fdw_part_upd2(int) as + update fdw_part_update set b = b + random()::int * 0 + 1 where a = $1 + returning tableoid::regclass, a, b; +explain (verbose, costs off) + execute fdw_part_upd2(2); +execute fdw_part_upd2(2); +deallocate fdw_part_upd2; + +reset plan_cache_mode; +drop table fdw_part_update; +drop table fdw_part_update_remote; + -- =================================================================== -- test check constraints -- =================================================================== @@ -3957,6 +3991,16 @@ INSERT INTO result_tbl SELECT * FROM async_pt WHERE b === 505; SELECT * FROM result_tbl ORDER BY a; DELETE FROM result_tbl; +-- Test ExecAppendAsyncReset code path that drains outstanding async requests +-- (case where subplans are re-scanned with parameter changes) +EXPLAIN (VERBOSE, COSTS OFF) +SELECT o.x FROM (VALUES (2505), (3505)) o(x), LATERAL (SELECT a FROM async_pt WHERE a = o.x OR a = 1505 LIMIT 1) s ORDER BY o.x; +SELECT o.x FROM (VALUES (2505), (3505)) o(x), LATERAL (SELECT a FROM async_pt WHERE a = o.x OR a = 1505 LIMIT 1) s ORDER BY o.x; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT o.x FROM (VALUES (2505), (3505)) o(x), LATERAL (SELECT a FROM async_pt WHERE a = o.x OR (a = 1505 AND o.x = 2505) LIMIT 1) s ORDER BY o.x; +SELECT o.x FROM (VALUES (2505), (3505)) o(x), LATERAL (SELECT a FROM async_pt WHERE a = o.x OR (a = 1505 AND o.x = 2505) LIMIT 1) s ORDER BY o.x; + DROP FOREIGN TABLE async_p3; DROP TABLE base_tbl3; @@ -4193,8 +4237,8 @@ DROP TABLE base_tbl2; DROP TABLE result_tbl; DROP TABLE join_tbl; --- Test that an asynchronous fetch is processed before restarting the scan in --- ReScanForeignScan +-- Test ExecAppendAsyncReset code path that drains outstanding async requests +-- (case where subplans are re-scanned without parameter changes) CREATE TABLE base_tbl (a int, b int); INSERT INTO base_tbl VALUES (1, 11), (2, 22), (3, 33); CREATE FOREIGN TABLE foreign_tbl (b int) @@ -4417,18 +4461,48 @@ SELECT server_name, WHERE application_name = 'fdw_conn_check') AS remote_backend_pid FROM postgres_fdw_get_connections(true); --- After terminating the remote backend, since the connection is closed, --- "closed" should be TRUE, or NULL if the connection status check --- is not available. Despite the termination, remote_backend_pid should --- still show the non-zero PID of the terminated remote backend. +-- After terminating the remote backend, if the connection entry is still in +-- the cache, "closed" should be TRUE, or NULL if the connection status check +-- is not available, and remote_backend_pid should still show the non-zero PID +-- of the terminated remote backend. Concurrent invalidation can remove the +-- idle cached connection before the next statement, in which case +-- postgres_fdw_get_connections(true) can legitimately return no rows. DO $$ BEGIN PERFORM pg_terminate_backend(pid, 180000) FROM pg_stat_activity WHERE application_name = 'fdw_conn_check'; END $$; -SELECT server_name, +WITH terminated_conn AS ( + SELECT server_name, + CASE WHEN closed IS NOT false THEN true ELSE false END AS closed, + remote_backend_pid <> 0 AS remote_backend_pid + FROM postgres_fdw_get_connections(true) +) +SELECT CASE + WHEN count(*) = 0 THEN true + WHEN count(*) = 1 THEN bool_and(server_name = 'loopback' + AND closed + AND remote_backend_pid) + ELSE false +END AS ok +FROM terminated_conn; + +-- In an explicit transaction, concurrent invalidation may mark the +-- connection invalid but cannot discard it before transaction end, so the +-- terminated connection should remain visible in the cache. +SELECT 1 FROM postgres_fdw_disconnect_all(); +SET client_min_messages = 'ERROR'; +BEGIN; +SELECT 1 FROM ft1 LIMIT 1; +DO $$ BEGIN +PERFORM pg_terminate_backend(pid, 180000) FROM pg_stat_activity + WHERE application_name = 'fdw_conn_check'; +END $$; +SELECT server_name, used_in_xact, CASE WHEN closed IS NOT false THEN true ELSE false END AS closed, remote_backend_pid <> 0 AS remote_backend_pid FROM postgres_fdw_get_connections(true); +ABORT; +RESET client_min_messages; -- Clean up \set VERBOSITY default diff --git a/contrib/postgres_fdw/t/001_auth_scram.pl b/contrib/postgres_fdw/t/001_auth_scram.pl index b94a6a6293b..e41d328ff85 100644 --- a/contrib/postgres_fdw/t/001_auth_scram.pl +++ b/contrib/postgres_fdw/t/001_auth_scram.pl @@ -20,6 +20,7 @@ my $db2 = "db2"; # For node2 my $fdw_server = "db1_fdw"; my $fdw_server2 = "db2_fdw"; +my $fdw_server3 = "db1_fdw_override"; my $node1 = PostgreSQL::Test::Cluster->new('node1'); my $node2 = PostgreSQL::Test::Cluster->new('node2'); @@ -46,9 +47,11 @@ $node1->safe_psql($db0, 'CREATE EXTENSION IF NOT EXISTS postgres_fdw'); setup_fdw_server($node1, $db0, $fdw_server, $node1, $db1); setup_fdw_server($node1, $db0, $fdw_server2, $node2, $db2); +setup_fdw_server($node1, $db0, $fdw_server3, $node1, $db1); setup_user_mapping($node1, $db0, $fdw_server); setup_user_mapping($node1, $db0, $fdw_server2); +setup_user_mapping($node1, $db0, $fdw_server3); # Make the user have the same SCRAM key on both servers. Forcing to have the # same iteration and salt. @@ -68,6 +71,33 @@ test_auth($node2, $db2, "t2", "SCRAM auth directly on foreign server should still succeed"); +# Test that use_scram_passthrough=false on user mapping overrides server setting +{ + my $connstr = $node1->connstr($db0) . qq' user=$user'; + + $node1->safe_psql($db0, + qq'ALTER USER MAPPING FOR $user SERVER $fdw_server3 OPTIONS(add use_scram_passthrough \'false\')', + connstr => $connstr + ); + + $node1->safe_psql( + $db0, + qq'CREATE FOREIGN TABLE override_t (g int, col2 int) SERVER $fdw_server3 OPTIONS (table_name \'t\');', + connstr => $connstr ); + $node1->safe_psql($db0, qq'GRANT SELECT ON override_t TO $user;', connstr => $connstr); + + my ($ret, $stdout, $stderr) = $node1->psql( + $db0, + qq'SELECT count(1) FROM override_t', + connstr => $connstr); + + is($ret, 3, 'SCRAM passthrough disabled on user mapping should fail'); + like( + $stderr, + qr/password/i, + 'expected password-related error when scram passthrough disabled on user mapping'); +} + SKIP: { skip "test requires Unix-domain sockets", 4 if !$use_unix_sockets; diff --git a/contrib/seg/expected/seg.out b/contrib/seg/expected/seg.out index cd21139b5a7..b7c3fba1597 100644 --- a/contrib/seg/expected/seg.out +++ b/contrib/seg/expected/seg.out @@ -263,7 +263,8 @@ SELECT '12.345678901234560000000000000000000000000000000000000000000000000000000 12.3457 (1 row) --- Numbers with certainty indicators +-- Numbers and ranges with certainty indicators. Certainty indicators +-- are stored and preserved on output, but ignored by operators. SELECT '~6.5'::seg AS seg; seg ------ @@ -300,6 +301,48 @@ SELECT '> 6.5'::seg AS seg; >6.5 (1 row) +SELECT '~1.5 .. 2.5'::seg AS seg; + seg +------------- + ~1.5 .. 2.5 +(1 row) + +SELECT '1.5 .. ~2.5'::seg AS seg; + seg +------------- + 1.5 .. ~2.5 +(1 row) + +SELECT '~1.5 .. ~2.5'::seg AS seg; + seg +-------------- + ~1.5 .. ~2.5 +(1 row) + +SELECT '<1.5 .. 2.5'::seg AS seg; + seg +------------- + <1.5 .. 2.5 +(1 row) + +SELECT '1.5 .. <2.5'::seg AS seg; + seg +------------- + 1.5 .. <2.5 +(1 row) + +SELECT '>1.5 .. 2.5'::seg AS seg; + seg +------------- + >1.5 .. 2.5 +(1 row) + +SELECT '1.5 .. >2.5'::seg AS seg; + seg +------------- + 1.5 .. >2.5 +(1 row) + -- Open intervals SELECT '0..'::seg AS seg; seg diff --git a/contrib/seg/seg.c b/contrib/seg/seg.c index 151cbb954b9..a2cbc82e878 100644 --- a/contrib/seg/seg.c +++ b/contrib/seg/seg.c @@ -152,7 +152,7 @@ seg_out(PG_FUNCTION_ARGS) { /* print the upper boundary if exists */ p += sprintf(p, " "); - if (seg->u_ext == '>' || seg->u_ext == '<' || seg->l_ext == '~') + if (seg->u_ext == '>' || seg->u_ext == '<' || seg->u_ext == '~') p += sprintf(p, "%c", seg->u_ext); p += restore(p, seg->upper, seg->u_sigd); } diff --git a/contrib/seg/sql/seg.sql b/contrib/seg/sql/seg.sql index c30f1f6bef1..a74a42f7e3e 100644 --- a/contrib/seg/sql/seg.sql +++ b/contrib/seg/sql/seg.sql @@ -63,7 +63,8 @@ SELECT '12.34567890123456'::seg AS seg; -- Same, with a very long input SELECT '12.3456789012345600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'::seg AS seg; --- Numbers with certainty indicators +-- Numbers and ranges with certainty indicators. Certainty indicators +-- are stored and preserved on output, but ignored by operators. SELECT '~6.5'::seg AS seg; SELECT '<6.5'::seg AS seg; SELECT '>6.5'::seg AS seg; @@ -71,6 +72,14 @@ SELECT '~ 6.5'::seg AS seg; SELECT '< 6.5'::seg AS seg; SELECT '> 6.5'::seg AS seg; +SELECT '~1.5 .. 2.5'::seg AS seg; +SELECT '1.5 .. ~2.5'::seg AS seg; +SELECT '~1.5 .. ~2.5'::seg AS seg; +SELECT '<1.5 .. 2.5'::seg AS seg; +SELECT '1.5 .. <2.5'::seg AS seg; +SELECT '>1.5 .. 2.5'::seg AS seg; +SELECT '1.5 .. >2.5'::seg AS seg; + -- Open intervals SELECT '0..'::seg AS seg; SELECT '0...'::seg AS seg; diff --git a/contrib/spi/refint.c b/contrib/spi/refint.c index ab0b2b291f9..3d8dcc22f50 100644 --- a/contrib/spi/refint.c +++ b/contrib/spi/refint.c @@ -12,7 +12,6 @@ #include "commands/trigger.h" #include "executor/spi.h" #include "utils/builtins.h" -#include "utils/memutils.h" #include "utils/rel.h" PG_MODULE_MAGIC_EXT( @@ -20,20 +19,6 @@ PG_MODULE_MAGIC_EXT( .version = PG_VERSION ); -typedef struct -{ - char *ident; - int nplans; - SPIPlanPtr *splan; -} EPlan; - -static EPlan *FPlans = NULL; -static int nFPlans = 0; -static EPlan *PPlans = NULL; -static int nPPlans = 0; - -static EPlan *find_plan(char *ident, EPlan **eplan, int *nplans); - /* * check_primary_key () -- check that key in tuple being inserted/updated * references existing tuple in "primary" table. @@ -59,12 +44,12 @@ check_primary_key(PG_FUNCTION_ARGS) Relation rel; /* triggered relation */ HeapTuple tuple = NULL; /* tuple to return */ TupleDesc tupdesc; /* tuple description */ - EPlan *plan; /* prepared plan */ + SPIPlanPtr pplan; /* prepared plan */ Oid *argtypes = NULL; /* key types to prepare execution plan */ bool isnull; /* to know is some column NULL or not */ - char ident[2 * NAMEDATALEN]; /* to identify myself */ int ret; int i; + StringInfoData sql; #ifdef DEBUG_QUERY elog(DEBUG4, "check_primary_key: Enter Function"); @@ -123,16 +108,8 @@ check_primary_key(PG_FUNCTION_ARGS) */ kvals = (Datum *) palloc(nkeys * sizeof(Datum)); - /* - * Construct ident string as TriggerName $ TriggeredRelationId and try to - * find prepared execution plan. - */ - snprintf(ident, sizeof(ident), "%s$%u", trigger->tgname, rel->rd_id); - plan = find_plan(ident, &PPlans, &nPPlans); - - /* if there is no plan then allocate argtypes for preparation */ - if (plan->nplans <= 0) - argtypes = (Oid *) palloc(nkeys * sizeof(Oid)); + /* allocate argtypes for preparation */ + argtypes = (Oid *) palloc(nkeys * sizeof(Oid)); /* For each column in key ... */ for (i = 0; i < nkeys; i++) @@ -161,57 +138,36 @@ check_primary_key(PG_FUNCTION_ARGS) return PointerGetDatum(tuple); } - if (plan->nplans <= 0) /* Get typeId of column */ - argtypes[i] = SPI_gettypeid(tupdesc, fnumber); + /* Get typeId of column */ + argtypes[i] = SPI_gettypeid(tupdesc, fnumber); } + initStringInfo(&sql); + /* - * If we have to prepare plan ... + * Construct query: SELECT 1 FROM _referenced_relation_ WHERE Pkey1 = $1 + * [AND Pkey2 = $2 [...]] */ - if (plan->nplans <= 0) + appendStringInfo(&sql, "select 1 from %s where ", relname); + for (i = 1; i <= nkeys; i++) { - SPIPlanPtr pplan; - StringInfoData sql; - - initStringInfo(&sql); - - /* - * Construct query: SELECT 1 FROM _referenced_relation_ WHERE Pkey1 = - * $1 [AND Pkey2 = $2 [...]] - */ - appendStringInfo(&sql, "select 1 from %s where ", relname); - for (i = 1; i <= nkeys; i++) - { - appendStringInfo(&sql, "%s = $%d ", args[i + nkeys], i); - if (i < nkeys) - appendStringInfoString(&sql, "and "); - } - - /* Prepare plan for query */ - pplan = SPI_prepare(sql.data, nkeys, argtypes); - if (pplan == NULL) - /* internal error */ - elog(ERROR, "check_primary_key: SPI_prepare returned %s", SPI_result_code_string(SPI_result)); + appendStringInfo(&sql, "%s = $%d ", args[i + nkeys], i); + if (i < nkeys) + appendStringInfoString(&sql, "and "); + } - /* - * Remember that SPI_prepare places plan in current memory context - - * so, we have to save plan in TopMemoryContext for later use. - */ - if (SPI_keepplan(pplan)) - /* internal error */ - elog(ERROR, "check_primary_key: SPI_keepplan failed"); - plan->splan = (SPIPlanPtr *) MemoryContextAlloc(TopMemoryContext, - sizeof(SPIPlanPtr)); - *(plan->splan) = pplan; - plan->nplans = 1; + /* Prepare plan for query */ + pplan = SPI_prepare(sql.data, nkeys, argtypes); + if (pplan == NULL) + /* internal error */ + elog(ERROR, "check_primary_key: SPI_prepare returned %s", SPI_result_code_string(SPI_result)); - pfree(sql.data); - } + pfree(sql.data); /* * Ok, execute prepared plan. */ - ret = SPI_execp(*(plan->splan), kvals, NULL, 1); + ret = SPI_execp(pplan, kvals, NULL, 1); /* we have no NULLs - so we pass ^^^^ here */ if (ret < 0) @@ -263,15 +219,15 @@ check_foreign_key(PG_FUNCTION_ARGS) HeapTuple trigtuple = NULL; /* tuple to being changed */ HeapTuple newtuple = NULL; /* tuple to return */ TupleDesc tupdesc; /* tuple description */ - EPlan *plan; /* prepared plan(s) */ + SPIPlanPtr *splan; /* prepared plan(s) */ Oid *argtypes = NULL; /* key types to prepare execution plan */ bool isnull; /* to know is some column NULL or not */ bool isequal = true; /* are keys in both tuples equal (in UPDATE) */ - char ident[2 * NAMEDATALEN]; /* to identify myself */ int is_update = 0; int ret; int i, r; + char **args2; #ifdef DEBUG_QUERY elog(DEBUG4, "check_foreign_key: Enter Function"); @@ -350,24 +306,8 @@ check_foreign_key(PG_FUNCTION_ARGS) */ kvals = (Datum *) palloc(nkeys * sizeof(Datum)); - /* - * Construct ident string as TriggerName $ TriggeredRelationId $ - * OperationType and try to find prepared execution plan(s). - */ - snprintf(ident, sizeof(ident), "%s$%u$%c", trigger->tgname, rel->rd_id, is_update ? 'U' : 'D'); - plan = find_plan(ident, &FPlans, &nFPlans); - - /* if there is no plan(s) then allocate argtypes for preparation */ - if (plan->nplans <= 0) - argtypes = (Oid *) palloc(nkeys * sizeof(Oid)); - - /* - * else - check that we have exactly nrefs plan(s) ready - */ - else if (plan->nplans != nrefs) - /* internal error */ - elog(ERROR, "%s: check_foreign_key: # of plans changed in meantime", - trigger->tgname); + /* allocate argtypes for preparation */ + argtypes = (Oid *) palloc(nkeys * sizeof(Oid)); /* For each column in key ... */ for (i = 0; i < nkeys; i++) @@ -415,140 +355,124 @@ check_foreign_key(PG_FUNCTION_ARGS) isequal = false; } - if (plan->nplans <= 0) /* Get typeId of column */ - argtypes[i] = SPI_gettypeid(tupdesc, fnumber); + /* Get typeId of column */ + argtypes[i] = SPI_gettypeid(tupdesc, fnumber); } args_temp = args; nargs -= nkeys; args += nkeys; + args2 = args; - /* - * If we have to prepare plans ... - */ - if (plan->nplans <= 0) + splan = (SPIPlanPtr *) palloc(nrefs * sizeof(SPIPlanPtr)); + + for (r = 0; r < nrefs; r++) { + StringInfoData sql; SPIPlanPtr pplan; - char **args2 = args; - plan->splan = (SPIPlanPtr *) MemoryContextAlloc(TopMemoryContext, - nrefs * sizeof(SPIPlanPtr)); + initStringInfo(&sql); - for (r = 0; r < nrefs; r++) + relname = args2[0]; + + /*--------- + * For 'R'estrict action we construct SELECT query: + * + * SELECT 1 + * FROM _referencing_relation_ + * WHERE Fkey1 = $1 [AND Fkey2 = $2 [...]] + * + * to check is tuple referenced or not. + *--------- + */ + if (action == 'r') + appendStringInfo(&sql, "select 1 from %s where ", relname); + + /*--------- + * For 'C'ascade action we construct DELETE query + * + * DELETE + * FROM _referencing_relation_ + * WHERE Fkey1 = $1 [AND Fkey2 = $2 [...]] + * + * to delete all referencing tuples. + *--------- + */ + + /* + * Max : Cascade with UPDATE query i create update query that updates + * new key values in referenced tables + */ + + + else if (action == 'c') { - StringInfoData sql; - - initStringInfo(&sql); - - relname = args2[0]; - - /*--------- - * For 'R'estrict action we construct SELECT query: - * - * SELECT 1 - * FROM _referencing_relation_ - * WHERE Fkey1 = $1 [AND Fkey2 = $2 [...]] - * - * to check is tuple referenced or not. - *--------- - */ - if (action == 'r') - appendStringInfo(&sql, "select 1 from %s where ", relname); - - /*--------- - * For 'C'ascade action we construct DELETE query - * - * DELETE - * FROM _referencing_relation_ - * WHERE Fkey1 = $1 [AND Fkey2 = $2 [...]] - * - * to delete all referencing tuples. - *--------- - */ - - /* - * Max : Cascade with UPDATE query i create update query that - * updates new key values in referenced tables - */ - - - else if (action == 'c') + if (is_update == 1) { - if (is_update == 1) - { - int fn; - char *nv; - int k; - - appendStringInfo(&sql, "update %s set ", relname); - for (k = 1; k <= nkeys; k++) - { - fn = SPI_fnumber(tupdesc, args_temp[k - 1]); - Assert(fn > 0); /* already checked above */ - nv = SPI_getvalue(newtuple, tupdesc, fn); - - appendStringInfo(&sql, " %s = %s ", - args2[k], quote_literal_cstr(nv)); - if (k < nkeys) - appendStringInfoString(&sql, ", "); - } - appendStringInfoString(&sql, " where "); - } - else - /* DELETE */ - appendStringInfo(&sql, "delete from %s where ", relname); - } + int fn; + char *nv; + int k; - /* - * For 'S'etnull action we construct UPDATE query - UPDATE - * _referencing_relation_ SET Fkey1 null [, Fkey2 null [...]] - * WHERE Fkey1 = $1 [AND Fkey2 = $2 [...]] - to set key columns in - * all referencing tuples to NULL. - */ - else if (action == 's') - { appendStringInfo(&sql, "update %s set ", relname); - for (i = 1; i <= nkeys; i++) + for (k = 1; k <= nkeys; k++) { - appendStringInfo(&sql, "%s = null", args2[i]); - if (i < nkeys) + fn = SPI_fnumber(tupdesc, args_temp[k - 1]); + Assert(fn > 0); /* already checked above */ + nv = SPI_getvalue(newtuple, tupdesc, fn); + + appendStringInfo(&sql, " %s = %s ", + args2[k], + nv ? quote_literal_cstr(nv) : "NULL"); + if (k < nkeys) appendStringInfoString(&sql, ", "); } appendStringInfoString(&sql, " where "); } + else + /* DELETE */ + appendStringInfo(&sql, "delete from %s where ", relname); + } - /* Construct WHERE qual */ + /* + * For 'S'etnull action we construct UPDATE query - UPDATE + * _referencing_relation_ SET Fkey1 null [, Fkey2 null [...]] WHERE + * Fkey1 = $1 [AND Fkey2 = $2 [...]] - to set key columns in all + * referencing tuples to NULL. + */ + else if (action == 's') + { + appendStringInfo(&sql, "update %s set ", relname); for (i = 1; i <= nkeys; i++) { - appendStringInfo(&sql, "%s = $%d ", args2[i], i); + appendStringInfo(&sql, "%s = null", args2[i]); if (i < nkeys) - appendStringInfoString(&sql, "and "); + appendStringInfoString(&sql, ", "); } + appendStringInfoString(&sql, " where "); + } - /* Prepare plan for query */ - pplan = SPI_prepare(sql.data, nkeys, argtypes); - if (pplan == NULL) - /* internal error */ - elog(ERROR, "check_foreign_key: SPI_prepare returned %s", SPI_result_code_string(SPI_result)); + /* Construct WHERE qual */ + for (i = 1; i <= nkeys; i++) + { + appendStringInfo(&sql, "%s = $%d ", args2[i], i); + if (i < nkeys) + appendStringInfoString(&sql, "and "); + } - /* - * Remember that SPI_prepare places plan in current memory context - * - so, we have to save plan in Top memory context for later use. - */ - if (SPI_keepplan(pplan)) - /* internal error */ - elog(ERROR, "check_foreign_key: SPI_keepplan failed"); + /* Prepare plan for query */ + pplan = SPI_prepare(sql.data, nkeys, argtypes); + if (pplan == NULL) + /* internal error */ + elog(ERROR, "check_foreign_key: SPI_prepare returned %s", SPI_result_code_string(SPI_result)); - plan->splan[r] = pplan; + splan[r] = pplan; - args2 += nkeys + 1; /* to the next relation */ + args2 += nkeys + 1; /* to the next relation */ #ifdef DEBUG_QUERY - elog(DEBUG4, "check_foreign_key Debug Query is : %s ", sql.data); + elog(DEBUG4, "check_foreign_key Debug Query is : %s ", sql.data); #endif - pfree(sql.data); - } - plan->nplans = nrefs; + pfree(sql.data); } /* @@ -573,7 +497,7 @@ check_foreign_key(PG_FUNCTION_ARGS) relname = args[0]; - ret = SPI_execp(plan->splan[r], kvals, NULL, tcount); + ret = SPI_execp(splan[r], kvals, NULL, tcount); /* we have no NULLs - so we pass ^^^^ here */ if (ret < 0) @@ -612,46 +536,3 @@ check_foreign_key(PG_FUNCTION_ARGS) return PointerGetDatum((newtuple == NULL) ? trigtuple : newtuple); } - -static EPlan * -find_plan(char *ident, EPlan **eplan, int *nplans) -{ - EPlan *newp; - int i; - MemoryContext oldcontext; - - /* - * All allocations done for the plans need to happen in a session-safe - * context. - */ - oldcontext = MemoryContextSwitchTo(TopMemoryContext); - - if (*nplans > 0) - { - for (i = 0; i < *nplans; i++) - { - if (strcmp((*eplan)[i].ident, ident) == 0) - break; - } - if (i != *nplans) - { - MemoryContextSwitchTo(oldcontext); - return (*eplan + i); - } - *eplan = (EPlan *) repalloc(*eplan, (i + 1) * sizeof(EPlan)); - newp = *eplan + i; - } - else - { - newp = *eplan = (EPlan *) palloc(sizeof(EPlan)); - (*nplans) = i = 0; - } - - newp->ident = pstrdup(ident); - newp->nplans = 0; - newp->splan = NULL; - (*nplans)++; - - MemoryContextSwitchTo(oldcontext); - return newp; -} diff --git a/contrib/sslinfo/sslinfo.c b/contrib/sslinfo/sslinfo.c index da702011193..9191bbce5dc 100644 --- a/contrib/sslinfo/sslinfo.c +++ b/contrib/sslinfo/sslinfo.c @@ -24,8 +24,8 @@ PG_MODULE_MAGIC_EXT( .version = PG_VERSION ); -static Datum X509_NAME_field_to_text(X509_NAME *name, text *fieldName); -static Datum ASN1_STRING_to_text(ASN1_STRING *str); +static Datum X509_NAME_field_to_text(const X509_NAME *name, text *fieldName); +static Datum ASN1_STRING_to_text(const ASN1_STRING *str); /* * Function context for data persisting over repeated calls. @@ -148,7 +148,7 @@ ssl_client_serial(PG_FUNCTION_ARGS) * function. */ static Datum -ASN1_STRING_to_text(ASN1_STRING *str) +ASN1_STRING_to_text(const ASN1_STRING *str) { BIO *membuf; size_t size; @@ -194,12 +194,12 @@ ASN1_STRING_to_text(ASN1_STRING *str) * part of name */ static Datum -X509_NAME_field_to_text(X509_NAME *name, text *fieldName) +X509_NAME_field_to_text(const X509_NAME *name, text *fieldName) { char *string_fieldname; int nid, index; - ASN1_STRING *data; + const ASN1_STRING *data; string_fieldname = text_to_cstring(fieldName); nid = OBJ_txt2nid(string_fieldname); @@ -209,7 +209,7 @@ X509_NAME_field_to_text(X509_NAME *name, text *fieldName) errmsg("invalid X.509 field name: \"%s\"", string_fieldname))); pfree(string_fieldname); - index = X509_NAME_get_index_by_NID(name, nid, -1); + index = X509_NAME_get_index_by_NID(unconstify(X509_NAME *, name), nid, -1); if (index < 0) return (Datum) 0; data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, index)); @@ -421,8 +421,8 @@ ssl_extension_info(PG_FUNCTION_ARGS) HeapTuple tuple; Datum result; BIO *membuf; - X509_EXTENSION *ext; - ASN1_OBJECT *obj; + const X509_EXTENSION *ext; + const ASN1_OBJECT *obj; int nid; int len; @@ -435,7 +435,7 @@ ssl_extension_info(PG_FUNCTION_ARGS) /* Get the extension from the certificate */ ext = X509_get_ext(cert, call_cntr); - obj = X509_EXTENSION_get_object(ext); + obj = X509_EXTENSION_get_object(unconstify(X509_EXTENSION *, ext)); /* Get the extension name */ nid = OBJ_obj2nid(obj); @@ -448,7 +448,7 @@ ssl_extension_info(PG_FUNCTION_ARGS) nulls[0] = false; /* Get the extension value */ - if (X509V3_EXT_print(membuf, ext, 0, 0) <= 0) + if (X509V3_EXT_print(membuf, unconstify(X509_EXTENSION *, ext), 0, 0) <= 0) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("could not print extension value in certificate at position %d", diff --git a/contrib/test_decoding/expected/permissions.out b/contrib/test_decoding/expected/permissions.out index 8d100646ce6..6e94d7106bd 100644 --- a/contrib/test_decoding/expected/permissions.out +++ b/contrib/test_decoding/expected/permissions.out @@ -29,6 +29,17 @@ SELECT pg_drop_replication_slot('regression_slot'); (1 row) RESET ROLE; +-- no users can load an untrusted plugin +SET output_plugin_libraries = pgoutput; +SET ROLE regress_lr_replication; +SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); +ERROR: library "test_decoding" may not be used as an output plugin +HINT: If it is safe for all REPLICATION users to use this library as an output plugin, add it to "output_plugin_libraries" and reload the server configuration. +RESET ROLE; +SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); +ERROR: library "test_decoding" may not be used as an output plugin +HINT: If it is safe for all REPLICATION users to use this library as an output plugin, add it to "output_plugin_libraries" and reload the server configuration. +RESET output_plugin_libraries; -- replication user can control replication SET ROLE regress_lr_replication; SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); diff --git a/contrib/test_decoding/expected/slot.out b/contrib/test_decoding/expected/slot.out index 7de03c79f6f..cf0136455b0 100644 --- a/contrib/test_decoding/expected/slot.out +++ b/contrib/test_decoding/expected/slot.out @@ -30,8 +30,11 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_t2', 'tes init (1 row) +BEGIN; +SET LOCAL output_plugin_libraries = nonexistent; SELECT pg_create_logical_replication_slot('foo', 'nonexistent'); ERROR: could not access file "nonexistent": No such file or directory +ROLLBACK; -- here we want to start a new session and wait till old one is gone select pg_backend_pid() as oldpid \gset \c - diff --git a/contrib/test_decoding/expected/twophase.out b/contrib/test_decoding/expected/twophase.out index 08a7c56b5df..ea3c51f8215 100644 --- a/contrib/test_decoding/expected/twophase.out +++ b/contrib/test_decoding/expected/twophase.out @@ -227,6 +227,31 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc COMMIT PREPARED 'test_toast_table_access' (1 row) +-- Test that an empty prepared transaction should not be decoded, whether it +-- is committed or rolled back. +BEGIN; +SELECT * FROM test_prepared1 WHERE id = 1 FOR SHARE; + id | data +----+------ + 1 | +(1 row) + +PREPARE TRANSACTION 'test_empty_transaction'; +COMMIT PREPARED 'test_empty_transaction'; +BEGIN; +SELECT * FROM test_prepared1 WHERE id = 1 FOR SHARE; + id | data +----+------ + 1 | +(1 row) + +PREPARE TRANSACTION 'test_empty_transaction'; +ROLLBACK PREPARED 'test_empty_transaction'; +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + data +------ +(0 rows) + -- Test 8: -- cleanup and make sure results are also empty DROP TABLE test_prepared1; diff --git a/contrib/test_decoding/sql/permissions.sql b/contrib/test_decoding/sql/permissions.sql index 94db936aee2..b3d8b1a8e57 100644 --- a/contrib/test_decoding/sql/permissions.sql +++ b/contrib/test_decoding/sql/permissions.sql @@ -15,6 +15,14 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc SELECT pg_drop_replication_slot('regression_slot'); RESET ROLE; +-- no users can load an untrusted plugin +SET output_plugin_libraries = pgoutput; +SET ROLE regress_lr_replication; +SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); +RESET ROLE; +SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); +RESET output_plugin_libraries; + -- replication user can control replication SET ROLE regress_lr_replication; SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); diff --git a/contrib/test_decoding/sql/slot.sql b/contrib/test_decoding/sql/slot.sql index 580e3ae3bef..50a950341fc 100644 --- a/contrib/test_decoding/sql/slot.sql +++ b/contrib/test_decoding/sql/slot.sql @@ -9,7 +9,10 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_p', 'test SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_t2', 'test_decoding', true); +BEGIN; +SET LOCAL output_plugin_libraries = nonexistent; SELECT pg_create_logical_replication_slot('foo', 'nonexistent'); +ROLLBACK; -- here we want to start a new session and wait till old one is gone select pg_backend_pid() as oldpid \gset diff --git a/contrib/test_decoding/sql/twophase.sql b/contrib/test_decoding/sql/twophase.sql index 4b9ef0c0c44..834e5282c30 100644 --- a/contrib/test_decoding/sql/twophase.sql +++ b/contrib/test_decoding/sql/twophase.sql @@ -125,6 +125,18 @@ COMMIT PREPARED 'test_toast_table_access'; -- consume commit prepared SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); +-- Test that an empty prepared transaction should not be decoded, whether it +-- is committed or rolled back. +BEGIN; +SELECT * FROM test_prepared1 WHERE id = 1 FOR SHARE; +PREPARE TRANSACTION 'test_empty_transaction'; +COMMIT PREPARED 'test_empty_transaction'; +BEGIN; +SELECT * FROM test_prepared1 WHERE id = 1 FOR SHARE; +PREPARE TRANSACTION 'test_empty_transaction'; +ROLLBACK PREPARED 'test_empty_transaction'; +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + -- Test 8: -- cleanup and make sure results are also empty DROP TABLE test_prepared1; diff --git a/contrib/xml2/expected/xml2.out b/contrib/xml2/expected/xml2.out index 1906fcf33e2..9078f15f6b3 100644 --- a/contrib/xml2/expected/xml2.out +++ b/contrib/xml2/expected/xml2.out @@ -231,6 +231,14 @@ SELECT xpath_nodeset(article_xml::text, '/article/author|/article/pages', test37 (1 row) +-- namespace node +SELECT xpath_nodeset('', + '//namespace::foo'); + xpath_nodeset +---------------------- + http://icl.com/saxon +(1 row) + -- xpath_list() SELECT xpath_list(article_xml::text, '/article/author|/article/pages') FROM articles; diff --git a/contrib/xml2/expected/xml2_1.out b/contrib/xml2/expected/xml2_1.out index 9a2144d58f5..62e8bd6802a 100644 --- a/contrib/xml2/expected/xml2_1.out +++ b/contrib/xml2/expected/xml2_1.out @@ -175,6 +175,14 @@ SELECT xpath_nodeset(article_xml::text, '/article/author|/article/pages', test37 (1 row) +-- namespace node +SELECT xpath_nodeset('', + '//namespace::foo'); + xpath_nodeset +---------------------- + http://icl.com/saxon +(1 row) + -- xpath_list() SELECT xpath_list(article_xml::text, '/article/author|/article/pages') FROM articles; diff --git a/contrib/xml2/sql/xml2.sql b/contrib/xml2/sql/xml2.sql index 510d18a3679..145c487cbde 100644 --- a/contrib/xml2/sql/xml2.sql +++ b/contrib/xml2/sql/xml2.sql @@ -132,6 +132,9 @@ SELECT xpath_nodeset(article_xml::text, '/article/author|/article/pages', SELECT xpath_nodeset(article_xml::text, '/article/author|/article/pages', 'result', 'item') FROM articles; +-- namespace node +SELECT xpath_nodeset('', + '//namespace::foo'); -- xpath_list() SELECT xpath_list(article_xml::text, '/article/author|/article/pages') diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index 2820874cb5e..9227db36c41 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -149,16 +149,23 @@ pgxmlNodeSetToText(xmlNodeSetPtr nodeset, } else { + xmlNodePtr node = nodeset->nodeTab[i]; + if ((septagname != NULL) && (xmlStrlen(septagname) > 0)) { xmlBufferWriteChar(buf, "<"); xmlBufferWriteCHAR(buf, septagname); xmlBufferWriteChar(buf, ">"); } - xmlNodeDump(buf, - nodeset->nodeTab[i]->doc, - nodeset->nodeTab[i], - 1, 0); + + /* + * XML_NAMESPACE_DECL nodes are xmlNs structs, that cannot + * be processed by xmlNodeDump(). + */ + if (node->type == XML_NAMESPACE_DECL) + xmlBufferWriteCHAR(buf, xmlXPathCastNodeToString(node)); + else + xmlNodeDump(buf, node->doc, node, 1, 0); if ((septagname != NULL) && (xmlStrlen(septagname) > 0)) { diff --git a/doc/src/sgml/amcheck.sgml b/doc/src/sgml/amcheck.sgml index 08639a6d707..2cdffefeeab 100644 --- a/doc/src/sgml/amcheck.sgml +++ b/doc/src/sgml/amcheck.sgml @@ -587,12 +587,13 @@ B-Tree検証関数のheapallindexed引数がtrue -amcheckは、データチェックサムが検知できないような、様々なタイプの障害モードを効果的に検知できます。 +《マッチ度[70.621469]》amcheckは、データチェックサムが検知できないような、様々なタイプの障害モードを効果的に検知できます。 以下のようなものがあります。 +《機械翻訳》amcheckデータチェックサムがキャッチに対して失敗するさまざまなタイプの障害モードを検出するのに効果的です。 +これらのinclude:。 diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 65f1e0c7527..bd0f0036a87 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1754,6 +1754,24 @@ SCRAM-SHA-256を使用してパスワードを暗号化するときに実行さ 反復カウントは暗号化時に固定されるため、値を変更してもSCRAM-SHA-256で暗号化された既存のパスワードには影響しません。 変更された値を有効にするには、新しいパスワードを設定する必要があります。 + + + +《機械翻訳》ロールパスワードがpostgresql.confカウントまたはファイルで指定されたの値とは異なる反復サーバコマンドラインで作成された場合、認証されていないユーザは、コネクションの試行に対するサーバの応答の不一致を観察することでロールの存在を識別できます。 +これが問題となる場合は、すべてのロールパスワードがpostgresql.confファイルまたはサーバコマンドラインで指定された値に設定されたで作成された保証を確認します。 +scram_iterations scram_iterations + + @@ -2318,25 +2336,31 @@ TLSバージョン1.3を使用する接続についてはTLS though, and many supported group names and aliases are omitted. --> -最も一般的な曲線のOpenSSL名は、prime256v1(NIST P-256)、secp384r1(NIST P-384)、およびsecp521r1(NIST P-521)です。 +《マッチ度[82.232346]》最も一般的な曲線のOpenSSL名は、prime256v1(NIST P-256)、secp384r1(NIST P-384)、およびsecp521r1(NIST P-521)です。 openssl ecparam -list_curvesコマンドを使用すると、使用可能なグループの不完全なリストを表示することができます。 ただし、すべてがTLSで使用できるわけではなく、サポートされているグループ名と別名の多くは省略されています。 +《機械翻訳》最も一般的なグループのOpenSSL名は、prime256v1 NIST P-256、secp384r1 NIST P-384、secp521r1 NIST P-521です。 +使用可能なグループの不完全なリストは、コマンドOpenSSL ecparam -list_curvesで表示できます。 +すべてのグループがTLSで使用できるわけではありませんが、サポートされているSSL名とエイリアスの多くは省略されています。 @@ -5213,15 +5240,23 @@ WALの更新をディスクへ強制するのに使用される方法です。 was compiled with ) and zstd (if PostgreSQL was compiled with ). + The value on is a historical spelling of pglz. The default value is off. Only superusers and users with the appropriate SET privilege can change this setting. --> -このパラメータは、指定された圧縮方式を使用したWALの圧縮を有効にします。 +《マッチ度[77.751756]》このパラメータは、指定された圧縮方式を使用したWALの圧縮を有効にします。 有効にすると、PostgreSQLサーバはWALに書き込まれる全ページイメージを圧縮します(例えば、がオンの時やベースバックアップ中です)。 圧縮されたページイメージはWAL再生中に伸長されます。 サポートされている方法はpglzlz4PostgreSQLでコンパイルされた場合)およびzstdPostgreSQLでコンパイルされた場合)です。 デフォルト値はoffです。 +スーパーユーザと適切なSET権限を持つユーザのみがこの設定を変更できます。 +《機械翻訳》このパラメータは、指定された圧縮メソッドを使用したWALの圧縮を有効にします。 +有効になっている場合、PostgreSQLサーバはWALに書き込まれたフルページイメージを圧縮しますがオンの場合、ベースバックアップ中など。 +圧縮されたページイメージはWALリプレイ中に解凍されます。 +サポートされている方法は、pglz,lz4PostgreSQLでコンパイルされた場合とzstdPostgreSQLでコンパイルされた場合です。 +値onpglzの歴史的な綴りです。 +デフォルト値はoffです。 スーパーユーザと適切なSET権限を持つユーザのみがこの設定を変更できます。 @@ -6922,6 +6957,90 @@ WAL要約は、先行するバックアップと新しいバックアップの + + output_plugin_libraries (string) + + output_plugin_libraries configuration parameter + + + + + +《機械翻訳》にインストールされているライブラリのうち、トラステッドクライアントがロジカルのアウトプットプラグインとして使用するためにレプリケーションでもあるライブラリを一覧表示します。 +他のライブラリに対するロジカルデコーディングまたはレプリケーションの要求は拒否されます。 +すべてのユーザはこの制限のサブジェクトです。 +デフォルトは'pgoutput, test_decoding'です。 +これらは標準PostgreSQLディストリビューションに含まれている2つのロジカルアウトプットプラグインです。 + + + +《機械翻訳》フォーマットは、カンマで区切られたライブラリ名のリストです。 +各名前はLOADコマンドと同様に解釈されます(ただし、ロジカルデコーディングクライアントは、ケースやパスの構造に違いがなく、リスト内のエントリと正確に一致するプラグイン名前を指定する必要があります)。 +エントリ間の空白は無視されます。 +名前内でincludeの空白またはカンマが必要な場合は、ライブラリ名前を二重引用符で囲みます。 + + + +《機械翻訳》このサーバに追加されたライブラリが保証にロードされる際に、非スーパーユーザに意図せず追加の権限を与えないようにすることは、リストの管理者の責任です。 +サーバ + + + + +《機械翻訳》output_plugin_libraries更新を持たないバージョンからサーバをパラメータする場合、次の問い合わせは、すべての永続論理レプリケーションスロットで必要とされるプラグインのリストをヘルプコンストラクトすることができます。 + +SELECT DISTINCT plugin FROM pg_replication_slots WHERE plugin IS NOT NULL; + + +《機械翻訳》安全前調整のためにリストを注意深くレビューしてくださいoutput_plugin_libraries。 + + + +《機械翻訳》上記の問い合わせでは、過去に一部のディスプレイのレプリケーションスロットに正常に追加されたプラグインのみをポイントで使用できます。 +新たに拒否されたリクエストは、次のようなメッセージでログに表示されます。 + +ERROR: library "..." may not be used as an output plugin +DETAIL: The configuration parameter "output_plugin_libraries" (currently 'pgoutput, test_decoding') does not name this library as a trusted output plugin. +HINT: If it is safe for all REPLICATION users to use this library as an output plugin, add it to "output_plugin_libraries" and reload the server configuration. + + + + + + wal_keep_size (integer) @@ -12100,13 +12219,16 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' -この設定は、および関連設定の結果を表示するログメッセージにのみ影響します。 +《マッチ度[82.594937]》この設定は、および関連設定の結果を表示するログメッセージにのみ影響します。 ゼロ以外の値の設定は、とりわけパラメータがバイナリ形式で送信される際に多少のオーバーヘッドをもたらします。 テキストへの変換が必要になるからです。 +《機械翻訳》この設定は、および関連する設定の結果として印刷されるログメッセージにのみ影響します。 +この設定のゼロ以外の値は、特にパラメータがバイナリフォームで送信される場合、テキストへのオーバーヘッドが必要になるため、いくらかの変換を追加します。 @@ -19007,9 +19129,10 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) -が有効の時のみ効果があります。 +《マッチ度[63.291139]》が有効の時のみ効果があります。 +《機械翻訳》データチェックサムが有効になっている場合のみ有効です。 +《機械翻訳》ロールパスワードがpostgresql.confカウントまたはファイルで指定されたの値とは異なる反復サーバコマンドラインで作成された場合、認証されていないユーザは、コネクションの試行に対するサーバの応答の不一致を観察することでロールの存在を識別できます。 +これが問題となる場合は、すべてのロールパスワードがpostgresql.confファイルまたはサーバコマンドラインで指定された値に設定されたで作成された保証を確認します。 +scram_iterations scram_iterations + + @@ -2326,25 +2344,31 @@ TLSバージョン1.3を使用する接続についてはTLS though, and many supported group names and aliases are omitted. --> -最も一般的な曲線のOpenSSL名は、prime256v1(NIST P-256)、secp384r1(NIST P-384)、およびsecp521r1(NIST P-521)です。 +《マッチ度[82.232346]》最も一般的な曲線のOpenSSL名は、prime256v1(NIST P-256)、secp384r1(NIST P-384)、およびsecp521r1(NIST P-521)です。 openssl ecparam -list_curvesコマンドを使用すると、使用可能なグループの不完全なリストを表示することができます。 ただし、すべてがTLSで使用できるわけではなく、サポートされているグループ名と別名の多くは省略されています。 +《機械翻訳》最も一般的なグループのOpenSSL名は、prime256v1 NIST P-256、secp384r1 NIST P-384、secp521r1 NIST P-521です。 +使用可能なグループの不完全なリストは、コマンドOpenSSL ecparam -list_curvesで表示できます。 +すべてのグループがTLSで使用できるわけではありませんが、サポートされているSSL名とエイリアスの多くは省略されています。 diff --git a/doc/src/sgml/config1.sgml b/doc/src/sgml/config1.sgml index 724c4f69017..3ab97796166 100644 --- a/doc/src/sgml/config1.sgml +++ b/doc/src/sgml/config1.sgml @@ -679,15 +679,23 @@ WALの更新をディスクへ強制するのに使用される方法です。 was compiled with ) and zstd (if PostgreSQL was compiled with ). + The value on is a historical spelling of pglz. The default value is off. Only superusers and users with the appropriate SET privilege can change this setting. --> -このパラメータは、指定された圧縮方式を使用したWALの圧縮を有効にします。 +《マッチ度[77.751756]》このパラメータは、指定された圧縮方式を使用したWALの圧縮を有効にします。 有効にすると、PostgreSQLサーバはWALに書き込まれる全ページイメージを圧縮します(例えば、がオンの時やベースバックアップ中です)。 圧縮されたページイメージはWAL再生中に伸長されます。 サポートされている方法はpglzlz4PostgreSQLでコンパイルされた場合)およびzstdPostgreSQLでコンパイルされた場合)です。 デフォルト値はoffです。 +スーパーユーザと適切なSET権限を持つユーザのみがこの設定を変更できます。 +《機械翻訳》このパラメータは、指定された圧縮メソッドを使用したWALの圧縮を有効にします。 +有効になっている場合、PostgreSQLサーバはWALに書き込まれたフルページイメージを圧縮しますがオンの場合、ベースバックアップ中など。 +圧縮されたページイメージはWALリプレイ中に解凍されます。 +サポートされている方法は、pglz,lz4PostgreSQLでコンパイルされた場合とzstdPostgreSQLでコンパイルされた場合です。 +値onpglzの歴史的な綴りです。 +デフォルト値はoffです。 スーパーユーザと適切なSET権限を持つユーザのみがこの設定を変更できます。 @@ -2388,6 +2396,90 @@ WAL要約は、先行するバックアップと新しいバックアップの + + output_plugin_libraries (string) + + output_plugin_libraries configuration parameter + + + + + +《機械翻訳》にインストールされているライブラリのうち、トラステッドクライアントがロジカルのアウトプットプラグインとして使用するためにレプリケーションでもあるライブラリを一覧表示します。 +他のライブラリに対するロジカルデコーディングまたはレプリケーションの要求は拒否されます。 +すべてのユーザはこの制限のサブジェクトです。 +デフォルトは'pgoutput, test_decoding'です。 +これらは標準PostgreSQLディストリビューションに含まれている2つのロジカルアウトプットプラグインです。 + + + +《機械翻訳》フォーマットは、カンマで区切られたライブラリ名のリストです。 +各名前はLOADコマンドと同様に解釈されます(ただし、ロジカルデコーディングクライアントは、ケースやパスの構造に違いがなく、リスト内のエントリと正確に一致するプラグイン名前を指定する必要があります)。 +エントリ間の空白は無視されます。 +名前内でincludeの空白またはカンマが必要な場合は、ライブラリ名前を二重引用符で囲みます。 + + + +《機械翻訳》このサーバに追加されたライブラリが保証にロードされる際に、非スーパーユーザに意図せず追加の権限を与えないようにすることは、リストの管理者の責任です。 +サーバ + + + + +《機械翻訳》output_plugin_libraries更新を持たないバージョンからサーバをパラメータする場合、次の問い合わせは、すべての永続論理レプリケーションスロットで必要とされるプラグインのリストをヘルプコンストラクトすることができます。 + +SELECT DISTINCT plugin FROM pg_replication_slots WHERE plugin IS NOT NULL; + + +《機械翻訳》安全前調整のためにリストを注意深くレビューしてくださいoutput_plugin_libraries。 + + + +《機械翻訳》上記の問い合わせでは、過去に一部のディスプレイのレプリケーションスロットに正常に追加されたプラグインのみをポイントで使用できます。 +新たに拒否されたリクエストは、次のようなメッセージでログに表示されます。 + +ERROR: library "..." may not be used as an output plugin +DETAIL: The configuration parameter "output_plugin_libraries" (currently 'pgoutput, test_decoding') does not name this library as a trusted output plugin. +HINT: If it is safe for all REPLICATION users to use this library as an output plugin, add it to "output_plugin_libraries" and reload the server configuration. + + + + + + wal_keep_size (integer) diff --git a/doc/src/sgml/config2.sgml b/doc/src/sgml/config2.sgml index 63937b1adf7..da07cee7149 100644 --- a/doc/src/sgml/config2.sgml +++ b/doc/src/sgml/config2.sgml @@ -2348,13 +2348,16 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' -この設定は、および関連設定の結果を表示するログメッセージにのみ影響します。 +《マッチ度[82.594937]》この設定は、および関連設定の結果を表示するログメッセージにのみ影響します。 ゼロ以外の値の設定は、とりわけパラメータがバイナリ形式で送信される際に多少のオーバーヘッドをもたらします。 テキストへの変換が必要になるからです。 +《機械翻訳》この設定は、および関連する設定の結果として印刷されるログメッセージにのみ影響します。 +この設定のゼロ以外の値は、特にパラメータがバイナリフォームで送信される場合、テキストへのオーバーヘッドが必要になるため、いくらかの変換を追加します。 diff --git a/doc/src/sgml/config3.sgml b/doc/src/sgml/config3.sgml index 23bbfa76375..d988d887fa8 100644 --- a/doc/src/sgml/config3.sgml +++ b/doc/src/sgml/config3.sgml @@ -3992,9 +3992,10 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) -が有効の時のみ効果があります。 +《マッチ度[63.291139]》が有効の時のみ効果があります。 +《機械翻訳》データチェックサムが有効になっている場合のみ有効です。 -check_primary_key()およびcheck_foreign_key()は、外部キー制約を検査するために使用されます。 +《マッチ度[75.218659]》check_primary_key()およびcheck_foreign_key()は、外部キー制約を検査するために使用されます。 (当然ながら、この機能はかなり前に組み込みの外部キー機能に取って代わりました。しかし例としてはまだ有用です。) +《機械翻訳》check_primary_key()check_foreign_key()はチェック外部キー制約に使用されます。 +(この機能は、もちろん組み込みの外部キーメカニズムに取って代わられてからかなり経っていますが、このモジュールは例として今でも有用です。 +このモジュールはPostgreSQL20.で削除されます。 + + + +《機械翻訳》refintには、セキュアスキーマ使用パターンタイプと、データが記名的である等価演算子タイプが必要です=. + + + +《機械翻訳》check_primary_key()被参照テーブル名前とカラム名前の引数は、内部で生成されたSQL文にそのままコピーされるため、CREATE TRIGGERコマンドで必要に応じてユーザで二重引用符で囲む必要があります。 +SQL識別子の引用符付けの詳細は、を参照してください。 +逆に、参照テーブル列名前の引数は二重引用符で囲む必要はありません。 +check_primary_key():の正しい使用方法については、次の模擬例を参照してください。 + +CREATE TRIGGER mytrigger +AFTER INSERT OR UPDATE ON referencing_table +FOR EACH ROW EXECUTE PROCEDURE +check_primary_key ( + 'column A', 'column B', -- referencing table columns + 'myschema."referenced table"', -- referenced table + '"column A"', '"column B"' -- referenced table columns +); + + + + -check_foreign_key()は被参照テーブルを検査します。 +《マッチ度[94.533030]》check_foreign_key()は被参照テーブルを検査します。 使用方法は、この関数を使用するAFTER DELETE OR UPDATEトリガを他のテーブルで参照されるテーブルに作成することです。 トリガ引数は、この関数が検査を実行しなければならない参照テーブル数、参照キーが見つかった場合の動作(cascade — 参照行を削除、restrict — 参照キーが存在する場合トランザクションをアボート、setnull —参照キーフィールドをNULLに設定)、主/一意キーを形成するトリガを発行したテーブルの列名、参照テーブルの名前と列名(最初の引数で指定された数のテーブル分繰り返す)です。 主/一意キー列はNOT NULLと指定されていなければならず、また、一意性インデックスを持つべきであることに注意してください。 + + + +《機械翻訳》check_foreign_key()参照テーブル名前とカラム名前の引数は、内部で生成されたSQL文にそのままコピーされるため、CREATE TRIGGERコマンドで必要に応じてユーザで二重引用符で囲む必要があります。 +SQL識別子の引用符付けの詳細は、を参照してください。 +逆に、被参照テーブル列名前の引数は二重引用符で囲む必要はありません。 +check_foreign_key():の正しい使用方法については、次の模擬例を参照してください。 + + +CREATE TRIGGER mytrigger +AFTER DELETE OR UPDATE ON referenced_table +FOR EACH ROW EXECUTE PROCEDURE +check_foreign_key ( + 1, -- number of referencing tables + 'cascade', -- action + 'column A', 'column B', -- referenced table columns + 'myschema."referencing table"', -- referencing table + '"column A"', '"column B"' -- referencing table columns +); + + + + -外部データラッパーdblink_fdwには、追加のブールオプションuse_scram_passthroughがあり、dblinkがSCRAMパススルー認証を使用してリモートデータベースに接続するかどうかを制御します。 +《マッチ度[80.746089]》外部データラッパーdblink_fdwには、追加のブールオプションuse_scram_passthroughがあり、dblinkがSCRAMパススルー認証を使用してリモートデータベースに接続するかどうかを制御します。 SCRAMパススルー認証では、dblinkはプレーンテキストユーザパスワードの代わりにSCRAMハッシュ化されたシークレットを使用してリモートサーバに接続します。 これにより、プレーンテキストユーザパスワードがPostgreSQLシステムカタログに格納されるのを回避します。 詳細と制限については、postgres_fdwの相当するuse_scram_passthroughオプションの文書を参照してください。 +《機械翻訳》外部データラッパーdblink_fdwには、追加のブールオプションがありますuse_scram_passthroughdblinkがSCRAMパススルー認証を使用してリモートデータベースに接続するかどうかを制御します。 +これは外部サーバまたはユーザマッピングに対して指定できます。 +ユーザマッピング設定は外部サーバ設定を上書きします。 +SCRAMパススルー認証では、dblinkSCRAMでハッシュされたシークレット代わりプレーンテキストユーザパスワードを使用してリモートサーバに接続します。 +これにより、プレーンテキストユーザパスワードがPostgreSQLシステムカタログに格納されるのを回避できます。 +詳細と制限については、POSTGRES_fdwの同等のuse_scram_passthroughオプションの文書を参照してください。 diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml index c8e7044f4ad..14dd6a88f52 100644 --- a/doc/src/sgml/ddl.sgml +++ b/doc/src/sgml/ddl.sgml @@ -3195,9 +3195,16 @@ REVOKE ALL ON accounts FROM PUBLIC; -テーブルあるいはテーブルの特定の列を参照する外部キー制約を作ることを許可します。 + table, or specific column(s) of a table. Great care should be taken when + granting this privilege, since a user who creates a foreign key can arrange + for enforcement of that foreign key to call an arbitrary function, such as + a cast function, and such functions will be called with the privileges of + the table owner. +--> +《機械翻訳》テーブルの外部キー制約参照、またはテーブルの特定のカラムを作成することができます。 +この権限を付与する際には十分な注意が必要です。 +ユーザを作成した外部キーは、キャスト関数のような任意の関数を呼び出しに強制するように調整することができ、そのような関数はテーブル所有者の権限で呼び出されるからです。 +外部キー @@ -3207,9 +3214,12 @@ REVOKE ALL ON accounts FROM PUBLIC; -テーブルあるいはビューにトリガを作ることを許可します。 +《機械翻訳》テーブルやビューなどにトリガを作成することを許可します。 +テーブルや権限に追加されたトリガはそれを変更するユーザの権限で実行されるため、このビューを付与する際には十分な注意が必要です。 diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml index 584f10e3c3e..5e7f4724f5d 100644 --- a/doc/src/sgml/ecpg.sgml +++ b/doc/src/sgml/ecpg.sgml @@ -10309,7 +10309,7 @@ EXEC SQL EXECUTE IMMEDIATE :command; -GET DESCRIPTOR descriptor_name :cvariable = descriptor_header_item [, ... ] +GET DESCRIPTOR descriptor_name :cvariable = descriptor_header_item GET DESCRIPTOR descriptor_name VALUE column_number :cvariable = descriptor_item [, ... ] @@ -10336,17 +10336,22 @@ GET DESCRIPTOR descriptor_name VALU -このコマンドには2つの構文があります。 +《マッチ度[89.488636]》このコマンドには2つの構文があります。 1番目の構文では、そのまま結果セットに適用されている記述子のヘッダ項目を取り出します。 行数が1つの例です。 列番号を追加のパラメータとして必要とする2番目の構文では特定の列に関する情報を取り出します。 例えば、列名と列の実際の値です。 +《機械翻訳》このコマンドには2つの形式があります。 +最初のフォームは、結果セット全体に適用されるディスクリプタヘッダアイテムを取得します。 +1つ目の例は行カウントです。 +2つ目のフォームは、追加パラメータとしてカラム番号を必要とし、特定のカラムに関する情報を取得します。 +たとえば、カラム名前や実際のカラム値などです。 @@ -11015,7 +11020,7 @@ EXEC SQL SET CONNECTION = con1; -SET DESCRIPTOR descriptor_name descriptor_header_item = value [, ... ] +SET DESCRIPTOR descriptor_name descriptor_header_item = value SET DESCRIPTOR descriptor_name VALUE number descriptor_item = value [, ...] diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index b6c05e33c71..7bc1e605b32 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -6621,7 +6621,8 @@ cast(-1234 as bytea) \xfffffb2e Bitwise shift left (string length is preserved) --> -ビット単位の左シフト(文字列長は保存されます) +《マッチ度[65.957447]》ビット単位の左シフト(文字列長は保存されます) +《機械翻訳》ビット単位のシフトレフト(文字列長さは保持されます)。 B'10001' << 3 @@ -6639,7 +6640,8 @@ cast(-1234 as bytea) \xfffffb2e Bitwise shift right (string length is preserved) --> -ビット単位の右シフト(文字列長は保存されます) +《マッチ度[66.666667]》ビット単位の右シフト(文字列長は保存されます) +《機械翻訳》ビット単位のシフト右(文字列長さは保持されます)。 B'10001' >> 2 @@ -18978,10 +18980,20 @@ OIDで指定したパーサが認識できるトークンの型を記述する sub-millisecond timestamp + random. The optional parameter shift will shift the computed timestamp by the given interval. ---> -バージョン7(時間順)のUUIDを生成します。 -タイムスタンプは、ミリ秒精度のUNIXタイムスタンプ+サブミリ秒のタイムスタンプ+ランダム値を使用して計算されます。 -オプションのパラメータshiftは、計算されたタイムスタンプを指定されたintervalだけシフトします。 + Infinite interval values are not accepted. + The shifted timestamp must fall within the range supported by + UUID version 7's 48-bit millisecond timestamp field: from + 1970-01-01 00:00:00 UTC to approximately year 10889. + An error is raised if the resulting timestamp is outside this + range. +--> +《機械翻訳》バージョン7 shift時間順UUIDを生成します。 +タイムスタンプは、UNIXタイムスタンプを使用して、ミリ秒精度+サブ-ミリ秒タイムスタンプ+ランダムで計算されます。 +オプショナルパラメータは、指定されたインターバルによって計算されたタイムスタンプをシフトします。 +無限インターバルの値は受け入れられません。 +シフトされたタイムスタンプは、UUIDバージョン7の48-ビット(1970-01-01 00:00:00 UTCから約10889年まで)でサポートされるレンジの範囲内にある必要があります。 +生成されたがこのの外にある場合は、が発生します。 +レンジミリ秒エラーフィールドタイムスタンプタイムスタンプ uuidv7() @@ -33773,23 +33785,6 @@ PUBLIC仮想ロールは実在するロールのメンバには決してなれ t - - - - aclitem[] ~ aclitem - boolean - - - -これは@>の廃止予定の別名です。 - - - '{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*/hobbes'::aclitem - t - - diff --git a/doc/src/sgml/func1.sgml b/doc/src/sgml/func1.sgml index d81dca39782..7f51c4feee4 100644 --- a/doc/src/sgml/func1.sgml +++ b/doc/src/sgml/func1.sgml @@ -6552,7 +6552,8 @@ cast(-1234 as bytea) \xfffffb2e Bitwise shift left (string length is preserved) --> -ビット単位の左シフト(文字列長は保存されます) +《マッチ度[65.957447]》ビット単位の左シフト(文字列長は保存されます) +《機械翻訳》ビット単位のシフトレフト(文字列長さは保持されます)。 B'10001' << 3 @@ -6570,7 +6571,8 @@ cast(-1234 as bytea) \xfffffb2e Bitwise shift right (string length is preserved) --> -ビット単位の右シフト(文字列長は保存されます) +《マッチ度[66.666667]》ビット単位の右シフト(文字列長は保存されます) +《機械翻訳》ビット単位のシフト右(文字列長さは保持されます)。 B'10001' >> 2 diff --git a/doc/src/sgml/func2.sgml b/doc/src/sgml/func2.sgml index be322f847bb..767b92b7367 100644 --- a/doc/src/sgml/func2.sgml +++ b/doc/src/sgml/func2.sgml @@ -8502,10 +8502,20 @@ OIDで指定したパーサが認識できるトークンの型を記述する sub-millisecond timestamp + random. The optional parameter shift will shift the computed timestamp by the given interval. ---> -バージョン7(時間順)のUUIDを生成します。 -タイムスタンプは、ミリ秒精度のUNIXタイムスタンプ+サブミリ秒のタイムスタンプ+ランダム値を使用して計算されます。 -オプションのパラメータshiftは、計算されたタイムスタンプを指定されたintervalだけシフトします。 + Infinite interval values are not accepted. + The shifted timestamp must fall within the range supported by + UUID version 7's 48-bit millisecond timestamp field: from + 1970-01-01 00:00:00 UTC to approximately year 10889. + An error is raised if the resulting timestamp is outside this + range. +--> +《機械翻訳》バージョン7 shift時間順UUIDを生成します。 +タイムスタンプは、UNIXタイムスタンプを使用して、ミリ秒精度+サブ-ミリ秒タイムスタンプ+ランダムで計算されます。 +オプショナルパラメータは、指定されたインターバルによって計算されたタイムスタンプをシフトします。 +無限インターバルの値は受け入れられません。 +シフトされたタイムスタンプは、UUIDバージョン7の48-ビット(1970-01-01 00:00:00 UTCから約10889年まで)でサポートされるレンジの範囲内にある必要があります。 +生成されたがこのの外にある場合は、が発生します。 +レンジミリ秒エラーフィールドタイムスタンプタイムスタンプ uuidv7() diff --git a/doc/src/sgml/func4.sgml b/doc/src/sgml/func4.sgml index cc921091af0..eee73c76028 100644 --- a/doc/src/sgml/func4.sgml +++ b/doc/src/sgml/func4.sgml @@ -2792,23 +2792,6 @@ PUBLIC仮想ロールは実在するロールのメンバには決してなれ t - - - - aclitem[] ~ aclitem - boolean - - - -これは@>の廃止予定の別名です。 - - - '{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*/hobbes'::aclitem - t - - diff --git a/doc/src/sgml/libpq2.sgml b/doc/src/sgml/libpq2.sgml index 962cf239a50..3002ba0399b 100644 --- a/doc/src/sgml/libpq2.sgml +++ b/doc/src/sgml/libpq2.sgml @@ -1006,11 +1006,11 @@ int PQrequestCancel(PGconn *conn); with binary transmission of parameters and results substitutes for a fast-path function call. --> -《機械翻訳》このインタフェースは安全ではないため、使用しないでください。 +このインタフェースは安全ではないため、使用しないでください。 result_is_int0に設定されている場合、PQfnは、要求されたバイト数に対してデータに十分なスペースがあるかどうかにかかわらず、result_bufの末尾を超えてバッファを書き込むことができます。 さらに、これは廃止されました。 -関数呼び出しを定義するためにプリペアド文を設定することによって、同様のパフォーマンスおよびより大きな機能を達成できます。 -次に、パラメータおよび結果のバイナリ伝送を伴うステートメントを実行すると、fast-パス関数呼び出しの代わりになります。 +関数呼び出しを定義するためにプリペアド文を設定することによって、同等のパフォーマンスおよびより多くの機能を得られるからです。 +そして、パラメータおよび結果のバイナリ伝送を伴うステートメントを実行すると、近道関数呼び出しの代わりになります。 diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index 81c864485e0..8c0f07a4dec 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -3267,6 +3267,19 @@ WAL送信プロセスはWALのロジカルデコーディング(pg_hba.confで設定され、 LOGIN属性を持つ必要があります。 + + +《機械翻訳》レプリケーション名前で使用される出力用プラグインのコネクションは、サーバのに含まれている必要があります(サブスクリプションの場合、使用されるプラグイン名前はpgoutput.です。 +スーパーユーザは、options=-coutput_plugin_libraries=...をコネクショントラステッドに含めることで、コネクションごとに文字列リストを変更できます。 + + -古いクラスタのスロットで参照される出力プラグインは、新しいPostgreSQLの実行ファイル格納ディレクトリにインストールする必要があります。 +《機械翻訳》古い被参照のスロットにあるクラスタの出力プラグインは、新しいPostgreSQLの実行可能ディレクトリにインストールする必要があります。 +また、新しいクラスタのにも含める必要があります。 +安全に関する情報については、そのパラメータの文書を参照してください。 diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index f2d33b80f34..1c32339117e 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -1045,7 +1045,7 @@ HINT: To avoid XID assignment failures, execute a database-wide VACUUM in that こうした警告も無視し続け、周回するまでのトランザクションが300万より少なくなると、システムは新しいXIDの割り当てを拒絶します。 -ERROR: database is not accepting commands that assign new XIDs to avoid wraparound data loss in database "mydb" +ERROR: database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database "mydb" HINT: Execute a database-wide VACUUM in that database. @@ -1069,40 +1069,50 @@ HINT: Execute a database-wide VACUUM in that database. -古いプリペアドトランザクションを解決します。 +《マッチ度[82.068966]》古いプリペアドトランザクションを解決します。 pg_prepared_xactsのage(transactionid)が大きい行を確認して見つけることができます。 -このようなトランザクションはコミットまたはロールバックされるべきです。 +このようなトランザクションはコミットまたはロールバックされるべきです。 +《機械翻訳》古い準備されたトランザクションを解決します。 +age(transactionid)がプリペアドである行に対してpg_ラージ_xactsをチェックすることで、これらを見つけることができます。 +このようなトランザクションはコミットもしくはロールバックされるべきです。 -長時間実行されているオープントランザクションを終了します。 +《マッチ度[85.885167]》長時間実行されているオープントランザクションを終了します。 pg_stat_activityでage(backend_xid)またはage(backend_xmin)が大きい行を確認して、これらを見つけることができます。 -このようなトランザクションはコミットまたはロールバックするか、pg_terminate_backendを使用してセッションを終了できます。 +このようなトランザクションはコミットまたはロールバックするか、pg_terminate_backendを使用してセッションを終了できます。 +《機械翻訳》長時間実行されたオープントランザクションを終了します。 +pg_stat_activityage(backend_xid)またはage(backend_xmin)はラージです。 +このようなトランザクションはコミットもしくはロールバックされるか、pg_terminate_backendを使用してセッションを終了することができます。 -古いレプリケーションスロットを削除します。 +《マッチ度[81.102362]》古いレプリケーションスロットを削除します。 pg_stat_replicationを使用してage(xmin)またはage(catalog_xmin)が大きいスロットを見つけます。 多くの場合、そのようなスロットは、もはや存在しないか長い間ダウンしているサーバへのレプリケーションのために作成されたものです。 -存在するサーバに対してスロットを削除しても、そのスロットに接続しようとする可能性がある場合、そのレプリカは再構築する必要があるでしょう。 +存在するサーバに対してスロットを削除しても、そのスロットに接続しようとする可能性がある場合、そのレプリカは再構築する必要があるでしょう。 +《機械翻訳》古いレプリケーションスロットを削除します。 +pg_レプリケーション_slotsを使用して、age(xmin)またはage(catalog_xmin)はラージです。 +多くの場合、このようなスロットは、すでに存在しない、または長期間レプリケーションであったサーバへのダウンのために作成されました。 +まだ存在し、そのスロットに接続するためにトライである可能性があるサーバのスロットを削除した場合、そのレプリカは再構築が必要になる可能性があります。 +《機械翻訳》トランザクションIDの周回とは異なり、レプリケーションスロットはmultixactクリーンアップを直接抑制しません。 +したがって、古いレプリケーションスロットを削除することは、通常、マルチトランザクションIDの周回問題の解決には関係ありません。 + + -shutdown_cbコールバックは、接続に関連付けられたバックエンドプロセスが終了するときに実行されます。 +《マッチ度[78.723404]》shutdown_cbコールバックは、接続に関連付けられたバックエンドプロセスが終了するときに実行されます。 検証器モジュールにメモリを割り当てられた状態がある場合、このコールバックはリソースリークを回避するためにフリーする必要があります。 +《機械翻訳》shutdown_cbコールバックは、サーババックエンドがコネクションのトークンの検証を完了したときに実行されます。 +バリデータモジュールに割り当てられた状態がある場合、このコールバックはリソースリークを回避するためにそれをフリーする必要があります。 typedef void (*ValidatorShutdownCB) (ValidatorModuleState *state); diff --git a/doc/src/sgml/pgcrypto.sgml b/doc/src/sgml/pgcrypto.sgml index 99a86a62272..b6499aed33b 100644 --- a/doc/src/sgml/pgcrypto.sgml +++ b/doc/src/sgml/pgcrypto.sgml @@ -1524,6 +1524,50 @@ Applies to: pgp_sym_encrypt, pgp_pub_encrypt 値: 0, 1 デフォルト: 0 適用範囲: pgp_sym_encrypt, pgp_pub_encrypt + + + + + ignore-cipher-failure + + + +《機械翻訳》Dangerous!使用中のOpenSSL暗号の失敗を完全に無視することにより、pgcryptoに不正な復号化アルゴリズムマッチングを使用するように指示します。 +これは、使用中のOpenSSL設定でcipher-algoが利用できなかった場合に作成された、誤って暗号化されたメッセージを回復する必要があるユーザのみを対象としています。 +このような不正なメッセージは、ignore-cipher-failureが有効になっている場合は正しい復号化キーを必要としないため、復号化された平文が実際にキーのホルダーから発信されたものであるという保証はありません。 +14663 2026 + + + +《機械翻訳》正しく暗号化されたメッセージのケースと、それを生成した暗号が現在OpenSSL設定では利用できないことを対比させてください。 +このような平文をpgcryptoを介して回復するには、例の場合、適切なプロバイダを有効にすることによって、実際の暗号をOpenSSLで利用できるようにする必要があります。 +ignore-cipher-failureはそのシナリオにとって必要でも有用でもありません。 +このオプションを使用して正しく暗号化されたメッセージの復号化がたまたまPGP整合性チェックに合格した場合、その結果は偶然の一致であり、回復された平文をmakeすることはできません。 + + +Values: 0, 1 +Default: 0 +Applies to: pgp_sym_decrypt, pgp_pub_decrypt @@ -1939,6 +1983,14 @@ fips_mode() returns boolean on(デフォルト)はこれらの関数が通常通り動作します。 fipsは、OpenSSLがFIPSモードで動作していることが検出された場合に、これらの関数を無効にします。 + + +《機械翻訳》pgp_sym_encrypt()およびpgp_pub_encrypt()は、組み込み暗号を使用しないでください。 + diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index e8536dadb2a..1884a791f78 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -1123,15 +1123,22 @@ check制約でそのような一貫しない動作があると、問い合わせ -このオプションは、postgres_fdwがSCRAMパススルー認証を使用して外部サーバに接続するかどうかを制御します。 +《マッチ度[68.297456]》このオプションは、postgres_fdwがSCRAMパススルー認証を使用して外部サーバに接続するかどうかを制御します。 SCRAMパススルー認証では、postgres_fdwはプレーンテキストユーザパスワードの代わりにSCRAMハッシュ化されたシークレットを使用してリモートサーバに接続します。 これにより、プレーンテキストユーザパスワードがPostgreSQLシステムカタログに格納されるのを回避します。 +《機械翻訳》このオプションは、postgres_fdwがSCRAMパススルー認証を使用して外部サーバに接続するかどうかを制御します。 +これは外部サーバまたはユーザマッピングに対して指定できます。 +ユーザマッピング設定は外部サーバ設定より優先されます。 +SCRAMパススルー認証では、postgres_fdw SCRAMでハッシュされたシークレット代わりplain-テキストユーザパスワードを使用してリモートサーバに接続します。 +これにより、plain-テキストユーザパスワードがPostgreSQLシステムカタログに保存されるのを回避できます。 diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index b23d44b05df..6310bcae59e 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -1456,10 +1456,11 @@ fillfactor、TOAST、およびautovacuumのストレージパラメータおよ as a partition of the target table. The table can be attached as a partition for specific values using FOR VALUES or as a default partition by using DEFAULT. - For each index in the target table, a corresponding - one will be created in the attached table; or, if an equivalent - index already exists, it will be attached to the target table's index, - as if ALTER INDEX ATTACH PARTITION had been executed. + For each index in the target table, if a valid equivalent index + already exists in the partition, it will be attached to the target + table's index, as if ALTER INDEX ATTACH PARTITION had been executed; + otherwise, a new corresponding index will be created. Invalid indexes + on the partition are skipped. Note that if the existing table is a foreign table, it is currently not allowed to attach the table as a partition of the target table if there are UNIQUE indexes on the target table. (See also @@ -1467,12 +1468,21 @@ fillfactor、TOAST、およびautovacuumのストレージパラメータおよ row-level trigger that exists in the target table, a corresponding one is created in the attached table. --> -この構文は、既存のテーブル(それ自体がパーティションテーブルのこともあります)を対象テーブルのパーティションとして追加します。 +《マッチ度[72.660358]》この構文は、既存のテーブル(それ自体がパーティションテーブルのこともあります)を対象テーブルのパーティションとして追加します。 テーブルは、FOR VALUESを使って指定の値のパーティションとして、あるいは、DEFAULTを使ってデフォルトパーティションとして追加できます。 対象テーブルの各インデックスについて、対応するインデックスが付加されるテーブルに作られます。 また、同等のインデックスが既にある場合には、そのインデックスが、ALTER INDEX ATTACH PARTITIONが実行された場合と同様に、対象テーブルのインデックスに付加されます。 既存のテーブルが外部テーブルの場合、今のところ対象テーブルにUNIQUEインデックスがあるときにはテーブルを対象テーブルのパーティションとして追加することはできない点に注意してください(も参照してください)。 対象テーブルにある各ユーザ定義の行レベルのトリガに対しては、対応するものが付加されるテーブルに作られます。 +《機械翻訳》このフォームは、既存のテーブル(自分自身がパーティション化されている場合もあります)をターゲットテーブルのパーティションとしてアタッチします。 +テーブルは、を使用して特定の値のパーティションとしてFOR VALUESまたはDEFAULTを使用してデフォルトパーティションとしてアタッチできます。 +ターゲットテーブルのインデックスごとに、同等の有効なインデックスがパーティションにすでに存在する場合は、ALTERインデックスアタッチパーティションが実行された場合と同様にターゲットテーブルのインデックスにアタッチされます。 +それ以外の場合は、対応するインデックスが新規作成されます。 +パーティションの無効なインデックスはスキップされたです。 +ノートでは、既存のがである場合、UNIQUEのインデックスが存在する場合には、そのをのとして挿入することは現在許可されていません。 +(も参照してください。) +内に存在する定義された-✔ごとに、対応するものがアタッチされたに作成されます。 +テーブルアタッチ行テーブル外部テーブルパーティションターゲットテーブルテーブルターゲットテーブルターゲットテーブルレベルトリガユーザ diff --git a/doc/src/sgml/ref/copy.sgml b/doc/src/sgml/ref/copy.sgml index 2e4a8360514..def44c7774b 100644 --- a/doc/src/sgml/ref/copy.sgml +++ b/doc/src/sgml/ref/copy.sgml @@ -678,12 +678,15 @@ WHERE condition -今のところ、WHERE式の中での副問い合わせは認められていませんし、評価はCOPY自身により行われた変更を見ることはありません(これは、式がVOLATILE関数の呼び出しを含む場合に問題になります)。 + Currently, subqueries and generated columns are not allowed in + WHERE expressions, and the evaluation does not see + any changes made by the COPY itself (this matters + when the expression contains calls to VOLATILE + functions). +--> +《マッチ度[86.379928]》今のところ、WHERE式の中での副問い合わせは認められていませんし、評価はCOPY自身により行われた変更を見ることはありません(これは、式がVOLATILE関数の呼び出しを含む場合に問題になります)。 +《機械翻訳》現在、サブ問い合わせと生成された列はWHERE式では許可されず、評価ではCOPY自分自身によって行われた変更は確認されません。 +これは、式包含がVOLATILE関数を呼び出すときに重要です。 diff --git a/doc/src/sgml/ref/create_type.sgml b/doc/src/sgml/ref/create_type.sgml index bfa1f0b6bda..91b47870ae5 100644 --- a/doc/src/sgml/ref/create_type.sgml +++ b/doc/src/sgml/ref/create_type.sgml @@ -269,6 +269,15 @@ CREATE TYPE name 範囲型の名前が部分文字列rangeを含んでいれば、多重範囲型の名前は、範囲型の名前における部分文字列rangemultirangeで置き換えることで作られます。 そうでなければ、多重範囲型の名前は範囲型の名前の末尾に_multirangeを追加することで作られます。 + + + +《マッチ度[72.727273]》複合型を作成するためには、すべての属性型に対してUSAGE権限を持たなければなりません。 +《機械翻訳》範囲型を作成するには、派生元型にUSAGE権限が必要です。 + diff --git a/doc/src/sgml/ref/drop_subscription.sgml b/doc/src/sgml/ref/drop_subscription.sgml index b3864eab4ef..3f1b59a8833 100644 --- a/doc/src/sgml/ref/drop_subscription.sgml +++ b/doc/src/sgml/ref/drop_subscription.sgml @@ -138,20 +138,31 @@ DROP SUBSCRIPTION [ IF EXISTS ] name ALTER SUBSCRIPTION ... SET (slot_name = NONE). - After that, DROP SUBSCRIPTION will no longer attempt any - actions on a remote host. Note that if the remote replication slot still - exists, it (and any related table synchronization slots) should then be - dropped manually; otherwise it/they will continue to - reserve WAL and might eventually cause the disk to fill up. See - also . ---> -リモートホストのレプリケーションスロットに紐付けられているサブスクリプション(これが通常の状態です)を削除するとき、DROP SUBSCRIPTIONはその操作の一部として、リモートホストに接続し、レプリケーションスロット(と残りのテーブル同期スロット)を削除しようとします。 + After that, DROP SUBSCRIPTION will not attempt to drop + the subscription's own replication slot. It may still connect to the publisher + to drop internally-created table synchronization slots if some table + synchronization is left unfinished; if the publisher is unreachable, those + slots (and the main slot, if it still exists) must be dropped manually. Otherwise + it/they will continue to reserve WAL and might eventually cause the disk to + fill up. See also + . +--> +《マッチ度[82.352941]》リモートホストのレプリケーションスロットに紐付けられているサブスクリプション(これが通常の状態です)を削除するとき、DROP SUBSCRIPTIONはその操作の一部として、リモートホストに接続し、レプリケーションスロット(と残りのテーブル同期スロット)を削除しようとします。 リモートホスト上でサブスクリプションに割り当てられたリソースを解放するために、これが必要となります。 リモートホストに到達できない、あるいはリモートのレプリケーションスロットが削除できない、存在しない、存在したことがない、という理由で削除に失敗した場合、DROP SUBSCRIPTIONコマンドは失敗します。 この状況において先へ進むためには、まずALTER SUBSCRIPTION ... DISABLEを実行してサブスクリプションを無効にし、それからALTER SUBSCRIPTION ... SET (slot_name = NONE)を実行してサブスクリプションとレプリケーションスロットの紐付けを解除してください。 その後ならDROP SUBSCRIPTIONはリモートホスト上で何のアクションも起こそうとしません。 リモートのレプリケーションスロットがそれでも存在する場合、それ (と関連するテーブル同期スロット) を手作業で削除すべきであることに注意してください。 そうしなければ、WALを保存し続け、最終的にはディスクを一杯にしてしまうかもしれません。 +も参照してください。 +《機械翻訳》リモートホストのサブスクリプションに関連付けられたレプリケーションスロットを削除する場合(通常の状態)、DROP SUBSCRIPTIONはリモートホストとトライに接続して、レプリケーションスロット(および残りのテーブル同期化スロット)をオペレーションのパートとして削除します。 +これは、リモートホストのサブスクリプションに割り当てられたリソースが解放されるようにするために必要です。 +リモートホストが到達不能であるか、リモートレプリケーションスロットが削除できないか、存在しないか、存在しなかったために、これが失敗した場合、DROP SUBSCRIPTIONコマンドは失敗します。 +このシチュエーションで処理を続行するには、まずALTER SUBSCRIPTION ... DISABLEを実行してサブスクリプションを無効にし、ALTER SUBSCRIPTION ... SET (slot_name = NONE)を実行してレプリケーションスロットとの関連付けを解除します。 +その後、DROP SUBSCRIPTIONはサブスクリプション自身のレプリケーションスロットを削除しようとしません。 +テーブルの同期化が完了していない場合は、パブリッシャーに接続して、内部で作成されたテーブル同期化スロットを削除することができます。 +パブリッシャーが到達不能な場合は、それらのスロット(およびがまだ存在する場合は)を手動で削除する必要があります。 +それ以外の場合は、WALの予約が継続され、最終的にディスクがいっぱいになる可能性があります。 も参照してください。 diff --git a/doc/src/sgml/ref/pg_recvlogical.sgml b/doc/src/sgml/ref/pg_recvlogical.sgml index a4593640d8e..66513fdf0cb 100644 --- a/doc/src/sgml/ref/pg_recvlogical.sgml +++ b/doc/src/sgml/ref/pg_recvlogical.sgml @@ -704,10 +704,11 @@ LSNがlsnと正確に一致するレコードがあ -pg_recvlogicalは、ソースクラスタでグループパーミッションが有効である場合、受け取ったWALファイルのグループパーミッションを維持します。 +《マッチ度[85.906040]》pg_recvlogicalは、ソースクラスタでグループパーミッションが有効である場合、受け取ったWALファイルのグループパーミッションを維持します。 +《機械翻訳》pg_recvlogicalグループクラスタでグループ許可が有効になっている場合、は出力されたファイルにソース許可を保持します。 diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 9f6f52044bf..14581e16356 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -3953,14 +3953,20 @@ SELECT are displayed in expanded mode. If + is appended to the command name, database sizes, default tablespaces, and descriptions are also displayed. - (Size information is only available for databases that the current - user can connect to.) + Size information is available for databases on which the current user has + CONNECT privilege, or if the current user is a superuser + or has privileges of the pg_read_all_stats role. --> -サーバ内のデータベースについて、その名前、所有者、文字集合符号化方式、およびアクセス権限を一覧表示します。 +《マッチ度[68.267831]》サーバ内のデータベースについて、その名前、所有者、文字集合符号化方式、およびアクセス権限を一覧表示します。 patternを指定すると、パターンにマッチする名前を持つデータベースのみを表示します。 コマンド名にxが付与された場合は、拡張モードで結果が表示されます。 コマンド名に+が付与された場合は、データベースのサイズ、デフォルトのテーブル空間、および説明も表示します。 (サイズ情報は現在のユーザが接続可能なデータベースでのみ表示されます。) +《機械翻訳》サーバ内のデータベースをリストし、その名前、所有者、キャラクタセットのエンコード方式およびアクセスの権限を表示します。 +パターンが指定されている場合は、名前がマッチパターンであるデータベースのみがリストされます。 +xがコマンド名前に追加されている場合は、結果が拡張モードに表示されます。 ++がコマンド名前に追加されている場合は、データベースのサイズ、デフォルトの表領域および説明も表示されます。 +サイズ情報は、現在ユーザが権限であるかCONNECT、現在ユーザがスーパーユーザであるかpg_read_all_statsロールの権限を持つデータベースで使用できます。 @@ -5427,6 +5433,15 @@ SELECT 1 \bind \sendpipeline pg_restore, but it may be useful elsewhere. --> このコマンドは、主にpg_dumppg_dumpall、およびpg_restoreで生成されるプレーンテキストダンプでの使用を目的としていますが、他の場所でも役に立つかもしれません。 + + + +《マッチ度[70.813397]》他のほとんどのメタコマンドと異なり、行の残り部分はすべて\efの引数であると常に解釈され、引数内の変数の置換も逆引用符の展開も行われません。 +《機械翻訳》他のほとんどのメタコマンドとは異なり、直線の残り全体は常に\unrestrictの引数とみなされ、変数補間も逆引用符拡張も実行されません。 diff --git a/doc/src/sgml/release-18.sgml b/doc/src/sgml/release-18.sgml index 27bde70e1b3..4f3edb5cf53 100644 --- a/doc/src/sgml/release-18.sgml +++ b/doc/src/sgml/release-18.sgml @@ -1,6 +1,4774 @@ + + Release 18.6 + + + + リリース日: + 2026-08-13 + + + + +このリリースは18.4に対し、様々な不具合を修正したものです。 +18メジャーリリースにおける新機能については、を参照してください。 + + + + +《機械翻訳》ノート:18.5は、ラップ後に発見されたリグレッションのため、リリースされませんでした。 + + + + + バージョン18.6への移行 + + + +18.Xからの移行ではダンプ/リストアは不要です。 + + + + +《機械翻訳》ただし、以下の最初の3つのセキュリティ項目では、更新後にmakeする必要がある設定調整とデータ清掃について説明します。 + + + + +《機械翻訳》また、GINインデックスがある場合は、以下のエントリの変更ログで破損の可能性reltuplesテーブルの値について確認してください。 + + + + +《機械翻訳》また、contrib/btree_gistまたはcontrib/ltreeを使用する場合は、これらの拡張で作成されたインデックスをインデックス再作成する必要があるかもしれません。 +以下の関連するエントリを参照してください。 + + + + +《機械翻訳》また、18.2より前のバージョンからアップグレードする場合は、を参照してください。 + + + + + + 変更点 + + + + + + + +《機械翻訳》ロジカルデコーディング出力プラグインを、新しいサーバパラメータoutput_plugin_libraries. +(Jacob Champion) + § + § + + + + +《機械翻訳》これまでは、レプリケーションユーザはロジカルデコーディングのロード可能ライブラリをセレクトすることができ、さまざまな種類のエクスプロイトを可能にしていた。 +前で動作していたセットアップを壊すことなくこのダウンをロックできるようにするために、許可されたアウトプットプラグインのホワイトリストを導入した。 + + + + +《機械翻訳》デフォルト別では、パートで出荷されたPostgreSQLpgoutputおよびtest_decodingの出力プラグインのみがoutput_plugin_librariesに含まれます。 +他の出力プラグインに依存するインストールでは、例のサーバ更新の後にそれらを追加する必要があります。 + +output_plugin_libraries = 'pgoutput, test_decoding, my_trusted_decoder' + + + + + +《機械翻訳》さらに、pg_upgrade--チェックは、バージョン17以降から移行する場合、output_plugin_libraries新しいクラスタのパラメータが古いクラスタの論理レプリケーションスロットのプラグインを許可しない場合に失敗します。 +makeは、新しいクラスタの設定前に必要な追加を実行しますpg_upgrade。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたVladimir TokarevとYu Kunpengに感謝します。 +(CVE-2026-6471) + + + + + + + +《機械翻訳》サポートされていない暗号を検出するために、contrib/pgcryptoのPGP暗号化を修正。 +(Daniel Gustafsson) + § + § + + + + +《機械翻訳》以前は、OpenSSLが要求された暗号を拒否した場合(FIPS例で実行されているか、レガシープロバイダがロードされていないため、モード用、pgcrypto失敗に気づかず、暗号化されていないブロックとプレーンテキストを単純にXORして、暗号化を些細な解読可能なものにしていました。 +これは通常、非推奨またはFIPS以外の暗号アルゴリズム(cipher-algo=blowfish/bf、twofish、キャスト5、または3 des)で発生します。 + + + + +《機械翻訳》デフォルトにより、pgcryptoはこの方法で影響を受けたメッセージの復号化に失敗するようになりました。 +このようなデータを取得できるようにするために、新しいオプションignore-cipher-failurepgp_pub_decrypt()pgp_sym_decrypt()。 +Setting ignore-cipher-failure=1は以前の動作をリストアし、欠陥のある暗号化ラッパーをオフから取り除くことができますに追加されました。 + +pgp_sym_decrypt(encrypted_column, any key, 'ignore-cipher-failure=1') + + +《機械翻訳》影響を受けたメッセージが特定され、ラッパーが取り除かれると、最新のアルゴリズムで再暗号化できます。 +ただし、OpenSSLの動作が、欠陥のあるメッセージが作成されたときと同じであることが重要です。 +サポートされていないアルゴリズムのセットが同じでない場合、このアプローチは機能しません。 +については、文書を参照してくださいignore-cipher-failure。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたShishir Sharmaに感謝します。 +(CVE-2026-14663) + + + + + + + +《機械翻訳》COPYpsqlの送信に失敗した場合でも、スクリプト化されたCOPY ... FROM STDINデータに従って、直線内のコピーコマンドに前を修正する。 +PGRES_COPY_IN +(Tom Lane) + § + § + + + + +《機械翻訳》これまでは、COPYコマンドがスタートアップで失敗した場合インスタンスにはターゲットテーブルが存在しないためpsqlはそれを認識せず、以下の直線データ内をSQLコマンドとして読み進めていました。 +ベストケースでは間違いであり、最悪のケースではSQLインジェクションハザードです。 +psqlに構文的に有効なコピー.FROM STDINコマンドを認識させ、サーバがPGRES_COPY_INで応答しない場合はスキップデータを権限上でにするように教えました。 + + + + +《機械翻訳》この修正が稼働のSQLスクリプトに影響を与える可能性は低いですが、テストスクリプトが意図的に練習で失敗するコピー.FROM STDINコマンドを実行する可能性があります。 +これらのスクリプトは、このようなコマンドの後に\.データターミネータ直線を取得する必要があります。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたAlexander Lakhinに感謝します。 +(CVE-2026-6464) + + + + + + + +《機械翻訳》クロス-チェックEXECUTEまたはFETCH.を実行する行の出力ポータルタイプ。 +(Robert Haas) + § + + + + +《機械翻訳》EXECUTEおよびFETCH 2つのポータルを使用します。 +1つはステートメント自分自身用の外部ポータルで、もう1つは問い合わせを実行する内部ポータルです。 +以前は、2つのポータルの宣言された行タイプをmakeすることが可能であったため、サーバメモリの開示と任意のコードの実行につながりました。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたBen Morris(Claude and Anthropic Researchと共同で)とPeter Geogheganに感謝します。 +(CVE-2026-16239) + + + + + + + +《機械翻訳》to_char()では、バッファオーバーランを長いタイムゾーン省略形で固定します。 +(Tom Lane) + § + + + + +《機械翻訳》これは容易にサーバをクラッシュすることができ、恣意的なコードの実行につながるエクスプロイトが報告されている。 + + + + +《機械翻訳》PostgreSQLプロジェクトは、本問題を報告してくれたHcamael、Amjad Shahzad、AntAISecurityLabのTan Zhen、Tomer Fichman、Zheng Yu、Amy Burnett(OpenAI Codexセキュリティ)、Rick de Jager、Heewon Song、Sylvie Mayer、Aleksander Alekseev、およびHillai Ben Sassonに感謝します。 +CVE-2026-14669。 + + + + + + + +《機械翻訳》regexpバッファオーバーラン/split関数のマッチを修正しました。 +(Masahiko Sawada) + § + + + + +《機械翻訳》不正にエンコードされたデータが渡された場合、これらの関数は変換バッファの末尾を超えて書き込む可能性があります。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたFrancesco Verardiに感謝します。 +(CVE-2026-14664) + + + + + + + +《機械翻訳》無効な入力に対してascii()関数を固定します。 +(Michael Paquier) + § + + + + +《機械翻訳》無効にエンコードされた入力を提供することで、この関数は、読み取るべきではない結果の数バイトを読み取り、データするように誘導することができます。 +assertが有効なビルドでは、そのアサーションもトリガされる可能性があります。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたHcamaelに感謝します。 +(CVE-2026-18024) + + + + + + + +《機械翻訳》複数範囲のタイプハンドリングをpg_restore_attribute_stats()で修正します。 +(OpenAI Security Research Team) + § + § + + + + +《機械翻訳》pg_restore_attribute_stats()は基底の範囲型と同じように多重範囲型を扱いました。 +これは境界のヒストグラムでは正しく動作しますが、他のすべての種類の間違いでは統計処理でした。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたAmy Burnett(OpenAI Codex Security)に感謝します。 +(CVE-2026-16238) + + + + + + + +《機械翻訳》make scalarineqsel()タイプTIDであると予想されるチェックが実際にある定数。 +(Tom Lane) + § + + + + +《機械翻訳》この期待は、この推定量を使用するすべての組み込み演算子に当てはまるが、悪意を持って構築された演算子はそれに違反し、クラッシュやサーバメモリの開示につながる可能性がある。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたHcamaelに感謝します。 +(CVE-2026-14668) + + + + + + + +《機械翻訳》過度に長い値個々のコードとベクタ/問い合わせ語彙素の合計の両方に対して長さtsvectorとtsqueryを強化します。 +(Tom Lane) + § + § + + + + +《機械翻訳》文書化された制限は、コードのすべての経路で実施されたわけではありません。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたYuhang Wu、Zhenpeng Lin、Zheng Yu、Hcamaelに感謝します。 +(CVE-2026-14662) + + + + + + + +《機械翻訳》FUNC_MAX_ARGS関数の議論以上のものを扱う必要がないと誤って想定していたさまざまな場所を修正します。 +(Tom Lane) + § + § + + + + +《機械翻訳》注目すべきことに、サーバの集約関数への引数の数に対する実際の制限はFUNC_MAX_ARGS - 1であるが、パーサはそれを強制することに失敗し、下流に危険をもたらした。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたZheng Yu、ylwangtju、Masahiko Sawadaに感謝します。 +(CVE-2026-14679) + + + + + + + +《機械翻訳》SQLから、または戻り値の型内部を取る機能へのコールを拒否します。 +(Tom Lane) + § + § + + + + +《機械翻訳》これを行うことに対する既存の防御策は不十分であることが示されているため、より明示的なチェックを追加します。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたAmy Burnett(OpenAI Codex Security)に感謝します。 +(CVE-2026-14680) + + + + + + + +《機械翻訳》拡張統計情報オブジェクトがALTER TABLEによって再建された場合、その所有権を保持します。 +(Masahiko Sawada) + § + + + + +《機械翻訳》以前は、ロールランニングALTER TABLEがそのようなオブジェクトのオーナーシップを取得しましたが、それは不適切なようです。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたNoah Mischに感謝します。 +(CVE-2026-6469) + + + + + + + +《機械翻訳》EXTRACT()関数呼び出しを構文解析する際には、必要に応じてフィールド名前を引用してください。 +(Nathan Bossart) + § + + + + +《機械翻訳》パーサは、文字列リテラルをフィールド名前として受け入れますEXTRACT()バリデーションの実行を延期します。 +呼び出しが保存され、pg_dumpの間に例に対して解析解除されると、文字列本体が逐語的に戻され、SQLインジェクションが可能になります。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたBen Morris(Claude and Anthropic Researchと共同で)に感謝します。 +(CVE-2026-15741) + + + + + + + +《機械翻訳》チェック、以前はそれをチェックすることができなかった場所のUSAGEデータの権限タイプのために。 +(Nathan Bossart) + § + § + § + + + + +《機械翻訳》CREATEタイプASレンジはチェックを行わず、ALTERテーブルOFも行わず、格納された式を作成するコマンドも行いませんでした。 +これらの省略により、USAGE権限を持たないロールでもタイプに依存するオブジェクトを作成することができました。 +タイプの所有者であるブロッキングは後でタイプを変更する可能性がありました。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたJingzhou Fuに感謝します。 + (CVE-2026-6470) + + + + + + + +《機械翻訳》ロールの変更後に、ロールに依存するキャッシュ済計画を無効化します。 +(Ilya Staroverov, Shinya Kato, Nathan Bossart) + § + + + + +《機械翻訳》ロールメンバシップ、ロール属性、データベースの所有者の変更は、行-レベルセキュリティポリシーの期待される動作をインパクトする可能性がありますが、以前は、古い状況に従って作成されたキャッシュされたプランを引き続き使用していました。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたIlya StaroverovとShinya Katoに感謝します。 +(CVE-2026-14666) + + + + + + + +《機械翻訳》直接SSLコネクション後にGSSEncRequestを拒否します。 +(Michael Paquier) + § + + + + +《機械翻訳》TLSで暗号化されたコネクションを確立した後も、サーバはGSSAPI暗号化用のリクエストを受け入れます。 +それが成功した場合、コネクションはTLS暗号化を使用して処理を進めますが、pg_hbaルールに対してGSSコネクションのように見えます。 +したがって、TLSを許可しないpg_hbaポリシーは正しく適用されません。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたp4p3rに感謝します。 +(CVE-2026-14681) + + + + + + + +《機械翻訳》makeはスクラム認証の秘密をよりもっともらしく模倣している。 +(Nathan Bossart) + § + + + + +《機械翻訳》もしSCRAMログインが存在しないかSCRAM秘密を持っていないロールに対して試みられるなら、攻撃者にこれらの事実を明らかにすることを避けるために、模擬秘密を生成し、とにかく認証ハンドシェイクを実行します。 +しかし、模擬秘密は固定反復カウントで作られました、自分自身では観測可能な回答不一致である可能性があります。 +設定設定を使用してくださいscram_iterations代わりに、makeするために模擬秘密はインストールの本当の秘密のように見えます。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたRadim Marekに感謝します。 +(CVE-2026-14672) + + + + + + + +《機械翻訳》サーバから受信した無効なbyteaデータによって引き起こされたecpgアプリケーションの範囲外の書き込みを修正しました。 +(Michael Paquier) + § + + + + +《機械翻訳》ecpgは、bytea値が\xで始まらなければならないことをチェックせずに想定されます。 +破損した、または悪意のあるサーバは2バイトより短い文字列を送信する可能性があり、その結果、アプリケーションのメモリが破壊されます。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたylwangtjuに感謝します。 +(CVE-2026-16241) + + + + + + + +《機械翻訳》psql\unrestrictコマンドの引数で逆引用符拡張をしないでください。 +(Nathan Bossart) + § + + + + +《機械翻訳》CVE-2025-8714の修正におけるこの見落としは、悪意のあるサーバが、psql CVE-2025-8714が防止しようとした正確なシェルであるを実行しているテキストでダンプ時間に実行されるプレーンなリストア出力にマシンコマンドを注入することを可能にする。 +シナリオ + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたLucas Velgus、Filip Janus、Daniel Bakkerに感謝します。 +(CVE-2026-18408) + + + + + + + +《機械翻訳》pg_proc.prontftypesFUNC_MAX_ARGSエントリより多く持つことはできないというpg_dumpの仮定を削除しました。 +(Tom Lane) + § + + + + +《機械翻訳》入出力引数の両方に対してエントリが存在する可能性があるため、この配列の長さがFUNC_MAX_ARGS入力引数のみを制約するを超える可能性があります。 +たとえそうでなかったとしても、pg_dumpはサーバがFUNC_MAX_ARGSそれが持つと同じ値で構築されたと想定することはできません。 +オーバーランは内部でメモリを破壊することになりますpg_dump。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたMasahiko Sawadaに感謝します。 +(CVE-2026-19385) + + + + + + + +《機械翻訳》Perlの配列とハッシュをPL/Perl結合されたものに対して強化する。 +(Tom Lane) + § + + + + +《機械翻訳》通常のオブジェクトのように動作しないメモリが関連付けられていると、配列が上書きされたり、不正な結果リザルトが構築されたりする可能性があります(これは後で問題を引き起こす可能性があります)。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたHcamaelに感謝します。 +(CVE-2026-14670) + + + + + + + +《機械翻訳》メモリ内の整数オーバーフローを修正しました。 +PL/PerlPL/Tcl.アロケーション +(Heikki Linnakangas) + § + + + + +《機械翻訳》これは、コードの別のタイプにあるだけで、CVE-2026-6473と同じ問題のパートであり、同じ方法で修正されます。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたTulyaプロジェクト(チームDhiutsa、Bitecope TechnologiesプライベートLtdに感謝します。 +(CVE-2026-14677) + + + + + + + +《機械翻訳》保証who contrib/amcheck functions restrict search_path前はインデックス式を実行します。 +(Noah Misch) + § + + + + +《機械翻訳》amcheckはテーブルのインデックス式のような所有者式を実行しますので、呼び出し元が任意のコードをテーブル所有者として実行するためにsearch_path-dependent関数を乗っ取る可能性があります。 +デフォルトではスーパーユーザのみがamcheck関数を呼び出しで実行することを許可されているため、これは弱点ではありません。 +しかし、権限が許可された場合、文書が示唆するよりも大きな危険をもたらしました。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたYuelin WangとJacob Brazealに感謝します。 +(CVE-2026-14673) + + + + + + + +《機械翻訳》contrib/fuzzystrmatchlevenshtein()およびlevenshtein_less_equal()関数での整数オーバーフローを修正しました。 +(Nathan Bossart) + § + + + + +《機械翻訳》これらの関数にラージコストの値を渡すと整数オーバーフローが発生し、意味のない結果が生成されたり、場合によっては範囲外の書き込みが発生したりする可能性がありました。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたBen Morris(Claude and Anthropic Researchと共同で)に感謝します。 +(CVE-2026-15742) + + + + + + + +《機械翻訳》バッファオーバーランをcontrib/pg_stat_statements. +(Álvaro Herrera) + § + + + + +《機械翻訳》問い合わせ正規化は、正規化されたアカウントが必要とするスペースの量に対して、文字列を正確に計算しなかった。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたSajeeb Lohani(TrendAI Zero Day Initiativeと共に)とYuelin Wangに感謝します。 +(CVE-2026-14676) + + + + + + + +《機械翻訳》contrib/pg_trgm's GiST picksplitエラーのデータ型関数を修正しました。 +(Heikki Linnakangas) + § + + + + +《機械翻訳》このミスの結果、バッファの終わりを超えて読むことになり、通常は誤った分割決定が発生しました。 +しかし、非常に運が悪いとクラッシュが起こる可能性があります。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたMehmet D. Inceに感謝します。 +(CVE-2026-14678) + + + + + + + +《機械翻訳》プランのキャッシュを削除しますcontrib/refint。 +(Ayush Tiwari) + § + + + + +《機械翻訳》このキャッシュ動作にはいくつかの重大なバグがあります。 +特に、check_foreign_key()は新しいキー値をカスケード-更新問い合わせに埋め込むため、キャッシュされたプランは、使用されるべきキー値ではなく、本来必要な値を再利用する。 +最も簡単な解決策は、それを削除することです。 + + + + +PostgreSQLプロジェクトは、本問題を報告してくれたHcamaelに感謝します。 +(CVE-2026-14671) + + + + + + + +《機械翻訳》パラレルGINインデックスが更新を建設する保証は、テーブルのpg_クラスです。 +reltuples値は正しく。 +(Jan Nidzwetzki, Tomas Vondra) + § + + + + +《機械翻訳》パラレルワーカーは、処理した行数の初期化されていない値をレポートし、reltuples InfinityやNaNであっても偽の値をもたらす可能性があります。 +このような値は、後続のオートバキュームおよび自動分析操作で、テーブルニーズを処理することを決定しない可能性があります。 +その場合、シチュエーションは自己修復しません。 +マニュアルreltuplesコマンド、または別のインデックスの作成は、正しい値にリセットするために必要になります。 +GINインデックスを持つテーブルがある場合は、チェックにreltuplesエントリが正常に見えるかどうかを確認することをお勧めします。 +次のような問い合わせが役立つ場合があります。 +ANALYZE + +SELECT DISTINCT t.oid::regclass, t.reltuples +FROM pg_class t + JOIN pg_index i ON t.oid = i.indrelid + JOIN pg_class ic ON i.indexrelid = ic.oid +WHERE t.relhasindex AND ic.relam = 2742; + + + + + + + + +《機械翻訳》非同期Appendプランのハンドリングを再スキャンする際に、ノードの読み取りが正しく行われない問題を修正しました。 +非同期 +(Alexander Korotkov, Gleb Kashkin, Etsuro Fujita) + § + + + + +《機械翻訳》上位プランノードがAppend前を再スキャンしてAppendの出力全体を読み込んだら、外部サーバに送信されたin-フライト要求を破棄する必要がありますpostgres_fdw by for例)。 +これは、サブプランにパラメータの変更がある場合や、次のスキャンのパーティションプルーニングによって破棄される場合には正しく行われませんでした。 +結果は、問い合わせの結果が正しくない、無限ループ、またはアサーションの失敗となる可能性があります。 + + + + + + + +《機械翻訳》レンジ~テーブルパーティションのパーティション剪定でエラーを固定。 +(David Rowley) + § + + + + +《機械翻訳》場合によっては、デフォルトパーティションが本来でないときにスキップされたになり、問い合わせの結果から行が欠落することがあります。 + + + + + + + +《機械翻訳》結果のラッパーをプルーニングした後、ModifyTableプランノードで外国-データ-リレーションの状態が正しく更新されます。 +(Ayush Tiwari, Rafia Sabih) + § + § + + + + +《機械翻訳》以前は、実行時のパーティションプルーニングによって、分割されたターゲットテーブルの一部のパーティションをスキャンする必要がないと判断され、そのテーブルに外部テーブルパーティションがある場合、クラッシュまたは誤った動作が発生する可能性があった。 + + + + + + + +《機械翻訳》BEFORE UPDATEトリガを持つテーブル上のwith RETURNING OLDで同時更新が失敗する問題を修正しました。 +UPDATE +(Dean Rasheed) + § + + + + +《機械翻訳》ターゲット行が同時に更新された場合、隔離レベルでREAD COMMITTED RETURNING内の任意のOLD値は更新された行を反映する必要があります。 +しかし、トリガがある場合は古い値が返されました(ただし、トリガ自分自身と最終的な出力行には正しい値が表示されました)。 + + + + + + + +《機械翻訳》ハッシュ結合パフォーマンスキーと多くのNULL値がある場合のマルチプル結合問題を修正しました。 +(David Rowley) + § + + + + +《機械翻訳》NULLキー付きタプルはハッシュテーブルに挿入されるべきではありません。 +なぜなら、それらは他のタプルをマッチにすることは決してないからです。 +コードは、NULLが最後以外の結合カラムにあった場合にこの間違いを取得し、多くの入力にNULLが含まれている場合にハッシュテーブルをかなり膨張させます。 + + + + + + + +《機械翻訳》RETURNINGエクスプレッション内でカッコで囲まれたOLD/NEWのパースを修正しました。 +(Marko Grujic) + § + + + + +《機械翻訳》(old).colname(old).*などの式は誤って処理され、事実上NEW参照に変換されました。 + + + + + + + +《機械翻訳》プランナのvalue IN (array)式に対するNULL許容性と厳密性のチェックを修正した。 +(Ayush Tiwari) + § + + + + +《機械翻訳》これらのチェックは、配列オペランドが空でないことがわかっているが、考慮されていないため、本来適用されるべきではない最適化が適用された場合にのみ成功します。 +これにより、間違い問い合わせが実際に空の場合に、配列地域の回答が得られる可能性があります。 + + + + + + + +《機械翻訳》誤った結合取外しロジックを修正する。 +(Matheus Alcantara, Richard Guo) + § + § + + + + +《機械翻訳》エッジケースでは、定数のNull許容側の内部から取得した外部結合の出力の値が、NULLによって置換されるべきときに置換されない可能性がありました。 + + + + + + + +《機械翻訳》結合の撤去作業中は、PlaceHolderVarsをより徹底的に清掃してください。 +(Richard Guo, Arne Roland) + § + § + + + + +《機械翻訳》この修正では、アサーションをトリップしたり、誤った計画を生成する可能性のあるさまざまなエッジケースが修正されている。 + + + + + + + +《機械翻訳》コンテナデータ型(配列、コンポジット、範囲)での等価性比較のハッシュ可能性のチェック漏れが追加された。 +(Andrei Lepikhov, Tom Lane) + § + + + + +《機械翻訳》プランナは、コンテナのコンポーネントタイプ前のハッシュ可能性を検証し、ハッシュを拠点とするプランタイプを使用できることを決定する必要があります。 +このステップがいくつかの場所で欠落していたため、実行時に失敗しましたハッシュ機能を識別できませんでした。 + + + + + + + +《機械翻訳》同等ダウンが異なるグループ化ステップを通過してWHERE条項ルールをプッシュすることは避けてください。 +(Richard Guo) + § + + + + +《機械翻訳》非決定性テストによってグループ化されたグループ化カラムの照合順序は、同じ照合順序を使用する比較である場合にのみ、セーフからプッシュダウンになります。 +そうでない場合は、グループ化がマージしたはずの行をフィルタする可能性があります。 + + + + + + + +《機械翻訳》EXCLUDE最適化または欠損ORDER BYを持つCOUNTウィンドウ関数の句ミスを修正した。 +(Chengpeng Yan, David Rowley) + § + + + + +《機械翻訳》これらの窓関数は、単調であるべきでないときに単調として扱われ、間違いの回答を計算することを可能にした。 + + + + + + + +《機械翻訳》プランナが統計処理でタイプ"char"のキャッシュを検索する場合は、照合順序0のカラム検索に失敗エラーを回避します。 +(Feng Wu) + § + + + + + + + +《機械翻訳》ALTER COLUMN ... DROP EXPRESSIONマルチプルレベルの間仕切りがある場合に機能するように修正します。 +(Alberto Piai) + § + + + + + + + +《機械翻訳》排他制約であるインデックスのパーティションの付加を修正しました。 +(Japin Li) + § + + + + +《機械翻訳》特に、この見落としは、分割された排他制約のダンプ/リストアを破壊した。 + + + + + + + +《機械翻訳》設定を禁止するNO INHERITパーティション化されたNOT NULL ALTER CONSTRAINTによる制約。 +(Andreas Karlsson) + § + + + + +《機械翻訳》NOT NULLテーブルパーティションの制約はすべてのパーティションに継承されることになっているため、NO INHERITとマークされてはなりません。 +このルールは制約の作成時に正しく適用されましたが、ALTER TABLE ... ALTER CONSTRAINTでは適用されませんでした。 + + + + + + + +《機械翻訳》ルール名を_RETURN. +(Tom Lane) + § + + + + +《機械翻訳》その名前はビューの予約であるON SELECTルールだが、ALTERルールは他のルールを_RETURNに改名することを許可し、後にトラブルを引き起こした。 + + + + + + + +《機械翻訳》DROP OWNED BYで欠落しているロックリリースのロールメンバシップ認可を修正します。 +(Jeff Davis) + § + + + + +《機械翻訳》この見落としの結果、ワーニングメッセージが誕生し、その後、トランザクションの終わりまでメンバシップ助成金のロックが維持されました。 + + + + + + + +《機械翻訳》EXPLAINdeparse SQL/JSON aggregates.*の失敗を修正しました。 +(Richard Guo) + § + + + + +《機械翻訳》一部のプラン構造でノードタイプの基礎となる無効なJsonConstructorExprエラーが発生しました。 + + + + + + + +《機械翻訳》REINDEX CONCURRENTLY with a遅延一意性制約の使用を修正しました。 +(Nitin Motiani) + § + + + + +《機械翻訳》の間に作成された一時的なインデックスコピーは、即時の一意性を強制するものとして誤ってマークされ、制約違反の誤った報告を引き起こした。 +REINDEX CONCURRENTLY + + + + + + + +《機械翻訳》照合とバックスラッシュが明確でないLIKEマッチングを修正しました。 +(Nitin Motiani, Tom Lane) + § + § + + + + +《機械翻訳》非決定性照合順序を使用する場合、LIKEエスケープされたバックスラッシュ\\を誤って処理し、実質的に存在しないものとして処理しました。 +また、通常の文字の前に間違いが先行するバックスラッシュの処理も行いました。 +このケースではバックスラッシュは実質的に無視されるはずですが、非決定性照合順序がマッチがあるかどうかを決定できるようにするのではなく、通常の文字が正確に一致するようにしました。 + + + + + + + +《機械翻訳》正確な最適化マッチを使用するインデックススキャン用のLIKE/regexパターンを修正しました。 +(Jelte Fennema-Nio) + § + + + + +《機械翻訳》LIKE非決定性照合を使用したのリファクタリングでは、最適化パターンがマッチインデックスをマッチしていない場合に、LIKEまたは正規表現の正確な式照合順序を等式条件に変換するためのが誤って壊れた。 +とりわけ、psql\d tablenameコマンドははるかに遅くなった。 +インデックス照合順序 + + + + + + + +《機械翻訳》ローカライズされた月/日の名前のマッチングを修正しましたto_date(). +(Heikki Linnakangas) + § + § + + + + +《機械翻訳》マッチングロジックでは、ケース折りによって文字列のバイト長さが変更された場合に問題が発生した。 + + + + + + + +《機械翻訳》ケース最終シグマのギリシャフォールディング規則を修正する。 +(Jeff Davis) + § + + + + +《機械翻訳》文字列の前にケースIgnorable文字しかない場合、それを最終シグマとはみなさない。 +これは組み込みのpg_unicode_fastロケールにのみ影響する。 + + + + + + + +《機械翻訳》ハングルU+11A7(TBASE)の不正なNFC再構成を修正します。 +(Diego Frias, Michael Paquier) + § + + + + +《機械翻訳》この文字は有効なT音節として扱われましたが、実際はそうではないため、正規化中に静かに飲み込まれました。 + + + + + + + +《機械翻訳》ケースの影響を受けないsynonym辞書語彙素では、出力が切り捨てられる可能性があります。 +(Jeff Davis) + § + + + + +《機械翻訳》下部ケースへの折り畳みが語彙素のバイト長さを増加させた場合、放出時にオリジナルバイト長さに誤って切り捨てられた。 + + + + + + + +《機械翻訳》ケース-変換ロジックで切り捨てられたUTF-8文字に対する防御。 +(Jeff Davis) + § + + + + + + + +《機械翻訳》タイポをhash_record_extended(). +(Man Zeng) + § + + + + +《機械翻訳》コードは、FunctionCallInvoke()に渡された2番目のisnull引数の初期化に失敗しました。 +これは、その値を検査しない既存の-コア拡張ハッシュサポート関数には問題ありません。 +ただし、extension提供のハッシュ関数は、検査PG_ARGISNULL(1)。 + + + + + + + +《機械翻訳》pg_get_publication_tables()発行可能なテーブルが同時に削除されても失敗しないように修正しました。 +(Bharath Rupireddy) + § + + + + + + + +《機械翻訳》satisfies_hash_partition()VARIADIC NULL. +(Robert Haas) + § + + + + + + + +《機械翻訳》レポートが無効-ウェイトは、tsvector_filter()および関連する関数において、より明確かつ一貫してエラーを発生させる。 +(Ewan Young) + § + + + + +《機械翻訳》特に、\nnnのように、8進数のウェイトで表示可能なASCII文字ではないレポートフォーム文字は、charout()表示されます。 +これにより、無効にエンコードされたエラーメッセージが生成される可能性がなくなります。 + + + + + + + +《機械翻訳》uuidv7().内のレンジ外タイムスタンプシフト値を拒否します。 +(Baji Shaik) + § + + + + +《機械翻訳》シフト値は、v7ラージが表現できるタイムスタンプからレンジを生成するようなUUIDであってはなりません。 +以前は、ガーベッジUUID値が生成されていました。 + + + + + + + +《機械翻訳》xpath()でのネームスペースノードの誤った処理を修正しました。 +(Michael Paquier) + § + § + + + + +《機械翻訳》この修正により、予期しないノードをコピーできないエラーが回避されます。 + + + + + + + +《機械翻訳》jsonpath.decimalメソッドが誤ったハードまたはエラーに対して精度位取りをスローしないように修正した。 +(Ewan Young) + § + § + + + + +《機械翻訳》サイレントモードはこれらの誤りを抑制すべきであるが、できなかった。 + + + + + + + +《機械翻訳》IS JSONまたは類似の構成に、NULLポインタのクラッシュはあるが、タイプテキストへの引数がない場合、文字列カテゴリを修正しました。 +キャスト +(Ayush Tiwari) + § + + + + +《機械翻訳》コアにはそのようなデータタイプはありませんPostgreSQLただし、一部のextensionタイプでは問題が発生する可能性があります。 + + + + + + + +《機械翻訳》保証SQL/JSON ON EMPTY / ON ERROR DEFAULT値は正しいtypmodに強制されます。 +(Ewan Young) + § + + + + +《機械翻訳》例の場合、宣言された精度と数値位取りカラムのターゲットはデフォルト値に適用されませんでした。 + + + + + + + +《機械翻訳》可能な最小の金額値を-1で割るときは、マシンに依存する動作を避けてください。 +(Andrey Rachitskiy) + § + + + + + + + +《機械翻訳》クラッシュディクショナリのメモリエントリの作成中に、キャッシュ外エラーが発生した場合にテキストサーチを修正しました。 +(Tom Lane) + § + + + + + + + +《機械翻訳》間違ったispell/hunspellディクショナリファイルを処理する際のメモリ安全に関するバグを修正しました。 +(Andrey Rachitskiy) + § + + + + + + + +《機械翻訳》他のセッションのアクセステーブルへの一時的を禁止します。 +(Jim Jones, Daniil Davydov, Alexander Korotkov) + § + § + + + + +《機械翻訳》コード経路の中にはこれを防ぐことができず、静かに間違い(一貫性のない)結果をもたらした。 + + + + + + + +《機械翻訳》ローカルバッファアクセス時のエラー空の一時テーブルがないを防止します。 +(Melanie Plageman) + § + + + + +《機械翻訳》読取りローカル・ストリーミングが使用できるメカニズム・バッファの数を制限します。 +以前は、ラージ値にeffective_io_concurrencyを指定すると、1つのストリームがすべてのバッファを使用できるため、エラーが発生していました。 + + + + + + + +《機械翻訳》自動バキュームプロセスがデータベースに登録しているオーダーを修正します。 +(Rustam Khamidullin) + § + + + + +《機械翻訳》本来はその逆であるべきデータベースを、意図せずに最低スコアから最高スコアまで処理していました。 + + + + + + + +《機械翻訳》リストアVACUUM周回フェイルセーフモードでの共同バッファプールのフル活用 +(Melanie Plageman) + § + § + + + + +《機械翻訳》通常のVACUUMは、他の処理にあまり影響を与えないように、いくつかの共有バッファのみを使用するように制限されています。 +ただし、フェイルセーフモードでは、できるだけ早くトランザクションIDを再要求したいので、この制限は放棄され、バキューム処理ができるだけ早く処理できるようになります。 +この動作は、v18でのリファクタリング中に誤って壊れました。 +リストアit。 + + + + + + + +《機械翻訳》パラレルバキュームワーカープロセスでメモリリークを固定します。 +(Baji Shaik) + § + + + + +《機械翻訳》パラレルワーカーからの経過報告は、レポートごとに約1つのキロバイトが漏洩し、ワーカープロセスの存続期間中に廃棄物が蓄積した。 + + + + + + + +《機械翻訳》GINキャンセル赴任中に問い合わせインデックスとバキューム遅延に敬意を表します-ツリークリーンアップ。 +(Paul Kim, Alexander Korotkov) + § + + + + +《機械翻訳》共通値のための提示ツリーは、ラージとすることができ、したがって、この逃したチェックは、バキュームが中断に気づいて長い間前を実行することを可能にすることができる。 + + + + + + + +《機械翻訳》インデックスおよびSP-GiST GiSTのみのスキャン中に発生する可能性があったインデックスタプルのデコードミスが修正されました。 +(Peter Geoghegan) + § + + + + +《機械翻訳》このエラーは、インデックスのみのスキャンプランからの汚染されたデータの排出につながる可能性があります。 +影響を受ける唯一のコアopclassはGiSTのレンジ_opsであり、レンジカラムが最初のインデックスカラムでない場合にのみ失敗します。 + + + + + + + +《機械翻訳》バルク-拡張テーブルの新たな最後のブロックがその空き領域マップに速やかに追加される保証。 +(Jingtang Zhang) + § + + + + +《機械翻訳》マルチ-ブロックテーブルextensionの最後のブロックがマップでフリーと表示されなかったのは、オフごとのエラーが原因でした。 +これは最終的にバキュームによって修正されますが、その間スペースは使用されませんでした。 + + + + + + + +《機械翻訳》トランザクション中断中のリソースフリーでは、二重無限またはエラーリカバリループの可能性を避けてください。 +クリーンアップ +(Tom Lane) + § + + + + + + + +《機械翻訳》ディレクトリを作成する場合、同じディレクトリの同時作成を許容します。 +(Andrew Dunstan, Tom Lane) + § + + + + + + + +《機械翻訳》仮想的に生成された列に対して、JITコンパイルされたタプル分解コードがアカウントに正しく修正されました。 +(David Rowley) + § + + + + + + + +《機械翻訳》依存しているオブジェクトの共有ロックを取得することで、ダングリングオブジェクトの依存関係が作成されないようにします。 +(Bertrand Drouvot) + § + § + + + + +《機械翻訳》共有ロックは、以前に存在していたオブジェクトを削除して、依存していた競合条件を削除しようとする試みをコンフリクトします。 +例の場合、あるセッションが(空に見える)スキーマを削除すると同時に、他のセッションがそのスキーマに関数を作成すると、以前は両方の取引がコミットする可能性があり、無効な関数定義が残されていました。 +これで、どちらかのトランザクションが失敗します。 + + + + + + + +《機械翻訳》SERIALIZABLE隔離競合条件のコンフリクト検出にモードを固定する。 +(Peter Geoghegan) + § + + + + +《機械翻訳》最初は空であったb-treeコンフリクトを検査する際にインデックスが見落とされる可能性があり、コミットへの競合するトランザクションを不適切に許可することにより、直列化可能性の失敗を可能にする。 + + + + + + + +《機械翻訳》ProcSignalBarrierコードの競合条件を修正します。 +(Masahiko Sawada) + § + + + + +《機械翻訳》このエラーにより、通常はレポート後にプロセスが停止する可能性がありますnnnn ProcSignalBarrierを受け入れるためにPIDでバックエンドを待機しています。 + + + + + + + +《機械翻訳》同じロックグループに属する一連のプロセスが同時に終了する場合の競合状態を修正した。 +(Vlad Lesin) + § + § + + + + +《機械翻訳》これらのエラーは、パニックはすでに所有されていますのようなメッセージを表示して、ラッチの中断につながる可能性があります。 +この問題は通常のパラレル問い合わせでは発生しません。 +なぜなら、リーダーはワーカーが終了するのを見て前を出ることはないからです。 +しかし、いくつかの拡張はこの問題に到達します。 + + + + + + + +《機械翻訳》ロギングがテーブルの可視マップに割り込む操作のWALクリアを修正しました。 +(Melanie Plageman, Andres Freund) + § + § + § + + + + +《機械翻訳》このようなVMの変更はWALサマライザによって見逃され、不正な増分バックアップを引き起こす可能性がありました。 +また、必要なときにこのようなVMページのフルページイメージをログすることに失敗し、引き裂かれたページ書き込みが修正されない可能性がありました。 +これは、インデックスのみのスキャンからの間違い結果など、後で不正な動作を引き起こす可能性がありました。 + + + + + + + +《機械翻訳》WALサマライザプロセスがタイムラインスイッチで立ち往生するのを防ぎます。 +(Robert Haas) + § + § + + + + + + + +《機械翻訳》スタンバイのプロモーション中にロジカルデコーディングのタイムライン選択とのレースを修正しました。 +(Bertrand Drouvot) + § + § + + + + +《機械翻訳》スタンバイで実行されるロジカルデコーディングは、要求されたWALセグメントが既に削除されているエラーで失敗する可能性がありました。 +再試行は成功するため、永続的な問題はありませんでしたが、可用性の危険がありました。 + + + + + + + +《機械翻訳》タイムラインジャンプ中に、WALレシーバのコネクション文字列全体を露出させないようにします。 +(Chao Li) + § + + + + +《機械翻訳》pg_stat_wal_receiverビューはコネクション文字列の消毒されたバージョンを示し、敏感なデータは示さないはずです。 +しかし、既存のWALレシーバを再利用するときに一時的に完全な文字列を示しました。 + + + + + + + +《機械翻訳》アサート中に受け取ったタプルの正しい列数を検証するために、論理レプリケーションだけではなく、ランタイム検査を使用してください。 +(Varik Matevosyan) + § + + + + +《機械翻訳》悪意のあるパブリッシャーやバグのあるシナリオは、矛盾した数の列を送信する可能性があります。 +これが深刻な悪影響を及ぼす地域は見つかりませんでしたが、特別な注意が必要と思われます。 + + + + + + + +《機械翻訳》建設された文字列内のレプリケーションコマンドパラメータの見積もりをクリーンアップします。 +(Tom Lane) + § + + + + +《機械翻訳》レプリケーションコマンドを生成する様々な場所で、これらのコマンドに挿入する必要があるレプリケーションスロット名やその他のパラメータの引用に十分な注意が払われていませんでした。 +これにより、これらのコマンドで予期しない構文エラーが発生する可能性がありました。 +原則的には、巧妙に細工されたレプリケーションスロット名前はSQLインジェクションを引き起こす可能性がありますが、実際にはそのようなシナリオは非常に起こりにくいと思われます。 +なぜなら、レプリケーション操作は高度な権限を持つユーザのみが呼び出すことができ、信頼できないソースからのスロット名前を使用する理由はないからです。 + + + + + + + +《機械翻訳》空の準備されたトランザクションのロジカルデコーディングを修正しました。 +(Masahiko Sawada) + § + + + + +《機械翻訳》デコード可能な更新を引き起こさなかったプリペアードトランザクションは、先行するPREPAREがないCOMMIT/ROLLBACK PREPAREDを出力プラグインに送信する結果になる可能性があります。 +組み込みのサブスクライバーでは、これはレプリケーションを壊し、他のプラグインもおそらくそれを好まないでしょう。 + + + + + + + +《機械翻訳》スタンバイ昇格後のログされないシーケンスの破損を修正しました。 +(Fujii Masao) + § + + + + +《機械翻訳》以前は、ログに記録されていないシーケンスがプライマリで作成され、スタンバイに複製された場合、スタンバイをプロモートした後にシーケンスをアクセスすると、シーケンスのマジックナンバーが悪いまたは関連するエラーで失敗することがありました。 + + + + + + + +《機械翻訳》カスケードスタンバイ代替後のアーカイブ再接続障害を修正しました。 +(Marco Nenciarini) + § + + + + +《機械翻訳》カスケードスタンバイは、アーカイブスタンバイにフォールバックした後、要求された開始点が.WALフラッシュ位置の前にありますで上流リカバリへの再接続に失敗する可能性があります。 + + + + + + + +《機械翻訳》ホット-スタンバイ間の接続を許可しない前WALリプレイが一貫したデータベース状態になりました。 +(Nikhil Sontakke) + § + + + + + + + +《機械翻訳》トライからクリアpg_データベースには移動しないでくださいdathasloginevtスタンバイサーバでローカルに移動します。 +(Ayush Tiwari) + § + + + + +《機械翻訳》イベントトリガクリーンアップはプライマリだけでなくスタンバイサーバでもその行動を実行しようとしました。 +それはスタンバイでは機能しませんし、プライマリのデータベース変更のリプレイがすぐにそれを修正するので、とにかくその必要はありません。 + + + + + + + +《機械翻訳》古い競合条件スロットを削除するときは、レプリケーションを使用しないでください。 +(Xuneng Zhou) + § + + + + +《機械翻訳》誤ったロック解除およびログメッセージは、別のセッションが、ドロップされたスロットの共有メモリエントリを直ちに再利用した場合に発生する可能性がある。 + + + + + + + +《機械翻訳》エフェメラルレプリケーションスロットをドロップするときは、競合条件を避けてください。 +(Zhijie Hou) + § + + + + +《機械翻訳》スロットをリリースするコードは、レプリケーションスロットをリリースした後に、スロットの共有メモリエントリに対していくつかの追加更新を実行しました。 +これは、削除されたスロットの共有メモリエントリを別のセッションがすぐに再利用できるため、安全ではありません。 +スキップは、一時的なスロットのケースでこれらの更新を行います。 + + + + + + + +《機械翻訳》論理レプリケーションテーブルの同期化中に古い進行状況レポートを修正しました。 +(Shinya Kato) + § + + + + +《機械翻訳》これまでは、サブスクライバーのpg_stat_progress_コピービューは、データコピーが終了した後も最初のCOPYオペレーションをアクティブとして表示し続けていました。 +古いエントリは、同期がパブリッシャーに追いつくまで可視のままでした。 + + + + + + + +《機械翻訳》バックアップの失敗に関するクリアベースバックアップの進展。 +(Chao Li) + § + § + + + + +《機械翻訳》以前は、pg_stat_progress_basebackupビューは、障害発生後、エントリクライアントが切断されるまで、古い進行状況レプリケーションを表示し続けましたpg_basebackup通常はすぐに切断されますが、他のクライアントは切断されない場合があります。 + + + + + + + +《機械翻訳》track_functionsが有効な場合にpgstatsエントリが同時に削除されることで発生する可能性があったパニックを修正しました。 +(Sami Imseih, Michael Paquier) + § + § + § + + + + + + + +《機械翻訳》対応する共有ハッシュテーブルローカル用のエントリの取得に失敗した後、壊れたスペースpgstatsエントリをクリーンアップします。 +(Niall Newman) + § + + + + +《機械翻訳》これを行わなかった場合、次にローカルエントリが使用されたときにNULL-ポインタ間の逆参照が発生しました。 + + + + + + + +《機械翻訳》読み取りまたは書き込みに失敗した後に、誤った入出力オペレーション統計処理を記録しないようにしてください。 +(Bertrand Drouvot) + § + + + + + + + +《機械翻訳》では、無効なヌルポインタクラッシュ::InServer::PostgreSQLを操作するときに配列がオブジェクトを逆参照しないようにします。 +PL/Perl +(Xing Guo) + § + + + + + + + +《機械翻訳》PL/Pythonでは、シーケンスオブジェクトとマッピングオブジェクトを使用するときのエラーが正しくチェックされるようになりました。 +(Richard Guo) + § + + + + +《機械翻訳》以前は、壊れたオブジェクトまたは処理されない例外により、ヌルポインタのクラッシュの逆参照が発生する可能性があった。 + + + + + + + +《機械翻訳》libpqでは、pqReadData()の間にSSLまたはGSS復号化バッファからすべての保留バイトを常に排出します。 +(Jacob Champion) + § + § + § + § + + + + +《機械翻訳》これにより、libpqまたはその呼び出し元のアプリケーションがソケットにさらにデータが到着するのを待っているが、実際にはすべてのデータがすでに到着しているというエッジケースが回避される。 + + + + + + + +《機械翻訳》改善libpqメモリ外の状況のハンドリング。 +(Anthonin Bonnefoy) + § + + + + + + + +《機械翻訳》libpqのトレース機能をプリントの新しいスタイルBackendKeyDataメッセージとCancelRequestメッセージに正しく修正した。 +(Anthonin Bonnefoy) + § + + + + + + + +《機械翻訳》Allow libpq 30000バイトを超えるParameterDescriptionメッセージを受け入れる。 +(Ning Sun) + § + + + + +《機械翻訳》以前は、このメッセージタイプは、libpq有効性のヒューリスティックスで長いと考えられていたものの中には含まれていなかった。 +この制限により、7498を超えるパラメータを持つプリペアド問い合わせで失敗したが、これは起こりそうにないがサポートされている。 + + + + + + + +《機械翻訳》NULL-ポインタクラッシュをecpgコンパイラに固定する。 +(Jehan-Guillaume de Rorthais) + § + + + + +《機械翻訳》構造体内にネストされたセクションを含むDECLAREユニオンでecpgが失敗しました。 + + + + + + + +《機械翻訳》ecpgGET/SET DESCRIPTORステートメント内のマルチプルディスクリプタヘッダ項目を拒否します。 +(Masashi Kamura) + § + + + + +《機械翻訳》以前は、文法はこの構文を許可していましたが、壊れたCコードが生成されました。 +文法と文書を調整して、ヘッダアイテムを1つだけ許可するようにしてください。 + + + + + + + +《機械翻訳》psqlで、パイプラインモードの遅延エラーに関する問題を修正しました。 +(Michael Paquier) + § + + + + +《機械翻訳》psql遅延のアサーション違反など、サーバが回答のエラーを同期メッセージに報告する一部のシナリオでは、スタックまたは制約障害が発生する可能性があります。 + + + + + + + +《機械翻訳》make直線幅マッチin psqlの拡張に位置合わせされた出力フォーマット。 +(Pavel Stehule) + § + + + + +《機械翻訳》テーブルのデータ行がレコードのヘッダ行よりも狭い場合は、データ行をヘッダのマッチまで広げて、見苦しい出力を回避します。 + + + + + + + +《機械翻訳》psqlの特別変数の意図された上限を実施するWATCH_INTERVAL。 +(Sven Klemm, Daniel Gustafsson) + § + + + + +《機械翻訳》too-ラージ値が指定された場合、psqlはエラーを報告しましたが、設定を適用しました。 + + + + + + + +《機械翻訳》データベースサイズを見せたフィックスpsqlの権限チェック\l+。 +(Christoph Berg) + § + + + + +《機械翻訳》基礎となるサーバ関数では、pg_read_all_stats権限を持つユーザは、すべてのデータベースのサイズを参照することができます。 +これは、データベースが存在しない場合でも同様ですCONNECT権限。 +しかし、psqlはこの規定を認識しておらず、ユーザがCONNECT権限を持たない限り、関数を呼び出ししませんでした。 + + + + + + + +《機械翻訳》psqlののタブ完了\df手順も検討 +(Erik Wienhold) + § + + + + + + + +《機械翻訳》スレッド安全バグをpgbench. +(Fujii Masao) + § + + + + +《機械翻訳》pgbenchがマルチプルスレッドとオプションで実行されると、異なるスレッドが同じバッファからコンストラクトへのエラーメッセージを使用しようとする可能性があり、ログの出力が破損する可能性があります。 + + + + + + + +《機械翻訳》pg_combinebackupでは、無限ループが予想より短い場合はソースファイルを防止します。 +(Peter Eisentraut) + § + + + + + + + +《機械翻訳》pg_createsubscriberでエラーが発生した後のパブリッシャー側オブジェクトのクリーンアップを修正しました。 +(Nisha Moond) + § + + + + +《機械翻訳》論理レプリケーションオブジェクトを作成した後にpg_createsubscriberが失敗した場合は、パブリッシャーに作成したパブリケーションとレプリケーションスロットを削除する必要があります。 +そうしなかったエラーのケースもあります。 + + + + + + + +《機械翻訳》ソースクラスタのグループアクセス権pg_recvlogicalファイルを出力するためのファイル読み取り権限を使用します。 +(Fujii Masao) + § + + + + +《機械翻訳》pg_recvlogicalはこのように動作すると説明されていましたが、実際にグループが読めるようにはなっていませんでした。 + + + + + + + +《機械翻訳》またはを持つpg_リストアの一貫性のない動作を修正しました。 +(Chao Li, Michael Paquier) + § + § + + + + +《機械翻訳》のような他の選択的リストアオプションと組み合わせると、これらのオプションはpg_dump類似のリストアとは異なり、期待された項目をオプションすることができなかった。 + + + + + + + +《機械翻訳》vacuumdb --missing-stats-onlyパーティション化された式インデックスを無視するように修正しました。 +(Baji Shaik) + § + + + + +《機械翻訳》以前は、vacuumdbは常にANALYZEパーティション化されたテーブルを試みていました。 +統計処理はパーティション化されたインデックスに対して作成されることはなく、リーフインデックスに対してのみ作成されるため、何も達成されませんでした。 + + + + + + + +《機械翻訳》contrib/amcheckbtreeメタページallequalimageレポートのフラグの破損に対する失敗を修正しました。 +(Chao Li) + § + + + + + + + +《機械翻訳》contrib/amcheckでは、問い合わせメモリリークを検証する際にGIN寿命インデックスを修正しました。 +(Kirill Reshke) + § + + + + + + + +《機械翻訳》contrib/amcheck,ハンドルshort-ヘッダvarlenaデータムで正しく動作するようになりました。 +(Andrey Borodin) + § + + + + +《機械翻訳》このエラーは、btreeインデックスを検証する際に過剰な作業を行う可能性がありますが、これ以上悪い結果にはならなかったようです。 + + + + + + + +《機械翻訳》contrib/btree_GiSTで、opclass NaNfloat4float8のハンドリングを修正しました。 +(Bill Kim, Tom Lane) + § + + + + +《機械翻訳》比較は、GiSTペナルティ関数や遠隔関数と同様に、アカウントではありませんでしたNaNそして、渡されたときに間違いの答えを返します。 +これらの列にNaNエントリがある可能性がある場合は、この更新をインストールした後にインデックス再作成btree_GiSTfloat列のインデックスを行うことをお勧めします。 + + + + + + + +《機械翻訳》contrib/btree_GiSTでは、並べ替えインデックスの構築中にビット/varbitエントリのGiSTを修正しました。 +(Tom Lane) + § + + + + +《機械翻訳》ビット型の値はbyteaであるかのようにソートされました。 +これは明らかな失敗を引き起こしませんでしたが、型の表現が異なるため、非効率的なインデックスになりました。 +このインデックス再作成をインストールした後に、ビットbtree_gist更新列のインデックスを行うことをお勧めします。 + + + + + + + +《機械翻訳》contrib/btree_gistで、等しくない演算子を使用した検索を修正しました。 +(Ayush Tiwari) + § + + + + +《機械翻訳》変数-長さデータタイプの場合、リーフインデックス以外のページをスキャンするコードは間違い比較関数を適用していたため、間違いの結果が得られ、クラッシュする可能性がありました。 + + + + + + + +《機械翻訳》contrib/dblinkおよびcontrib/postgres_fdw,保証では、ユーザ-マッピングの設定use_scram_passthroughは外部サーバの設定より優先されます。 +(Matheus Alcantara) + § + § + + + + +《機械翻訳》以前は優先順位が逆でしたが、それは他の外国-テーブルオプションの行動と矛盾しています。 + + + + + + + +《機械翻訳》contrib/dblink外部通過地点ラッパーの設定use_scram_データを拒否する。 +(Matheus Alcantara) + § + + + + +《機械翻訳》このオプションは外部サーバとユーザのマッピングでのみ意味がありますが、dblinkは誤ってFDWレベルでもこのオプションを許可しました(そして無視しました)。 + + + + + + + +《機械翻訳》contrib/hstore_plperl,contrib/jsonb_plperl,and contrib/jsonb_plpython.における無防備な再帰とループを修正しました。 +(Aleksander Alekseev) + § + § + + + + +《機械翻訳》深くネストされたスタックオーバーフロー値を処理するときのjsonbを防止し、Perl無限ループ参照の循環チェーンを逆参照しようとするときに発生するオブジェクトの中断を許可します。 + + + + + + + +《機械翻訳》contrib/intarrayにある統計処理catcacheエントリの見逃しリリースを修正しました。 +(Man Zeng) + § + + + + +《機械翻訳》この見落としにより、resource is not閉じた:キャッシュpg_statisticのような警告が発生しました。 + + + + + + + +《機械翻訳》では、整数オーバーフローを比較して修正します。 +contrib/ltree +(Ayush Tiwari) + § + + + + +《機械翻訳》ltree値に約14,653を超えるラベルが含まれている場合、オーバーフローのために間違い比較の回答が得られました。 +btreeインデックス包含の値の場合、おそらく破損しているため、この更新をインストールした後にインデックスを再作成する必要があります。 + + + + + + + +《機械翻訳》で、contrib/pgcrypto OSLSCipherフリーを使用中にクラッシュに遭遇した後は、二重エラーオブジェクトを使用しないでください。 +(Yuelin Wang) + § + + + + + + + +《機械翻訳》境界外のアクセスをcontrib/pg_prewarmのautoprewarmワーカーで修正します。 +(Matheus Alcantara) + § + + + + +《機械翻訳》コードは、配列の端を過ぎたところから値をフェッチしようとし、セグフォールトの危険を冒しました。 + + + + + + + +《機械翻訳》contrib/pg_surgeryheap_force_killおよびheap_force_freeze関数の配列オーバーランを修正しました。 +(Michael Paquier) + § + + + + +《機械翻訳》TID番号がMaxHeapTuplePerPageに等しいオフセットを変更しようとすると、割り当てられたバイトの末尾を超えて1つの配列が書き込まれ、サーバがクラッシュする可能性がありました。 + + + + + + + +《機械翻訳》では、contrib/pg_surgery 64K以上の要素を持つ無限ループ配列を持つTIDは避けてください。 +(Andrey Rachitskiy) + § + + + + + + + +《機械翻訳》contrib/refintcheck_foreign_key().*でのNULL-ポインタの逆参照を避ける。 +(Ayush Tiwari) + § + + + + +《機械翻訳》更新カスケードケースでは、被参照カラムのNULL値がクラッシュにつながりました。 +これはCVE-2026-6637の修正における見落としですが、以前に存在していたコードも実際には正しくありませんでした。 + + + + + + + +《機械翻訳》contrib/segをプリントセグメントに~確実度インジケータで正しく修正した。 +(Ewan Young) + § + + + + +《機械翻訳》タイポのために、seg_out()~セグメントの上部境界にアタッチされた確実性指示子を印刷しませんでした。 +さらに悪いことに、下部境界に~があり、上部境界には指示子がない場合、上部境界はまったく印刷されず、値がオープンインターバルに誤って変換されました。 + + + + + + + +《機械翻訳》contrib/xml2xpath_nodeset()関数の名前空間ノードでクラッシュを修正しました。 +(Andrey Chernyy, Michael Paquier) + § + + + + + + + +《機械翻訳》サポートの建物PostgreSQLOpenSSL 4. +(Daniel Gustafsson) + § + + + + + + + +タイムゾーンデータファイルがtzdataリリース2026cに更新されました。 +(Tom Lane) + § + + + + +《機械翻訳》アルバータ(アメリカ/エドモントン)は、2026年11月から1年を通してUTC-06(事実上の恒久的なDST)になります。 +このリリースでは、TZの省略形がCSTそれ以降になると想定しています。 +これは変更される可能性がありますが、新しい省略形が使用されるかどうかは不明です。 + + + + +《機械翻訳》モロッコ(Africa/Casablanca)は、2026-09-20に夏時間の移行なしで恒久的なUTC+00に移行します。 + + + + + + + + -パスワードやハッシュなどの検証には、 memcpy()strcmp()の代わりにtimingsafe_bcmp()を使用するようになりました。 +《マッチ度[89.389068]》パスワードやハッシュなどの検証には、 memcpy()strcmp()の代わりにtimingsafe_bcmp()を使用するようになりました。 これらの関数のデータ依存性が、これらの箇所で悪用される可能性があるかどうかは不明ですが、安全を期してこれらが置き換えられました。 +《機械翻訳》使用timingsafe_bcmp()代わりmemcmp()または、パスワード、ハッシュなどをチェックする場合には、または、これらの関数のデータ依存性がこれらの場所のいずれかで有効に利用できるかどうかは不明であるが、安全のためにそれらを置き換える。 +strcmp() diff --git a/doc/src/sgml/rules.sgml b/doc/src/sgml/rules.sgml index db0417b3d93..531e3b14bb5 100644 --- a/doc/src/sgml/rules.sgml +++ b/doc/src/sgml/rules.sgml @@ -909,7 +909,7 @@ SELECT shoe_ready.shoename, shoe_ready.sh_avail, WHERE rsl.sl_color = rsh.slcolor AND rsl.sl_len_cm >= rsh.slminlen_cm AND rsl.sl_len_cm <= rsh.slmaxlen_cm) shoe_ready - WHERE shoe_ready.total_avail > 2; + WHERE shoe_ready.total_avail >= 2; diff --git a/doc/src/sgml/storage.sgml b/doc/src/sgml/storage.sgml index 219da96b6c3..fc92ebeec02 100644 --- a/doc/src/sgml/storage.sgml +++ b/doc/src/sgml/storage.sgml @@ -1244,7 +1244,7 @@ data. Empty in ordinary tables. (PageHeaderData). Its format is detailed in . The first field tracks the most recent WAL entry related to this page. The second field contains - the page checksum if are + the page checksum if data checksums are enabled. Next is a 2-byte field containing flag bits. This is followed by three 2-byte integer fields (pd_lower, pd_upper, and @@ -1265,7 +1265,7 @@ data. Empty in ordinary tables. The last field is a hint that shows whether pruning the page is likely to be profitable: it tracks the oldest un-pruned XMAX on the page. --> -それぞれのページの最初の24バイトはページヘッダ(PageHeaderData)から構成されています。 +《マッチ度[95.295613]》それぞれのページの最初の24バイトはページヘッダ(PageHeaderData)から構成されています。 その書式をにて説明します。 最初のフィールドは、このページに関連する最も最近のWAL項目を表しています。 2番目のフィールドにはが有効な場合にページチェックサムが格納されています。 diff --git a/doc/src/sgml/stylesheet-speedup-xhtml.xsl b/doc/src/sgml/stylesheet-speedup-xhtml.xsl index 3a127dc3b54..3befd1ee082 100644 --- a/doc/src/sgml/stylesheet-speedup-xhtml.xsl +++ b/doc/src/sgml/stylesheet-speedup-xhtml.xsl @@ -183,32 +183,32 @@ + select="(preceding::*[self::book + or self::preface + or self::chapter + or self::appendix + or self::part + or self::reference + or self::refentry + or self::colophon + or self::article + or self::topic + or self::sect1 + or self::bibliography[parent::article or parent::book or parent::part] + or self ::glossary[parent::article or parent::book or parent::part] + or self::index[$generate.index != 0] + [parent::article or parent::book or parent::part] + or self::setindex[$generate.index != 0]][1] + |ancestor::*[self::set + or self::book + or self::preface + or self::chapter + or self::appendix + or self::part + or self::reference + or self::article + or self::topic + or self::sect1][1])[last()]"/> EndRecPtr; + Relation reln = CreateFakeRelcacheEntry(target_locator); + Buffer vmbuffer = InvalidBuffer; + + /* + * If the vmbuffer was registered, use the recovery-specific routines to + * read it. These will either apply an FPI or indicate that we should + * clear the requested bits ourselves. + * + * Originally, clearing the VM did not register the VM buffers, so since + * registering the VM buffer was a bug fix, we keep a fallback path to + * support replay of WAL generated from before the fix. + */ + if (XLogRecHasBlockRef(record, wal_vm_block_id)) + { + if (XLogReadBufferForRedo(record, wal_vm_block_id, + &vmbuffer) == BLK_NEEDS_REDO) + { + if (visibilitymap_clear_locked(reln, + heap_blkno, vmbuffer, + flags)) + PageSetLSN(BufferGetPage(vmbuffer), lsn); + } + if (BufferIsValid(vmbuffer)) + UnlockReleaseBuffer(vmbuffer); + } + else + { + /* + * This is the backwards compatibility path to clear VM bits for + * records predating VM buffer registration. It is also invoked if the + * heap page's PD_ALL_VISIBLE was cleared but the VM bits were already + * clear. The WAL record flags do not distinguish between these two + * situations. Though this is wasted effort, the behavior is + * historical and the situation should be rare. + */ + visibilitymap_pin(reln, heap_blkno, &vmbuffer); + visibilitymap_clear(reln, heap_blkno, vmbuffer, flags); + ReleaseBuffer(vmbuffer); + } + + FreeFakeRelcacheEntry(reln); +} + /* * Replay XLOG_HEAP2_PRUNE_* records. @@ -350,7 +414,8 @@ heap_xlog_delete(XLogReaderState *record) RelFileLocator target_locator; ItemPointerData target_tid; - XLogRecGetBlockTag(record, 0, &target_locator, NULL, &blkno); + XLogRecGetBlockTag(record, HEAP_DELETE_BLKREF_HEAP, &target_locator, NULL, + &blkno); ItemPointerSetBlockNumber(&target_tid, blkno); ItemPointerSetOffsetNumber(&target_tid, xlrec->offnum); @@ -359,17 +424,12 @@ heap_xlog_delete(XLogReaderState *record) * already up-to-date. */ if (xlrec->flags & XLH_DELETE_ALL_VISIBLE_CLEARED) - { - Relation reln = CreateFakeRelcacheEntry(target_locator); - Buffer vmbuffer = InvalidBuffer; + heap_xlog_vm_clear(record, target_locator, + blkno, HEAP_DELETE_BLKREF_VM, + VISIBILITYMAP_VALID_BITS); - visibilitymap_pin(reln, blkno, &vmbuffer); - visibilitymap_clear(reln, blkno, vmbuffer, VISIBILITYMAP_VALID_BITS); - ReleaseBuffer(vmbuffer); - FreeFakeRelcacheEntry(reln); - } - - if (XLogReadBufferForRedo(record, 0, &buffer) == BLK_NEEDS_REDO) + if (XLogReadBufferForRedo(record, HEAP_DELETE_BLKREF_HEAP, + &buffer) == BLK_NEEDS_REDO) { page = BufferGetPage(buffer); @@ -434,7 +494,8 @@ heap_xlog_insert(XLogReaderState *record) ItemPointerData target_tid; XLogRedoAction action; - XLogRecGetBlockTag(record, 0, &target_locator, NULL, &blkno); + XLogRecGetBlockTag(record, HEAP_INSERT_BLKREF_HEAP, &target_locator, NULL, + &blkno); ItemPointerSetBlockNumber(&target_tid, blkno); ItemPointerSetOffsetNumber(&target_tid, xlrec->offnum); @@ -446,15 +507,9 @@ heap_xlog_insert(XLogReaderState *record) * already up-to-date. */ if (xlrec->flags & XLH_INSERT_ALL_VISIBLE_CLEARED) - { - Relation reln = CreateFakeRelcacheEntry(target_locator); - Buffer vmbuffer = InvalidBuffer; - - visibilitymap_pin(reln, blkno, &vmbuffer); - visibilitymap_clear(reln, blkno, vmbuffer, VISIBILITYMAP_VALID_BITS); - ReleaseBuffer(vmbuffer); - FreeFakeRelcacheEntry(reln); - } + heap_xlog_vm_clear(record, target_locator, + blkno, HEAP_INSERT_BLKREF_VM, + VISIBILITYMAP_VALID_BITS); /* * If we inserted the first and only tuple on the page, re-initialize the @@ -462,13 +517,14 @@ heap_xlog_insert(XLogReaderState *record) */ if (XLogRecGetInfo(record) & XLOG_HEAP_INIT_PAGE) { - buffer = XLogInitBufferForRedo(record, 0); + buffer = XLogInitBufferForRedo(record, HEAP_INSERT_BLKREF_HEAP); page = BufferGetPage(buffer); PageInit(page, BufferGetPageSize(buffer), 0); action = BLK_NEEDS_REDO; } else - action = XLogReadBufferForRedo(record, 0, &buffer); + action = XLogReadBufferForRedo(record, HEAP_INSERT_BLKREF_HEAP, + &buffer); if (action == BLK_NEEDS_REDO) { Size datalen; @@ -479,7 +535,7 @@ heap_xlog_insert(XLogReaderState *record) if (PageGetMaxOffsetNumber(page) + 1 < xlrec->offnum) elog(PANIC, "invalid max offset number"); - data = XLogRecGetBlockData(record, 0, &datalen); + data = XLogRecGetBlockData(record, HEAP_INSERT_BLKREF_HEAP, &datalen); newlen = datalen - SizeOfHeapHeader; Assert(datalen > SizeOfHeapHeader && newlen <= MaxHeapTupleSize); @@ -559,7 +615,8 @@ heap_xlog_multi_insert(XLogReaderState *record) */ xlrec = (xl_heap_multi_insert *) XLogRecGetData(record); - XLogRecGetBlockTag(record, 0, &rlocator, NULL, &blkno); + XLogRecGetBlockTag(record, HEAP_MULTI_INSERT_BLKREF_HEAP, &rlocator, NULL, + &blkno); /* check that the mutually exclusive flags are not both set */ Assert(!((xlrec->flags & XLH_INSERT_ALL_VISIBLE_CLEARED) && @@ -568,27 +625,26 @@ heap_xlog_multi_insert(XLogReaderState *record) /* * The visibility map may need to be fixed even if the heap page is * already up-to-date. + * + * Clear the VM (if needed) before clearing the heap page-level visibility + * flag (PD_ALL_VISIBLE) to prevent the heap page from being marked + * all-visible in the VM while its PD_ALL_VISIBLE is clear. */ if (xlrec->flags & XLH_INSERT_ALL_VISIBLE_CLEARED) - { - Relation reln = CreateFakeRelcacheEntry(rlocator); - Buffer vmbuffer = InvalidBuffer; - - visibilitymap_pin(reln, blkno, &vmbuffer); - visibilitymap_clear(reln, blkno, vmbuffer, VISIBILITYMAP_VALID_BITS); - ReleaseBuffer(vmbuffer); - FreeFakeRelcacheEntry(reln); - } + heap_xlog_vm_clear(record, rlocator, + blkno, HEAP_MULTI_INSERT_BLKREF_VM, + VISIBILITYMAP_VALID_BITS); if (isinit) { - buffer = XLogInitBufferForRedo(record, 0); + buffer = XLogInitBufferForRedo(record, HEAP_MULTI_INSERT_BLKREF_HEAP); page = BufferGetPage(buffer); PageInit(page, BufferGetPageSize(buffer), 0); action = BLK_NEEDS_REDO; } else - action = XLogReadBufferForRedo(record, 0, &buffer); + action = XLogReadBufferForRedo(record, HEAP_MULTI_INSERT_BLKREF_HEAP, + &buffer); if (action == BLK_NEEDS_REDO) { char *tupdata; @@ -596,7 +652,8 @@ heap_xlog_multi_insert(XLogReaderState *record) Size len; /* Tuples are stored as block data */ - tupdata = XLogRecGetBlockData(record, 0, &len); + tupdata = XLogRecGetBlockData(record, HEAP_MULTI_INSERT_BLKREF_HEAP, + &len); endptr = tupdata + len; page = (Page) BufferGetPage(buffer); @@ -691,6 +748,8 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) Buffer obuffer, nbuffer; Page page; + bool new_cleared, + old_cleared; OffsetNumber offnum; ItemId lp = NULL; HeapTupleData oldtup; @@ -713,8 +772,10 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) oldtup.t_data = NULL; oldtup.t_len = 0; - XLogRecGetBlockTag(record, 0, &rlocator, NULL, &newblk); - if (XLogRecGetBlockTagExtended(record, 1, NULL, NULL, &oldblk, NULL)) + XLogRecGetBlockTag(record, HEAP_UPDATE_BLKREF_HEAP_NEW, &rlocator, NULL, + &newblk); + if (XLogRecGetBlockTagExtended(record, HEAP_UPDATE_BLKREF_HEAP_OLD, NULL, NULL, + &oldblk, NULL)) { /* HOT updates are never done across pages */ Assert(!hot_update); @@ -728,14 +789,95 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) * The visibility map may need to be fixed even if the heap page is * already up-to-date. */ - if (xlrec->flags & XLH_UPDATE_OLD_ALL_VISIBLE_CLEARED) + new_cleared = (xlrec->flags & XLH_UPDATE_NEW_ALL_VISIBLE_CLEARED) != 0; + old_cleared = (xlrec->flags & XLH_UPDATE_OLD_ALL_VISIBLE_CLEARED) != 0; + if (new_cleared || old_cleared) { Relation reln = CreateFakeRelcacheEntry(rlocator); - Buffer vmbuffer = InvalidBuffer; + bool has_vm_old = XLogRecHasBlockRef(record, HEAP_UPDATE_BLKREF_VM_OLD); + bool has_vm_new = XLogRecHasBlockRef(record, HEAP_UPDATE_BLKREF_VM_NEW); + + if (has_vm_new) + { + Buffer vmbuffer_new = InvalidBuffer; + + Assert(xlrec->flags & XLH_UPDATE_NEW_ALL_VISIBLE_CLEARED); + + if (XLogReadBufferForRedo(record, HEAP_UPDATE_BLKREF_VM_NEW, + &vmbuffer_new) == BLK_NEEDS_REDO) + { + /* + * If both the old and new heap pages were all-visible and + * their VM bits are on the same VM page, that single VM page + * is registered as HEAP_UPDATE_BLKREF_VM_NEW. Clear both heap + * blocks' VM bits from the single provided VM buffer. It's + * possible that one of the page's VM bits were already clear, + * but visibilitymap_clear() is harmless as long as we provide + * it the correct bits. + * + * We must verify that oldblk's VM bits really are on this VM + * page, rather than relying on the absence of a separate + * VM_OLD block reference: VM_OLD is also omitted when oldblk + * is on a different VM page but its bit was already clear. + */ + if (xlrec->flags & XLH_UPDATE_OLD_ALL_VISIBLE_CLEARED && + visibilitymap_pin_ok(oldblk, vmbuffer_new)) + { + if (visibilitymap_clear_locked(reln, oldblk, vmbuffer_new, + VISIBILITYMAP_VALID_BITS)) + PageSetLSN(BufferGetPage(vmbuffer_new), lsn); + } + /* If VM_NEW is registered, we are sure newblk is on VM_NEW */ + if (visibilitymap_clear_locked(reln, newblk, vmbuffer_new, + VISIBILITYMAP_VALID_BITS)) + PageSetLSN(BufferGetPage(vmbuffer_new), lsn); + } + if (BufferIsValid(vmbuffer_new)) + UnlockReleaseBuffer(vmbuffer_new); + } + if (has_vm_old) + { + Buffer vmbuffer_old = InvalidBuffer; + + Assert(xlrec->flags & XLH_UPDATE_OLD_ALL_VISIBLE_CLEARED); + + if (XLogReadBufferForRedo(record, HEAP_UPDATE_BLKREF_VM_OLD, &vmbuffer_old) == + BLK_NEEDS_REDO) + { + if (visibilitymap_clear_locked(reln, oldblk, vmbuffer_old, + VISIBILITYMAP_VALID_BITS)) + PageSetLSN(BufferGetPage(vmbuffer_old), lsn); + } + if (BufferIsValid(vmbuffer_old)) + UnlockReleaseBuffer(vmbuffer_old); + } + if (!has_vm_old && !has_vm_new) + { + /* + * Backwards compatibility path. Previously, the VM buffers were + * not registered in the WAL record. We need this path to replay + * WAL generated by a not-yet-patched primary during upgrade. + */ + if (old_cleared) + { + Buffer vmbuffer = InvalidBuffer; + + visibilitymap_pin(reln, oldblk, &vmbuffer); + visibilitymap_clear(reln, oldblk, vmbuffer, + VISIBILITYMAP_VALID_BITS); + ReleaseBuffer(vmbuffer); + } + if (new_cleared) + { + Buffer vmbuffer = InvalidBuffer; + + visibilitymap_pin(reln, newblk, &vmbuffer); + visibilitymap_clear(reln, newblk, vmbuffer, + VISIBILITYMAP_VALID_BITS); + ReleaseBuffer(vmbuffer); + } + } - visibilitymap_pin(reln, oldblk, &vmbuffer); - visibilitymap_clear(reln, oldblk, vmbuffer, VISIBILITYMAP_VALID_BITS); - ReleaseBuffer(vmbuffer); FreeFakeRelcacheEntry(reln); } @@ -743,14 +885,17 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) * In normal operation, it is important to lock the two pages in * page-number order, to avoid possible deadlocks against other update * operations going the other way. However, during WAL replay there can - * be no other update happening, so we don't need to worry about that. But - * we *do* need to worry that we don't expose an inconsistent state to Hot - * Standby queries --- so the original page can't be unlocked before we've - * added the new tuple to the new page. + * be no other update happening, so we don't need to worry about that. + * Notice we also don't worry about this when locking VM buffers above. + * + * But we *do* need to worry that we don't expose an inconsistent state to + * Hot Standby queries --- so the original page can't be unlocked before + * we've added the new tuple to the new page. */ /* Deal with old tuple version */ - oldaction = XLogReadBufferForRedo(record, (oldblk == newblk) ? 0 : 1, + oldaction = XLogReadBufferForRedo(record, (oldblk == newblk) ? + HEAP_UPDATE_BLKREF_HEAP_NEW : HEAP_UPDATE_BLKREF_HEAP_OLD, &obuffer); if (oldaction == BLK_NEEDS_REDO) { @@ -783,7 +928,7 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) /* Mark the page as a candidate for pruning */ PageSetPrunable(page, XLogRecGetXid(record)); - if (xlrec->flags & XLH_UPDATE_OLD_ALL_VISIBLE_CLEARED) + if (old_cleared) PageClearAllVisible(page); PageSetLSN(page, lsn); @@ -800,28 +945,14 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) } else if (XLogRecGetInfo(record) & XLOG_HEAP_INIT_PAGE) { - nbuffer = XLogInitBufferForRedo(record, 0); + nbuffer = XLogInitBufferForRedo(record, HEAP_UPDATE_BLKREF_HEAP_NEW); page = (Page) BufferGetPage(nbuffer); PageInit(page, BufferGetPageSize(nbuffer), 0); newaction = BLK_NEEDS_REDO; } else - newaction = XLogReadBufferForRedo(record, 0, &nbuffer); - - /* - * The visibility map may need to be fixed even if the heap page is - * already up-to-date. - */ - if (xlrec->flags & XLH_UPDATE_NEW_ALL_VISIBLE_CLEARED) - { - Relation reln = CreateFakeRelcacheEntry(rlocator); - Buffer vmbuffer = InvalidBuffer; - - visibilitymap_pin(reln, newblk, &vmbuffer); - visibilitymap_clear(reln, newblk, vmbuffer, VISIBILITYMAP_VALID_BITS); - ReleaseBuffer(vmbuffer); - FreeFakeRelcacheEntry(reln); - } + newaction = XLogReadBufferForRedo(record, HEAP_UPDATE_BLKREF_HEAP_NEW, + &nbuffer); /* Deal with new tuple */ if (newaction == BLK_NEEDS_REDO) @@ -831,7 +962,8 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) Size datalen; Size tuplen; - recdata = XLogRecGetBlockData(record, 0, &datalen); + recdata = XLogRecGetBlockData(record, HEAP_UPDATE_BLKREF_HEAP_NEW, + &datalen); recdata_end = recdata + datalen; page = BufferGetPage(nbuffer); @@ -918,7 +1050,7 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) if (offnum == InvalidOffsetNumber) elog(PANIC, "failed to add tuple"); - if (xlrec->flags & XLH_UPDATE_NEW_ALL_VISIBLE_CLEARED) + if (new_cleared) PageClearAllVisible(page); freespace = PageGetHeapFreeSpace(page); /* needed to update FSM below */ @@ -1010,22 +1142,19 @@ heap_xlog_lock(XLogReaderState *record) */ if (xlrec->flags & XLH_LOCK_ALL_FROZEN_CLEARED) { - RelFileLocator rlocator; - Buffer vmbuffer = InvalidBuffer; BlockNumber block; - Relation reln; - - XLogRecGetBlockTag(record, 0, &rlocator, NULL, &block); - reln = CreateFakeRelcacheEntry(rlocator); + RelFileLocator rlocator; - visibilitymap_pin(reln, block, &vmbuffer); - visibilitymap_clear(reln, block, vmbuffer, VISIBILITYMAP_ALL_FROZEN); + XLogRecGetBlockTag(record, HEAP_LOCK_BLKREF_HEAP, &rlocator, NULL, + &block); - ReleaseBuffer(vmbuffer); - FreeFakeRelcacheEntry(reln); + heap_xlog_vm_clear(record, rlocator, + block, HEAP_LOCK_BLKREF_VM, + VISIBILITYMAP_ALL_FROZEN); } - if (XLogReadBufferForRedo(record, 0, &buffer) == BLK_NEEDS_REDO) + if (XLogReadBufferForRedo(record, HEAP_LOCK_BLKREF_HEAP, + &buffer) == BLK_NEEDS_REDO) { page = (Page) BufferGetPage(buffer); @@ -1086,22 +1215,19 @@ heap_xlog_lock_updated(XLogReaderState *record) */ if (xlrec->flags & XLH_LOCK_ALL_FROZEN_CLEARED) { - RelFileLocator rlocator; - Buffer vmbuffer = InvalidBuffer; BlockNumber block; - Relation reln; - - XLogRecGetBlockTag(record, 0, &rlocator, NULL, &block); - reln = CreateFakeRelcacheEntry(rlocator); + RelFileLocator rlocator; - visibilitymap_pin(reln, block, &vmbuffer); - visibilitymap_clear(reln, block, vmbuffer, VISIBILITYMAP_ALL_FROZEN); + XLogRecGetBlockTag(record, HEAP_LOCK_BLKREF_HEAP, &rlocator, NULL, + &block); - ReleaseBuffer(vmbuffer); - FreeFakeRelcacheEntry(reln); + heap_xlog_vm_clear(record, rlocator, + block, HEAP_LOCK_BLKREF_VM, + VISIBILITYMAP_ALL_FROZEN); } - if (XLogReadBufferForRedo(record, 0, &buffer) == BLK_NEEDS_REDO) + if (XLogReadBufferForRedo(record, HEAP_LOCK_BLKREF_HEAP, + &buffer) == BLK_NEEDS_REDO) { page = BufferGetPage(buffer); diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c index c482c9d61b2..242564d0c75 100644 --- a/src/backend/access/heap/hio.c +++ b/src/backend/access/heap/hio.c @@ -403,7 +403,7 @@ RelationAddBlocks(Relation relation, BulkInsertState bistate, { BlockNumber first_fsm_block = first_block + not_in_fsm_pages; - FreeSpaceMapVacuumRange(relation, first_fsm_block, last_block); + FreeSpaceMapVacuumRange(relation, first_fsm_block, last_block + 1); } if (bistate) diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c index a8025889be0..a36c6b842e8 100644 --- a/src/backend/access/heap/pruneheap.c +++ b/src/backend/access/heap/pruneheap.c @@ -1848,14 +1848,14 @@ heap_get_root_tuples(Page page, OffsetNumber *root_offsets) for (;;) { /* Sanity check (pure paranoia) */ - if (offnum < FirstOffsetNumber) + if (nextoffnum < FirstOffsetNumber) break; /* * An offset past the end of page's line pointer array is possible * when the array was truncated */ - if (offnum > maxoff) + if (nextoffnum > maxoff) break; lp = PageGetItemId(page, nextoffnum); diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 8fbaf126756..989fb491e55 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -1206,6 +1206,7 @@ lazy_scan_heap(LVRelState *vacrel) BlockNumber orig_eager_scan_success_limit = vacrel->eager_scan_remaining_successes; /* for logging */ Buffer vmbuffer = InvalidBuffer; + bool strategy_cleared = false; const int initprog_index[] = { PROGRESS_VACUUM_PHASE, PROGRESS_VACUUM_TOTAL_HEAP_BLKS, @@ -1307,6 +1308,19 @@ lazy_scan_heap(LVRelState *vacrel) PROGRESS_VACUUM_PHASE_SCAN_HEAP); } + /* + * If the wraparound failsafe has engaged -- either via the check + * above or during index vacuuming invoked from this loop -- stop + * using the buffer access strategy so that the rest of the vacuum may + * use all of shared buffers. Failsafe mode stays engaged once + * triggered, so we only need to do this once. + */ + if (unlikely(VacuumFailsafeActive) && !strategy_cleared) + { + read_stream_clear_strategy(stream); + strategy_cleared = true; + } + buf = read_stream_next_buffer(stream, &per_buffer_data); /* The relation is exhausted. */ @@ -2964,9 +2978,19 @@ lazy_check_wraparound_failsafe(LVRelState *vacrel) VacuumFailsafeActive = true; /* - * Abandon use of a buffer access strategy to allow use of all of - * shared buffers. We assume the caller who allocated the memory for - * the BufferAccessStrategy will free it. + * We abandon use of the strategy in failsafe mode to allow use of all + * of shared buffers. vacrel->bstrategy is not the source of truth for + * an ongoing heap scan, but clear it just for tidiness. Any ongoing + * phase I heap scan has its own references to the strategy and clears + * them separately (see lazy_scan_heap()). And none of the other + * vacuum phases will read from vacrel->bstrategy once failsafe mode + * is engaged. The phase I read stream clears the strategy references + * held by the ReadBuffersOperations outside of this function because + * lazy_check_wraparound_failsafe() may be called from any phase of + * vacuum, including when the phase I stream is inactive. + * + * We assume the caller who allocated the memory for the + * BufferAccessStrategy will free it. */ vacrel->bstrategy = NULL; diff --git a/src/backend/access/heap/visibilitymap.c b/src/backend/access/heap/visibilitymap.c index 1874a3fda37..d44620eca7f 100644 --- a/src/backend/access/heap/visibilitymap.c +++ b/src/backend/access/heap/visibilitymap.c @@ -135,9 +135,38 @@ static Buffer vm_extend(Relation rel, BlockNumber vm_nblocks); * You must pass a buffer containing the correct map page to this function. * Call visibilitymap_pin first to pin the right one. This function doesn't do * any I/O. Returns true if any bits have been cleared and false otherwise. + * + * Most callers should use visibilitymap_clear_locked rather than this + * function. It is usually necessary to register the VM buffer in the WAL + * record, and this necessitates holding the lock for longer than it is held + * here. However, we retain this function for behavioral compatibility on the + * back branches (out-of-tree callers may expect it to take the lock). And, + * since we have it, we use it for in-tree callers that don't have to manage + * the VM buffer lock themselves. */ bool visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags) +{ + bool cleared = false; + + LockBuffer(vmbuf, BUFFER_LOCK_EXCLUSIVE); + + cleared = visibilitymap_clear_locked(rel, heapBlk, vmbuf, flags); + + LockBuffer(vmbuf, BUFFER_LOCK_UNLOCK); + + return cleared; +} + +/* + * Clear specified bits, caller holds VM lock + * + * Like visibilitymap_clear(), except the caller must already hold the VM + * buffer exclusive lock and is responsible for unlocking it. + * Returns true if any bits were actually cleared, false otherwise. + */ +bool +visibilitymap_clear_locked(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags) { BlockNumber mapBlock = HEAPBLK_TO_MAPBLOCK(heapBlk); int mapByte = HEAPBLK_TO_MAPBYTE(heapBlk); @@ -157,7 +186,8 @@ visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags if (!BufferIsValid(vmbuf) || BufferGetBlockNumber(vmbuf) != mapBlock) elog(ERROR, "wrong buffer passed to visibilitymap_clear"); - LockBuffer(vmbuf, BUFFER_LOCK_EXCLUSIVE); + Assert(BufferIsExclusiveLocked(vmbuf)); + map = PageGetContents(BufferGetPage(vmbuf)); if (map[mapByte] & mask) @@ -168,8 +198,6 @@ visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags cleared = true; } - LockBuffer(vmbuf, BUFFER_LOCK_UNLOCK); - return cleared; } diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index 47b6552d67c..d47e4b20783 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -2714,12 +2714,21 @@ _bt_endpoint(IndexScanDesc scan, ScanDirection dir) if (!BufferIsValid(so->currPos.buf)) { /* - * Empty index. Lock the whole relation, as nothing finer to lock - * exists. + * Empty index. Lock the whole relation using the approach explained + * at the same point in the _bt_first path. */ - PredicateLockRelation(rel, scan->xs_snapshot); - _bt_parallel_done(scan); - return false; + if (IsolationIsSerializable()) + { + PredicateLockRelation(rel, scan->xs_snapshot); + so->currPos.buf = _bt_get_endpoint(rel, 0, + ScanDirectionIsBackward(dir)); + } + + if (!BufferIsValid(so->currPos.buf)) + { + _bt_parallel_done(scan); + return false; + } } page = BufferGetPage(so->currPos.buf); diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index da2a174d98f..494fb196eef 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -1266,14 +1266,14 @@ GetNewMultiXactId(int nmembers, MultiXactOffset *offset) errmsg("database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database \"%s\"", oldest_datname), errhint("Execute a database-wide VACUUM in that database.\n" - "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); + "You might also need to commit or roll back old prepared transactions."))); else ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database with OID %u", oldest_datoid), errhint("Execute a database-wide VACUUM in that database.\n" - "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); + "You might also need to commit or roll back old prepared transactions."))); } /* @@ -1297,7 +1297,7 @@ GetNewMultiXactId(int nmembers, MultiXactOffset *offset) oldest_datname, multiWrapLimit - result), errhint("Execute a database-wide VACUUM in that database.\n" - "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); + "You might also need to commit or roll back old prepared transactions."))); else ereport(WARNING, (errmsg_plural("database with OID %u must be vacuumed before %u more MultiXactId is used", @@ -1306,7 +1306,7 @@ GetNewMultiXactId(int nmembers, MultiXactOffset *offset) oldest_datoid, multiWrapLimit - result), errhint("Execute a database-wide VACUUM in that database.\n" - "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); + "You might also need to commit or roll back old prepared transactions."))); } /* Re-acquire lock and start over */ @@ -2653,7 +2653,7 @@ SetMultiXactIdLimit(MultiXactId oldest_datminmxid, Oid oldest_datoid, oldest_datname, multiWrapLimit - curMulti), errhint("To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" - "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); + "You might also need to commit or roll back old prepared transactions."))); else ereport(WARNING, (errmsg_plural("database with OID %u must be vacuumed before %u more MultiXactId is used", @@ -2662,7 +2662,7 @@ SetMultiXactIdLimit(MultiXactId oldest_datminmxid, Oid oldest_datoid, oldest_datoid, multiWrapLimit - curMulti), errhint("To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" - "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); + "You might also need to commit or roll back old prepared transactions."))); } } diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 47c04f26d40..2fd06e37999 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -1105,9 +1105,9 @@ XLogInsertRecord(XLogRecData *rdata, * * NB: Testing shows that XLogInsertRecord runs faster if this code is inlined; * however, because there are two call sites, the compiler is reluctant to - * inline. We use pg_attribute_always_inline here to try to convince it. + * inline. We use pg_always_inline here to try to convince it. */ -static pg_attribute_always_inline void +static pg_always_inline void ReserveXLogInsertLocation(int size, XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr) { @@ -2434,9 +2434,6 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) written = pg_pwrite(openLogFile, from, nleft, startoffset); pgstat_report_wait_end(); - pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_NORMAL, - IOOP_WRITE, start, 1, written); - if (written <= 0) { char xlogfname[MAXFNAMELEN]; @@ -2454,6 +2451,9 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) errmsg("could not write to log file \"%s\" at offset %u, length %zu: %m", xlogfname, startoffset, nleft))); } + + pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_NORMAL, + IOOP_WRITE, start, 1, written); nleft -= written; from += written; startoffset += written; @@ -3276,14 +3276,6 @@ XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli, } pgstat_report_wait_end(); - /* - * A full segment worth of data is written when using wal_init_zero. One - * byte is written when not using it. - */ - pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_INIT, IOOP_WRITE, - io_start, 1, - wal_init_zero ? wal_segment_size : 1); - if (save_errno) { /* @@ -3300,6 +3292,14 @@ XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli, errmsg("could not write to file \"%s\": %m", tmppath))); } + /* + * A full segment worth of data is written when using wal_init_zero. One + * byte is written when not using it. + */ + pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_INIT, IOOP_WRITE, + io_start, 1, + wal_init_zero ? wal_segment_size : 1); + /* Measure I/O timing when flushing segment */ io_start = pgstat_prepare_io_time(track_wal_io_timing); @@ -6180,6 +6180,8 @@ StartupXLOG(void) if (ArchiveRecoveryRequested) CleanupAfterArchiveRecovery(EndOfLogTLI, EndOfLog, newTLI); + INJECTION_POINT("promotion-after-wal-segment-cleanup", NULL); + /* * Local WAL inserts enabled, so it's time to finish initialization of * commit timestamp. diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index 5c26d33a603..29d4df7a996 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -1578,9 +1578,6 @@ WALRead(XLogReaderState *state, #ifndef FRONTEND pgstat_report_wait_end(); - - pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_NORMAL, IOOP_READ, - io_start, 1, readbytes); #endif if (readbytes <= 0) @@ -1593,6 +1590,11 @@ WALRead(XLogReaderState *state, return false; } +#ifndef FRONTEND + pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_NORMAL, IOOP_READ, + io_start, 1, readbytes); +#endif + /* Update state for read */ recptr += readbytes; nbytes -= readbytes; diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index ff4d9edc790..37d6090e465 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -531,6 +531,15 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, dbstate_at_startup = ControlFile->state; + /* + * A startup process always starts with an inconsistent database. Set the + * flag accordingly, even if it was inherited from a postmaster that had + * already marked the database as consistent. This keeps the invariant + * local to the startup process without requiring every fork path to clear + * the flag. + */ + reachedConsistency = false; + /* * Initialize on the assumption we want to recover to the latest timeline * that's active according to pg_control. @@ -3431,8 +3440,10 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, pgstat_report_wait_end(); - pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_NORMAL, IOOP_READ, - io_start, 1, r); + /* Count I/O stats only for successful short reads */ + if (r > 0) + pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_NORMAL, IOOP_READ, + io_start, 1, r); XLogFileName(fname, curFileTLI, readSegNo, wal_segment_size); if (r < 0) diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index c389b27f77d..0d67f256afe 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -321,6 +321,28 @@ XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id) return buf; } +/* + * If a redo routine modified an init fork, flush the buffer immediately. + * + * At the end of crash recovery the init forks of unlogged relations are + * copied to the main fork directly from disk, without going through shared + * buffers. Therefore, redo routines that update init forks without + * restoring a full-page image must call this after setting the page LSN and + * marking the buffer dirty. + */ +void +XLogFlushBufferForRedoIfInit(XLogReaderState *record, uint8 block_id, + Buffer buffer) +{ + ForkNumber forknum; + + Assert(BufferIsValid(buffer)); + + XLogRecGetBlockTag(record, block_id, NULL, &forknum, NULL); + if (forknum == INIT_FORKNUM) + FlushOneBuffer(buffer); +} + /* * XLogReadBufferForRedoExtended * Like XLogReadBufferForRedo, but with extra options. @@ -398,7 +420,9 @@ XLogReadBufferForRedoExtended(XLogReaderState *record, * At the end of crash recovery the init forks of unlogged relations * are copied, without going through shared buffers. So we need to * force the on-disk state of init forks to always be in sync with the - * state in shared buffers. + * state in shared buffers. Use XLogFlushBufferForRedoIfInit() for + * redo routines that dirty init-fork buffers without restoring a + * full-page image. */ if (forknum == INIT_FORKNUM) FlushOneBuffer(*buf); @@ -896,7 +920,19 @@ read_local_xlog_page_guts(XLogReaderState *state, XLogRecPtr targetPagePtr, if (!RecoveryInProgress()) read_upto = GetFlushRecPtr(&currTLI); else + { + TimeLineID insertTLI; + read_upto = GetXLogReplayRecPtr(&currTLI); + + /* + * If the insertion timeline has already been set, use it. See + * logical_read_xlog_page() for details. + */ + insertTLI = GetWALInsertionTimeLineIfSet(); + if (insertTLI != 0) + currTLI = insertTLI; + } tli = currTLI; /* diff --git a/src/backend/backup/basebackup.c b/src/backend/backup/basebackup.c index f0f88838dc2..bde795aaef0 100644 --- a/src/backend/backup/basebackup.c +++ b/src/backend/backup/basebackup.c @@ -674,8 +674,6 @@ perform_base_backup(basebackup_options *opt, bbsink *sink, /* clean up the resource owner we created */ ReleaseAuxProcessResources(true); - - basebackup_progress_done(); } /* diff --git a/src/backend/backup/basebackup_progress.c b/src/backend/backup/basebackup_progress.c index 1d22b541f89..c00d872b59b 100644 --- a/src/backend/backup/basebackup_progress.c +++ b/src/backend/backup/basebackup_progress.c @@ -38,6 +38,7 @@ static void bbsink_progress_begin_backup(bbsink *sink); static void bbsink_progress_archive_contents(bbsink *sink, size_t len); static void bbsink_progress_end_archive(bbsink *sink); +static void bbsink_progress_cleanup(bbsink *sink); static const bbsink_ops bbsink_progress_ops = { .begin_backup = bbsink_progress_begin_backup, @@ -48,7 +49,7 @@ static const bbsink_ops bbsink_progress_ops = { .manifest_contents = bbsink_forward_manifest_contents, .end_manifest = bbsink_forward_end_manifest, .end_backup = bbsink_forward_end_backup, - .cleanup = bbsink_forward_cleanup + .cleanup = bbsink_progress_cleanup }; /* @@ -179,6 +180,16 @@ bbsink_progress_archive_contents(bbsink *sink, size_t len) pgstat_progress_update_multi_param(nparam, index, val); } +/* + * Clean up progress reporting. + */ +static void +bbsink_progress_cleanup(bbsink *sink) +{ + pgstat_progress_end_command(); + bbsink_forward_cleanup(sink); +} + /* * Advertise that we are waiting for the start-of-backup checkpoint. */ @@ -234,6 +245,9 @@ basebackup_progress_transfer_wal(void) /* * Advertise that we are no longer performing a backup. + * + * No longer used in core, but kept to preserve ABI compatibility in this + * branch. */ void basebackup_progress_done(void) diff --git a/src/backend/backup/basebackup_server.c b/src/backend/backup/basebackup_server.c index f5c0c61640a..66ce8e68d26 100644 --- a/src/backend/backup/basebackup_server.c +++ b/src/backend/backup/basebackup_server.c @@ -176,9 +176,9 @@ bbsink_server_archive_contents(bbsink *sink, size_t len) /* short write: complain appropriately */ ereport(ERROR, (errcode(ERRCODE_DISK_FULL), - errmsg("could not write file \"%s\": wrote only %d of %d bytes at offset %u", + errmsg("could not write file \"%s\": wrote only %d of %d bytes at offset %lld", FilePathName(mysink->file), - nbytes, (int) len, (unsigned) mysink->filepos), + nbytes, (int) len, (long long) mysink->filepos), errhint("Check free disk space."))); } @@ -269,9 +269,9 @@ bbsink_server_manifest_contents(bbsink *sink, size_t len) /* short write: complain appropriately */ ereport(ERROR, (errcode(ERRCODE_DISK_FULL), - errmsg("could not write file \"%s\": wrote only %d of %d bytes at offset %u", + errmsg("could not write file \"%s\": wrote only %d of %d bytes at offset %lld", FilePathName(mysink->file), - nbytes, (int) len, (unsigned) mysink->filepos), + nbytes, (int) len, (long long) mysink->filepos), errhint("Check free disk space."))); } diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 18316a3968b..f5541b9f6b2 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -1529,6 +1529,9 @@ ReleaseDeletionLock(const ObjectAddress *object) { if (object->classId == RelationRelationId) UnlockRelationOid(object->objectId, AccessExclusiveLock); + else if (object->classId == AuthMemRelationId) + UnlockSharedObject(object->classId, object->objectId, 0, + AccessExclusiveLock); else /* assume we should lock the whole object not a sub-object */ UnlockDatabaseObject(object->classId, object->objectId, 0, @@ -1681,6 +1684,87 @@ recordDependencyOnSingleRelExpr(const ObjectAddress *depender, free_object_addresses(context.addrs); } +/* + * We require USAGE on a type to store a dependency on it. This helper + * function does the appropriate privilege checks. + * + * NB: Other objects have privileges of their own, but recording those + * dependencies doesn't require holding them. For example, an expression may + * reference a function for which the user lacks EXECUTE. Instead, EXECUTE is + * checked when the function is executed. + */ +static void +check_usage_on_types(ObjectAddresses *addrs, Oid roleid) +{ + for (int i = 0; i < addrs->numrefs; i++) + { + ObjectAddress *ref = &addrs->refs[i]; + AclResult aclresult; + + if (ref->classId != TypeRelationId) + continue; + + /* we don't record dependencies on pinned types */ + if (IsPinnedObject(ref->classId, ref->objectId)) + continue; + + aclresult = object_aclcheck(ref->classId, ref->objectId, + roleid, ACL_USAGE); + if (aclresult != ACLCHECK_OK) + aclcheck_error_type(aclresult, ref->objectId); + } +} + +/* + * CheckUsageOnTypesInExpr - require USAGE on all types named by an expression + * + * rtable is the rangetable for interpreting Vars (or NIL if none are + * expected). roleid is the role whose USAGE is required. + */ +void +CheckUsageOnTypesInExpr(Node *expr, List *rtable, Oid roleid) +{ + find_expr_references_context context; + + context.addrs = new_object_addresses(); + + /* Set up interpretation for Vars at varlevelsup = 0 */ + context.rtables = list_make1(rtable); + + find_expr_references_walker(expr, &context); + eliminate_duplicate_dependencies(context.addrs); + check_usage_on_types(context.addrs, roleid); + free_object_addresses(context.addrs); +} + +/* + * CheckUsageOnTypesInSingleRelExpr - as above, for a single-rel expression + * + * Like recordDependencyOnSingleRelExpr(), this handles expressions whose Vars + * all refer to one relation. roleid is the role whose USAGE is required. + */ +void +CheckUsageOnTypesInSingleRelExpr(Node *expr, Oid relId, Oid roleid) +{ + find_expr_references_context context; + RangeTblEntry rte = {0}; + + context.addrs = new_object_addresses(); + + /* We gin up a rather bogus rangetable list to handle Vars */ + rte.type = T_RangeTblEntry; + rte.rtekind = RTE_RELATION; + rte.relid = relId; + rte.relkind = RELKIND_RELATION; + rte.rellockmode = AccessShareLock; + context.rtables = list_make1(list_make1(&rte)); + + find_expr_references_walker(expr, &context); + eliminate_duplicate_dependencies(context.addrs); + check_usage_on_types(context.addrs, roleid); + free_object_addresses(context.addrs); +} + /* * Recursively search an expression tree for object references. * diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 72ab7df21bf..16a5d6b7b97 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -869,6 +869,9 @@ AddNewAttributeTuples(Oid new_rel_oid, { Form_pg_attribute attr = TupleDescAttr(tupdesc, i); + if (attr->attisdropped) + continue; + /* Add dependency info */ ObjectAddressSubSet(myself, RelationRelationId, new_rel_oid, i + 1); ObjectAddressSet(referenced, TypeRelationId, attr->atttypid); @@ -2156,6 +2159,9 @@ SetAttrMissing(Oid relid, char *attname, char *value) * in the pg_class entry for the relation. * * The OID of the new constraint is returned. + * + * NB: Caller is responsible for ensuring the user has USAGE on all types expr + * depends on. */ static Oid StoreRelCheck(Relation rel, const char *ccname, Node *expr, @@ -2471,6 +2477,13 @@ AddRelationNewConstraints(Relation rel, castNode(Const, expr)->constisnull)) continue; + /* + * The below call to StoreAttrDefault() adds the dependencies on + * types. We are responsible for checking USAGE. + */ + if (!is_internal) + CheckUsageOnTypesInSingleRelExpr(expr, RelationGetRelid(rel), GetUserId()); + defOid = StoreAttrDefault(rel, colDef->attnum, expr, is_internal); cooked = (CookedConstraint *) palloc(sizeof(CookedConstraint)); @@ -2511,6 +2524,14 @@ AddRelationNewConstraints(Relation rel, */ expr = cookConstraint(pstate, cdef->raw_expr, RelationGetRelationName(rel)); + + /* + * The below call to StoreRelCheck() calls + * CreateConstraintEntry(), which adds the dependencies on + * types. We are responsible for checking USAGE. + */ + if (!is_internal) + CheckUsageOnTypesInSingleRelExpr(expr, RelationGetRelid(rel), GetUserId()); } else { @@ -4013,12 +4034,16 @@ StorePartitionKey(Relation rel, * columns, i.e. they become internally dependent on the whole table. */ if (partexprs) + { + CheckUsageOnTypesInSingleRelExpr((Node *) partexprs, RelationGetRelid(rel), + GetUserId()); recordDependencyOnSingleRelExpr(&myself, (Node *) partexprs, RelationGetRelid(rel), DEPENDENCY_NORMAL, DEPENDENCY_INTERNAL, true /* reverse the self-deps */ ); + } /* * We must invalidate the relcache so that the next diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index aa216683b74..898814db624 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -714,6 +714,10 @@ UpdateIndexRelation(Oid indexoid, * already exists. * INDEX_CREATE_PARTITIONED: * create a partitioned index (table must be partitioned) + * INDEX_CREATE_DEFERRABLE: + * index supports a deferrable constraint, mark it as + * non-immediate (indimmediate = false). + * * constr_flags: flags passed to index_constraint_create * (only if INDEX_CREATE_ADD_CONSTRAINT is set) * allow_system_table_mods: allow table to be a system catalog @@ -721,6 +725,9 @@ UpdateIndexRelation(Oid indexoid, * constraintId: if not NULL, receives OID of created constraint * * Returns the OID of the created index. + * + * NB: Caller is responsible for ensuring the user has USAGE on all types + * indexInfo->ii_{Expressions,Predicate} depend on. */ Oid index_create(Relation heapRelation, @@ -1046,7 +1053,8 @@ index_create(Relation heapRelation, indexInfo, collationIds, opclassIds, coloptions, isprimary, is_exclusion, - (constr_flags & INDEX_CONSTR_CREATE_DEFERRABLE) == 0, + (constr_flags & INDEX_CONSTR_CREATE_DEFERRABLE) == 0 && + (flags & INDEX_CREATE_DEFERRABLE) == 0, !concurrent && !invalid, !concurrent); @@ -1317,6 +1325,8 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, List *indexColNames = NIL; List *indexExprs = NIL; List *indexPreds = NIL; + bits16 flags = INDEX_CREATE_SKIP_BUILD | INDEX_CREATE_CONCURRENT; + Form_pg_index indexForm; indexRelation = index_open(oldIndexId, RowExclusiveLock); @@ -1336,6 +1346,13 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, indexTuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(oldIndexId)); if (!HeapTupleIsValid(indexTuple)) elog(ERROR, "cache lookup failed for index %u", oldIndexId); + + indexForm = (Form_pg_index) GETSTRUCT(indexTuple); + + /* Old index is deferrable, do the same for the new index */ + if (!indexForm->indimmediate) + flags |= INDEX_CREATE_DEFERRABLE; + indclassDatum = SysCacheGetAttrNotNull(INDEXRELID, indexTuple, Anum_pg_index_indclass); indclass = (oidvector *) DatumGetPointer(indclassDatum); @@ -1458,8 +1475,8 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, indcoloptions->values, stattargets, reloptionsDatum, - INDEX_CREATE_SKIP_BUILD | INDEX_CREATE_CONCURRENT, - 0, + flags, + 0, /* constr_flags */ true, /* allow table to be a system catalog? */ false, /* is_internal? */ NULL); @@ -2645,9 +2662,21 @@ CompareIndexInfo(const IndexInfo *info1, const IndexInfo *info2, return false; } - /* No support currently for comparing exclusion indexes. */ - if (info1->ii_ExclusionOps != NULL || info2->ii_ExclusionOps != NULL) + /* If they're exclusion indexes, their properties must be identical */ + if ((info1->ii_ExclusionOps == NULL) != (info2->ii_ExclusionOps == NULL)) return false; + if (info1->ii_ExclusionOps != NULL) + { + for (i = 0; i < info1->ii_NumIndexKeyAttrs; i++) + { + if (info1->ii_ExclusionOps[i] != info2->ii_ExclusionOps[i]) + return false; + if (info1->ii_ExclusionProcs[i] != info2->ii_ExclusionProcs[i]) + return false; + if (info1->ii_ExclusionStrats[i] != info2->ii_ExclusionStrats[i]) + return false; + } + } return true; } diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index dd5d241dfe2..a0e4ce24a7c 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -1592,7 +1592,7 @@ MatchNamedCall(HeapTuple proctup, int nargs, List *argnames, Oid *p_argtypes; char **p_argnames; char *p_argmodes; - bool arggiven[FUNC_MAX_ARGS]; + bool *arggiven; bool isnull; int ap; /* call args position */ int pp; /* proargs position */ @@ -1616,8 +1616,8 @@ MatchNamedCall(HeapTuple proctup, int nargs, List *argnames, Assert(include_out_arguments ? (pronargs == pronallargs) : (pronargs <= pronallargs)); /* initialize state for matching */ - *argnumbers = (int *) palloc(pronargs * sizeof(int)); - memset(arggiven, false, pronargs * sizeof(bool)); + *argnumbers = palloc_array(int, pronargs); + arggiven = palloc0_array(bool, pronallargs); /* there are numposargs positional args before the named args */ for (ap = 0; ap < numposargs; ap++) diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index b63fd57dc04..76d5955e5ed 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -5586,7 +5586,7 @@ getObjectIdentityParts(const ObjectAddress *object, amForm = (Form_pg_auth_members) GETSTRUCT(tup); - appendStringInfo(&buffer, _("membership of role %s in role %s"), + appendStringInfo(&buffer, "membership of role %s in role %s", GetUserNameFromId(amForm->member, false), GetUserNameFromId(amForm->roleid, false)); diff --git a/src/backend/catalog/pg_attrdef.c b/src/backend/catalog/pg_attrdef.c index 1b6270b1213..fdaa67230f9 100644 --- a/src/backend/catalog/pg_attrdef.c +++ b/src/backend/catalog/pg_attrdef.c @@ -30,6 +30,9 @@ * Store a default expression for column attnum of relation rel. * * Returns the OID of the new pg_attrdef tuple. + * + * NB: Caller is responsible for ensuring the user has USAGE on all types expr + * depends on. */ Oid StoreAttrDefault(Relation rel, AttrNumber attnum, diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c index afdfac8eca6..d3fcfa1f6ba 100644 --- a/src/backend/catalog/pg_constraint.c +++ b/src/backend/catalog/pg_constraint.c @@ -46,6 +46,9 @@ * from the constraint to the things it depends on. * * The new constraint's OID is returned. + * + * NB: Caller is responsible for ensuring the user has USAGE on all types + * conExpr depends on. */ Oid CreateConstraintEntry(const char *constraintName, diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c index 70635d9f81a..48f0ec7ed27 100644 --- a/src/backend/catalog/pg_depend.c +++ b/src/backend/catalog/pg_depend.c @@ -27,13 +27,17 @@ #include "catalog/partition.h" #include "commands/extension.h" #include "miscadmin.h" +#include "storage/lmgr.h" +#include "storage/lock.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" #include "utils/rel.h" +#include "utils/snapmgr.h" #include "utils/syscache.h" static bool isObjectPinned(const ObjectAddress *object); +static void dependencyLockAndCheckObject(Oid classId, Oid objectId); /* @@ -109,6 +113,13 @@ recordMultipleDependencies(const ObjectAddress *depender, if (isObjectPinned(referenced)) continue; + /* + * Make sure the new referenced object doesn't go away while we record + * the dependency. DROP routines should lock the object exclusively + * before they check dependencies. + */ + dependencyLockAndCheckObject(referenced->classId, referenced->objectId); + if (slot_init_count < max_slots) { slot[slot_stored_count] = MakeSingleTupleTableSlot(RelationGetDescr(dependDesc), @@ -507,6 +518,13 @@ changeDependencyFor(Oid classId, Oid objectId, return 1; } + /* + * Make sure the new referenced object doesn't go away while we record the + * dependency. + */ + if (!newIsPinned) + dependencyLockAndCheckObject(refClassId, newRefObjectId); + depRel = table_open(DependRelationId, RowExclusiveLock); /* There should be existing dependency record(s), so search. */ @@ -714,6 +732,119 @@ isObjectPinned(const ObjectAddress *object) } +/* + * dependencyLockAndCheckObject + * + * Lock the object that we are about to record a dependency on. After it's + * locked, verify that it hasn't been dropped while we weren't looking. If it + * has been dropped, throw an an error. + * + * If the caller already holds a lock that conflicts with DROP + * (AccessShareLock or stronger), this does nothing. Callers should acquire + * locks already when they look up the referenced objects, but many callers + * currently do not. This is a backstop to make sure that we don't record a + * bogus reference permanently in the catalogs in that case. In the future, + * after we have tightened up all the callers to acquire locks earlier, this + * could just verify that the object is already locked and throw an error if + * not. + */ +static void +dependencyLockAndCheckObject(Oid classId, Oid objectId) +{ + /* + * Pinned objects cannot be dropped concurrently, and callers checked this + * already. + */ + Assert(!IsPinnedObject(classId, objectId)); + + if (classId != RelationRelationId) + { + LOCKTAG tag; + int cache; + Relation rel; + SysScanDesc scan; + ScanKeyData skey; + HeapTuple tuple; + + SET_LOCKTAG_OBJECT(tag, + MyDatabaseId, + classId, + objectId, + 0); + + if (LockHeldByMe(&tag, AccessShareLock, true)) + return; + + /* Assume we should lock the whole object not a sub-object */ + LockDatabaseObject(classId, objectId, 0, AccessShareLock); + + /* + * Check that the object still exists. If the catalog has a suitable + * syscache, check that first. + */ + cache = get_object_catcache_oid(classId); + if (cache != -1) + { + if (SearchSysCacheExists1(cache, ObjectIdGetDatum(objectId))) + return; + } + + /* + * If it's not found in the syscache, or there's no suitable syscache + * we can use, scan the catalog table using SnapshotSelf. This + * handles the case that it's an object we just created (for example, + * if it's a composite type created as part of creating a table). + */ + rel = table_open(classId, AccessShareLock); + + ScanKeyInit(&skey, + get_object_attnum_oid(classId), + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(objectId)); + + scan = systable_beginscan(rel, get_object_oid_index(classId), + true, SnapshotSelf, 1, &skey); + + tuple = systable_getnext(scan); + if (!HeapTupleIsValid(tuple)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("referenced %s was concurrently dropped", + get_object_class_descr(classId)))); + + systable_endscan(scan); + table_close(rel, AccessShareLock); + } + else + { + /* + * Same logic for pg_class entries, but locking relations is handled + * by different functions. + * + * Callers are more careful with locking relations than other objects, + * so we should already have a lock on the relation, or on another + * object that indirectly prevents the relation from being dropped. + * For example, we might have a strong lock on a table while adding + * dependency to its index. However, we cannot detect the indirectly + * protected case here easily. To err on the safe side, acquire a + * lock directly on the relation if we're not holding one already. + */ + + /* all shared relations are pinned */ + Assert(!IsSharedRelation(objectId)); + + if (CheckRelationOidLockedByMe(objectId, AccessShareLock, true)) + return; + LockRelationOid(objectId, AccessShareLock); + + if (SearchSysCacheExists1(RELOID, ObjectIdGetDatum(objectId))) + return; + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("referenced relation was concurrently dropped"))); + } +} + /* * Various special-purpose lookups and manipulations of pg_depend. */ diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index 9d8c02847de..d8854c30a57 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -663,12 +663,18 @@ ProcedureCreate(const char *procedureName, /* dependency on SQL routine body */ if (languageObjectId == SQLlanguageId && prosqlbody) + { + CheckUsageOnTypesInExpr(prosqlbody, NIL, GetUserId()); recordDependencyOnExpr(&myself, prosqlbody, NIL, DEPENDENCY_NORMAL); + } /* dependency on parameter default expressions */ if (parameterDefaults) + { + CheckUsageOnTypesInExpr((Node *) parameterDefaults, NIL, GetUserId()); recordDependencyOnExpr(&myself, (Node *) parameterDefaults, NIL, DEPENDENCY_NORMAL); + } /* dependency on owner */ if (!is_update) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index d6f94db5d99..671eb160f47 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -32,6 +32,7 @@ #include "catalog/pg_type.h" #include "commands/publicationcmds.h" #include "funcapi.h" +#include "miscadmin.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/catcache.h" @@ -511,9 +512,12 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri, /* Add dependency on the objects mentioned in the qualifications */ if (pri->whereClause) + { + CheckUsageOnTypesInSingleRelExpr(pri->whereClause, relid, GetUserId()); recordDependencyOnSingleRelExpr(&myself, pri->whereClause, relid, DEPENDENCY_NORMAL, DEPENDENCY_NORMAL, false); + } /* Add dependency on the columns, if any are listed */ i = -1; @@ -1117,14 +1121,27 @@ Datum pg_get_publication_tables(PG_FUNCTION_ARGS) { #define NUM_PUBLICATION_TABLES_ELEM 4 + + /* + * State carried across SRF calls. We track the index ourselves instead of + * using funcctx->call_cntr, so that concurrently dropped tables can be + * skipped without emitting a row. + */ + typedef struct + { + List *table_infos; /* list of published_rel */ + int curr_idx; /* current index into table_infos */ + } publication_tables_state; + FuncCallContext *funcctx; - List *table_infos = NIL; + publication_tables_state *ptstate = NULL; /* stuff done only on the first call of the function */ if (SRF_IS_FIRSTCALL()) { TupleDesc tupdesc; MemoryContext oldcontext; + List *table_infos = NIL; ArrayType *arr; Datum *elems; int nelems, @@ -1222,26 +1239,47 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) PG_NODE_TREEOID, -1, 0); funcctx->tuple_desc = BlessTupleDesc(tupdesc); - funcctx->user_fctx = table_infos; + + /* Store the state to be used across SRF calls. */ + ptstate = palloc_object(publication_tables_state); + ptstate->table_infos = table_infos; + ptstate->curr_idx = 0; + funcctx->user_fctx = ptstate; MemoryContextSwitchTo(oldcontext); } /* stuff done on every call of the function */ funcctx = SRF_PERCALL_SETUP(); - table_infos = (List *) funcctx->user_fctx; + ptstate = (publication_tables_state *) funcctx->user_fctx; - if (funcctx->call_cntr < list_length(table_infos)) + while (ptstate->curr_idx < list_length(ptstate->table_infos)) { HeapTuple pubtuple = NULL; HeapTuple rettuple; Publication *pub; - published_rel *table_info = (published_rel *) list_nth(table_infos, funcctx->call_cntr); + published_rel *table_info = (published_rel *) list_nth(ptstate->table_infos, + ptstate->curr_idx); Oid relid = table_info->relid; - Oid schemaid = get_rel_namespace(relid); + Relation rel; + Oid schemaid; Datum values[NUM_PUBLICATION_TABLES_ELEM] = {0}; bool nulls[NUM_PUBLICATION_TABLES_ELEM] = {0}; + /* Advance the index for the next call. */ + ptstate->curr_idx++; + + /* + * The table OIDs were collected earlier, so a table may have been + * dropped before we get here. try_table_open() returns NULL if it is + * already gone, in which case we skip it; such tables are simply + * absent from the result set, which is the expected point-in-time + * behavior. + */ + rel = try_table_open(relid, AccessShareLock); + if (rel == NULL) + continue; + /* * Form tuple with appropriate data. */ @@ -1255,6 +1293,7 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) * We don't consider row filters or column lists for FOR ALL TABLES or * FOR TABLES IN SCHEMA publications. */ + schemaid = RelationGetNamespace(rel); if (!pub->alltables && !SearchSysCacheExists2(PUBLICATIONNAMESPACEMAP, ObjectIdGetDatum(schemaid), @@ -1284,7 +1323,6 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) /* Show all columns when the column list is not specified. */ if (nulls[2]) { - Relation rel = table_open(relid, AccessShareLock); int nattnums = 0; int16 *attnums; TupleDesc desc = RelationGetDescr(rel); @@ -1321,10 +1359,10 @@ pg_get_publication_tables(PG_FUNCTION_ARGS) values[2] = PointerGetDatum(buildint2vector(attnums, nattnums)); nulls[2] = false; } - - table_close(rel, AccessShareLock); } + table_close(rel, AccessShareLock); + rettuple = heap_form_tuple(funcctx->tuple_desc, values, nulls); SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(rettuple)); diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index bf15c603a82..a59a7d5541c 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -189,6 +189,9 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId) * Returns the ObjectAddress assigned to the new type. * If newTypeOid is zero (the normal case), a new OID is created; * otherwise we use exactly that OID. + * + * NB: Caller is responsible for ensuring the user has USAGE + * on all types defaultTypeBin depends on. * ---------------------------------------------------------------- */ ObjectAddress @@ -552,6 +555,9 @@ TypeCreate(Oid newTypeOid, * type already belongs to the current extension. That's the behavior we * want when replacing a shell type, which is the only case where both flags * are true. + * + * NB: Caller is responsible for ensuring the user has USAGE on all types + * defaultExpr depends on. */ void GenerateTypeDependencies(HeapTuple typeTuple, diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c index f5fc346e201..fedaf78ba5e 100644 --- a/src/backend/commands/copyfromparse.c +++ b/src/backend/commands/copyfromparse.c @@ -147,15 +147,15 @@ static int CopyReadAttributesCSV(CopyFromState cstate); static Datum CopyReadBinaryAttribute(CopyFromState cstate, FmgrInfo *flinfo, Oid typioparam, int32 typmod, bool *isnull); -static pg_attribute_always_inline bool CopyFromTextLikeOneRow(CopyFromState cstate, - ExprContext *econtext, - Datum *values, - bool *nulls, - bool is_csv); -static pg_attribute_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate, - char ***fields, - int *nfields, - bool is_csv); +static pg_always_inline bool CopyFromTextLikeOneRow(CopyFromState cstate, + ExprContext *econtext, + Datum *values, + bool *nulls, + bool is_csv); +static pg_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate, + char ***fields, + int *nfields, + bool is_csv); /* Low-level communications functions */ @@ -763,11 +763,11 @@ NextCopyFromRawFields(CopyFromState cstate, char ***fields, int *nfields) * * NOTE: force_not_null option are not applied to the returned fields. * - * We use pg_attribute_always_inline to reduce function call overhead + * We use pg_always_inline to reduce function call overhead * and to help compilers to optimize away the 'is_csv' condition when called * by internal functions such as CopyFromTextLikeOneRow(). */ -static pg_attribute_always_inline bool +static pg_always_inline bool NextCopyFromRawFieldsInternal(CopyFromState cstate, char ***fields, int *nfields, bool is_csv) { int fldct; @@ -930,10 +930,10 @@ CopyFromCSVOneRow(CopyFromState cstate, ExprContext *econtext, Datum *values, /* * Workhorse for CopyFromTextOneRow() and CopyFromCSVOneRow(). * - * We use pg_attribute_always_inline to reduce function call overhead + * We use pg_always_inline to reduce function call overhead * and to help compilers to optimize away the 'is_csv' condition. */ -static pg_attribute_always_inline bool +static pg_always_inline bool CopyFromTextLikeOneRow(CopyFromState cstate, ExprContext *econtext, Datum *values, bool *nulls, bool is_csv) { diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index ea6f18f2c80..307366e5ead 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -257,10 +257,10 @@ CopyToCSVOneRow(CopyToState cstate, TupleTableSlot *slot) /* * Workhorse for CopyToTextOneRow() and CopyToCSVOneRow(). * - * We use pg_attribute_always_inline to reduce function call overhead + * We use pg_always_inline to reduce function call overhead * and to help compilers to optimize away the 'is_csv' condition. */ -static pg_attribute_always_inline void +static pg_always_inline void CopyToTextLikeOneRow(CopyToState cstate, TupleTableSlot *slot, bool is_csv) diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 074c4765434..0ff8867d3e4 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -935,8 +935,16 @@ EventTriggerOnLogin(void) * lock to prevent concurrent SetDatabaseHasLoginEventTriggers(), but we * don't want to hang the connection waiting on the lock. Thus, we are * just trying to acquire the lock conditionally. + * + * Skip this on a hot standby: the conditional AccessExclusiveLock on the + * database object would fail with "cannot acquire lock mode ... while + * recovery is in progress", which the caller would surface as a FATAL + * connection error. On a standby, we cannot (and must not) clear the + * pg_database flag ourselves; it will be cleared via WAL replay once the + * primary's next login event trigger run clears it on the primary. */ - else if (ConditionalLockSharedObject(DatabaseRelationId, MyDatabaseId, + else if (!RecoveryInProgress() && + ConditionalLockSharedObject(DatabaseRelationId, MyDatabaseId, 0, AccessExclusiveLock)) { /* diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 7e2792ead71..15ef3304863 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -4524,6 +4524,7 @@ show_modifytable_info(ModifyTableState *mtstate, List *ancestors, const char *operation; const char *foperation; bool labeltargets; + bool nopruning; int j; List *idxNames = NIL; ListCell *lst; @@ -4571,6 +4572,16 @@ show_modifytable_info(ModifyTableState *mtstate, List *ancestors, if (labeltargets) ExplainOpenGroup("Target Tables", "Target Tables", false, es); + /* + * node->fdwPrivLists is parallel to node->resultRelations, in the + * original pre-pruning order. If no result relations were pruned, the + * entries in mtstate->resultRelInfo[] are in that same order and can be + * matched to fdwPrivLists positionally; otherwise we have to look each + * one up by range table index below. This test is loop-invariant, so + * compute it once here. + */ + nopruning = (list_length(node->resultRelations) == mtstate->mt_nrels); + for (j = 0; j < mtstate->mt_nrels; j++) { ResultRelInfo *resultRelInfo = mtstate->resultRelInfo + j; @@ -4609,7 +4620,30 @@ show_modifytable_info(ModifyTableState *mtstate, List *ancestors, fdwroutine != NULL && fdwroutine->ExplainForeignModify != NULL) { - List *fdw_private = (List *) list_nth(node->fdwPrivLists, j); + List *fdw_private; + + /* + * Find this relation's fdw_private: index fdwPrivLists directly + * when nothing was pruned, else match by range table index. + */ + if (nopruning) + fdw_private = (List *) list_nth(node->fdwPrivLists, j); + else + { + Index rti = resultRelInfo->ri_RangeTableIndex; + ListCell *lc1; + ListCell *lc2; + + fdw_private = NIL; + forboth(lc1, node->resultRelations, lc2, node->fdwPrivLists) + { + if (lfirst_int(lc1) == (int) rti) + { + fdw_private = (List *) lfirst(lc2); + break; + } + } + } fdwroutine->ExplainForeignModify(mtstate, resultRelInfo, diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index fd083e5ed25..5cd9c3932d6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -944,6 +944,22 @@ DefineIndex(Oid tableId, root_save_userid, root_save_sec_context, &root_save_nestlevel); + /* + * The below call to index_create() creates the dependencies on types. We + * are responsible for checking USAGE. + */ + if (check_rights) + { + if (indexInfo->ii_Expressions) + CheckUsageOnTypesInSingleRelExpr((Node *) indexInfo->ii_Expressions, + tableId, + root_save_userid); + if (indexInfo->ii_Predicate) + CheckUsageOnTypesInSingleRelExpr((Node *) indexInfo->ii_Predicate, + tableId, + root_save_userid); + } + /* * Extra checks when creating a PRIMARY KEY index. */ @@ -4129,6 +4145,8 @@ ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const Rein CommitTransactionCommand(); } + INJECTION_POINT("reindex-conc-index-built", NULL); + StartTransactionCommand(); /* diff --git a/src/backend/commands/policy.c b/src/backend/commands/policy.c index 83056960fe4..a2e5c486648 100644 --- a/src/backend/commands/policy.c +++ b/src/backend/commands/policy.c @@ -724,9 +724,12 @@ CreatePolicy(CreatePolicyStmt *stmt) recordDependencyOn(&myself, &target, DEPENDENCY_AUTO); + CheckUsageOnTypesInExpr(qual, qual_pstate->p_rtable, GetUserId()); recordDependencyOnExpr(&myself, qual, qual_pstate->p_rtable, DEPENDENCY_NORMAL); + CheckUsageOnTypesInExpr(with_check_qual, with_check_pstate->p_rtable, + GetUserId()); recordDependencyOnExpr(&myself, with_check_qual, with_check_pstate->p_rtable, DEPENDENCY_NORMAL); @@ -1055,8 +1058,13 @@ AlterPolicy(AlterPolicyStmt *stmt) recordDependencyOn(&myself, &target, DEPENDENCY_AUTO); + if (stmt->qual) + CheckUsageOnTypesInExpr(qual, qual_parse_rtable, GetUserId()); recordDependencyOnExpr(&myself, qual, qual_parse_rtable, DEPENDENCY_NORMAL); + if (stmt->with_check) + CheckUsageOnTypesInExpr(with_check_qual, with_check_parse_rtable, + GetUserId()); recordDependencyOnExpr(&myself, with_check_qual, with_check_parse_rtable, DEPENDENCY_NORMAL); diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index a79ef0651a9..c1ad656397a 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -1933,6 +1933,7 @@ seq_redo(XLogReaderState *record) memcpy(page, localpage, BufferGetPageSize(buffer)); MarkBufferDirty(buffer); + XLogFlushBufferForRedoIfInit(record, 0, buffer); UnlockReleaseBuffer(buffer); pfree(localpage); diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index 08dad5fa155..536c164caf2 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -57,9 +57,15 @@ compare_int16(const void *a, const void *b) /* * CREATE STATISTICS + * + * relids is a list of OIDs of relations specified in the FROM clause, on which + * the statistics object is defined. We identify the target by the passed-in + * OID rather than re-resolving stmt->relations by name, so that we operate + * on exactly the relation the caller looked up. Only a single relation is + * supported for now. */ ObjectAddress -CreateStatistics(CreateStatsStmt *stmt, bool check_rights) +CreateStatistics(List *relids, CreateStatsStmt *stmt, bool check_rights) { int16 attnums[STATS_MAX_DIMENSIONS]; int nattnums = 0; @@ -68,7 +74,7 @@ CreateStatistics(CreateStatsStmt *stmt, bool check_rights) NameData stxname; Oid statoid; Oid namespaceId; - Oid stxowner = GetUserId(); + Oid stxowner = OidIsValid(stmt->owner) ? stmt->owner : GetUserId(); HeapTuple htup; Datum values[Natts_pg_statistic_ext]; bool nulls[Natts_pg_statistic_ext]; @@ -77,7 +83,7 @@ CreateStatistics(CreateStatsStmt *stmt, bool check_rights) Datum exprsDatum; Relation statrel; Relation rel = NULL; - Oid relid; + Oid relid = InvalidOid; ObjectAddress parentobject, myself; Datum types[4]; /* one for each possible type of statistic */ @@ -95,24 +101,17 @@ CreateStatistics(CreateStatsStmt *stmt, bool check_rights) Assert(IsA(stmt, CreateStatsStmt)); /* - * Examine the FROM clause. Currently, we only allow it to be a single - * simple table, but later we'll probably allow multiple tables and JOIN - * syntax. The grammar is already prepared for that, so we have to check - * here that what we got is what we can support. + * Currently, we only allow the FROM clause to be a single simple table, + * but later we'll probably allow multiple tables and JOIN syntax. The + * grammar and the loop below are already prepared for that, but examining + * the FROM clause is the caller's job, so all we do here is assert that + * the caller rejected what we can't support. */ - if (list_length(stmt->relations) != 1) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("only a single relation is allowed in CREATE STATISTICS"))); + Assert(list_length(relids) == 1); - foreach(cell, stmt->relations) + foreach(cell, relids) { - Node *rln = (Node *) lfirst(cell); - - if (!IsA(rln, RangeVar)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("only a single relation is allowed in CREATE STATISTICS"))); + relid = lfirst_oid(cell); /* * CREATE STATISTICS will influence future execution plans but does @@ -121,7 +120,7 @@ CreateStatistics(CreateStatsStmt *stmt, bool check_rights) * conflicting with ANALYZE and other DDL that sets statistical * information, but not with normal queries. */ - rel = relation_openrv((RangeVar *) rln, ShareUpdateExclusiveLock); + rel = relation_open(relid, ShareUpdateExclusiveLock); /* Restrict to allowed relation types */ if (rel->rd_rel->relkind != RELKIND_RELATION && @@ -135,13 +134,11 @@ CreateStatistics(CreateStatsStmt *stmt, bool check_rights) errdetail_relkind_not_supported(rel->rd_rel->relkind))); /* - * You must own the relation to create stats on it. - * - * NB: Concurrent changes could cause this function's lookup to find a - * different relation than a previous lookup by the caller, so we must - * perform this check even when check_rights == false. + * You must own the relation to create stats on it. Skip check if + * caller doesn't want it. */ - if (!object_ownercheck(RelationRelationId, RelationGetRelid(rel), stxowner)) + if (check_rights && + !object_ownercheck(RelationRelationId, RelationGetRelid(rel), stxowner)) aclcheck_error(ACLCHECK_NOT_OWNER, get_relkind_objtype(rel->rd_rel->relkind), RelationGetRelationName(rel)); @@ -154,7 +151,6 @@ CreateStatistics(CreateStatsStmt *stmt, bool check_rights) } Assert(rel); - relid = RelationGetRelid(rel); /* * If the node has a name, split it up and determine creation namespace. @@ -600,11 +596,16 @@ CreateStatistics(CreateStatsStmt *stmt, bool check_rights) * just like we do for index expressions. */ if (stxexprs) + { + if (check_rights) + CheckUsageOnTypesInSingleRelExpr((Node *) stxexprs, relid, GetUserId()); + recordDependencyOnSingleRelExpr(&myself, (Node *) stxexprs, relid, DEPENDENCY_NORMAL, DEPENDENCY_AUTO, false); + } /* * Also add dependencies on namespace and owner. These are required diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index ee0a0169cc9..395dcc678c2 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -439,6 +439,32 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, } } +/* + * Append a suitably-quoted identifier or string literal to buf. + * "quote" should be either a double-quote or single-quote character. + * + * Caution: this quoting logic is sufficient for identifiers and literals + * in the replication grammar, but not always in regular SQL. Specifically, + * it'd fail for a string literal if standard_conforming_strings is off. + */ +static void +appendQuotedString(StringInfo buf, const char *str, char quote) +{ + appendStringInfoChar(buf, quote); + while (*str) + { + char c = *str++; + + if (c == quote) + appendStringInfoChar(buf, c); + appendStringInfoChar(buf, c); + } + appendStringInfoChar(buf, quote); +} + +#define appendQuotedIdentifier(b, s) appendQuotedString(b, s, '"') +#define appendQuotedLiteral(b, s) appendQuotedString(b, s, '\'') + /* * Check that the specified publications are present on the publisher. */ @@ -1921,7 +1947,9 @@ ReplicationSlotDropAtPubNode(WalReceiverConn *wrconn, char *slotname, bool missi load_file("libpqwalreceiver", false); initStringInfo(&cmd); - appendStringInfo(&cmd, "DROP_REPLICATION_SLOT %s WAIT", quote_identifier(slotname)); + appendStringInfoString(&cmd, "DROP_REPLICATION_SLOT "); + appendQuotedIdentifier(&cmd, slotname); + appendStringInfoString(&cmd, " WAIT"); PG_TRY(); { diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index cabe22d48be..ca6e5edabef 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -207,6 +207,7 @@ typedef struct AlteredTableInfo char *clusterOnIndex; /* index to use for CLUSTER */ List *changedStatisticsOids; /* OIDs of statistics to rebuild */ List *changedStatisticsDefs; /* string definitions of same */ + List *changedStatisticsOwners; /* owners of same */ } AlteredTableInfo; /* Struct describing one new constraint to check in Phase 3 scan */ @@ -501,7 +502,7 @@ static void add_column_collation_dependency(Oid relid, int32 attnum, Oid collid) static ObjectAddress ATExecDropNotNull(Relation rel, const char *colName, bool recurse, LOCKMODE lockmode); static void set_attnotnull(List **wqueue, Relation rel, AttrNumber attnum, - bool is_valid, bool queue_validation); + bool queue_validation); static ObjectAddress ATExecSetNotNull(List **wqueue, Relation rel, char *conName, char *colName, bool recurse, bool recursing, @@ -652,7 +653,7 @@ static void RememberIndexForRebuilding(Oid indoid, AlteredTableInfo *tab); static void RememberStatisticsForRebuilding(Oid stxoid, AlteredTableInfo *tab); static void ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode); -static void ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, +static void ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, Oid ownerId, char *cmd, List **wqueue, LOCKMODE lockmode, bool rewrite); static void RebuildConstraintComment(AlteredTableInfo *tab, AlterTablePass pass, @@ -969,6 +970,14 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, stmt->partbound != NULL, &old_constraints, &old_notnulls); + /* + * NB: The defaults and constraints we just inherited are already cooked, + * so they don't get the USAGE checks that AddRelationNewConstraints() + * applies to raw ones. That's intentional: the parent's own catalog + * entries already depend on those types, so copying them pins nothing + * new, and creating a child requires owning the parent, anyway. + */ + /* * Create a tuple descriptor from the relation schema. Note that this * deals with column names, types, and in-descriptor NOT NULL flags, but @@ -1354,7 +1363,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, nncols = AddRelationNotNullConstraints(rel, stmt->nnconstraints, old_notnulls, connames); foreach_int(attrnum, nncols) - set_attnotnull(NULL, rel, attrnum, true, false); + set_attnotnull(NULL, rel, attrnum, false); ObjectAddressSet(address, RelationRelationId, relationId); @@ -5479,7 +5488,7 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, address = AlterDomainAddConstraint(((AlterDomainStmt *) cmd->def)->typeName, ((AlterDomainStmt *) cmd->def)->def, - NULL); + NULL, true); break; case AT_ReAddComment: /* Re-add existing comment */ address = CommentObject((CommentStmt *) cmd->def); @@ -7838,10 +7847,9 @@ ATExecDropNotNull(Relation rel, const char *colName, bool recurse, */ static void set_attnotnull(List **wqueue, Relation rel, AttrNumber attnum, - bool is_valid, bool queue_validation) + bool queue_validation) { Form_pg_attribute attr; - CompactAttribute *thisatt; Assert(!queue_validation || wqueue); @@ -7867,9 +7875,6 @@ set_attnotnull(List **wqueue, Relation rel, AttrNumber attnum, elog(ERROR, "cache lookup failed for attribute %d of relation %u", attnum, RelationGetRelid(rel)); - thisatt = TupleDescCompactAttr(RelationGetDescr(rel), attnum - 1); - thisatt->attnullability = ATTNULLABLE_VALID; - attr = (Form_pg_attribute) GETSTRUCT(tuple); attr->attnotnull = true; @@ -8051,7 +8056,7 @@ ATExecSetNotNull(List **wqueue, Relation rel, char *conName, char *colName, ObjectAddressSet(address, ConstraintRelationId, ccon->conoid); /* Mark pg_attribute.attnotnull for the column and queue validation */ - set_attnotnull(wqueue, rel, attnum, true, true); + set_attnotnull(wqueue, rel, attnum, true); InvokeObjectPostAlterHook(RelationRelationId, RelationGetRelid(rel), attnum); @@ -8213,7 +8218,14 @@ ATExecCookedColumnDefault(Relation rel, AttrNumber attnum, { ObjectAddress address; - /* We assume no checking is required */ + /* + * This is used for a cooked default copied by CREATE TABLE ... LIKE, + * which adds new type dependencies. Such a default doesn't go through + * AddRelationNewConstraints(), and StoreAttrDefault() leaves the + * privilege checks to its caller, so we must check for USAGE on the types + * here. + */ + CheckUsageOnTypesInSingleRelExpr(newDefault, RelationGetRelid(rel), GetUserId()); /* * Remove any old default for the column. We use RESTRICT here for @@ -8756,17 +8768,12 @@ static void ATPrepDropExpression(Relation rel, AlterTableCmd *cmd, bool recurse, bool recursing, LOCKMODE lockmode) { /* - * Reject ONLY if there are child tables. We could implement this, but it - * is a bit complicated. GENERATED clauses must be attached to the column - * definition and cannot be added later like DEFAULT, so if a child table - * has a generation expression that the parent does not have, the child - * column will necessarily be an attislocal column. So to implement ONLY - * here, we'd need extra code to update attislocal of the direct child - * tables, somewhat similar to how DROP COLUMN does it, so that the - * resulting state can be properly dumped and restored. + * Reject ONLY if there are child tables -- but only, of course, at the + * top of the tree, otherwise it'd be impossible to run this command with + * trees deeper than two levels. Caller already got lock. */ - if (!recurse && - find_inheritance_children(RelationGetRelid(rel), lockmode)) + if (!recurse && !recursing && + find_inheritance_children(RelationGetRelid(rel), NoLock)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("ALTER TABLE / DROP EXPRESSION must be applied to child tables too"))); @@ -9690,7 +9697,11 @@ ATExecAddStatistics(AlteredTableInfo *tab, Relation rel, /* The CreateStatsStmt has already been through transformStatsStmt */ Assert(stmt->transformed); - address = CreateStatistics(stmt, !is_rebuild); + /* The owner must be set to the original statistics owner */ + Assert(OidIsValid(stmt->owner)); + + address = CreateStatistics(list_make1_oid(RelationGetRelid(rel)), + stmt, !is_rebuild); return address; } @@ -9977,7 +9988,6 @@ ATAddCheckNNConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, */ if (constr->contype == CONSTR_NOTNULL) set_attnotnull(wqueue, rel, ccon->attnum, - !constr->skip_validation, !constr->skip_validation); ObjectAddressSet(address, ConstraintRelationId, ccon->conoid); @@ -12262,6 +12272,12 @@ ATExecAlterConstraint(List **wqueue, Relation rel, ATAlterConstraint *cmdcon, errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("constraint \"%s\" of relation \"%s\" is not a not-null constraint", cmdcon->conname, RelationGetRelationName(rel))); + if (cmdcon->alterInheritability && + cmdcon->noinherit && rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("not-null constraint \"%s\" on partitioned table \"%s\" cannot be NO INHERIT", + cmdcon->conname, RelationGetRelationName(rel))); /* Refuse to modify inheritability of inherited constraints */ if (cmdcon->alterInheritability && @@ -13005,6 +13021,9 @@ QueueFKConstraintValidation(List **wqueue, Relation conrel, Relation fkrel, HeapTuple copyTuple; Form_pg_constraint copy_con; + /* since this function recurses, it could be driven to stack overflow */ + check_stack_depth(); + con = (Form_pg_constraint) GETSTRUCT(contuple); Assert(con->contype == CONSTRAINT_FOREIGN); Assert(!con->convalidated); @@ -13291,7 +13310,7 @@ QueueNNConstraintValidation(List **wqueue, Relation conrel, Relation rel, } /* Set attnotnull appropriately without queueing another validation */ - set_attnotnull(NULL, rel, attnum, true, false); + set_attnotnull(NULL, rel, attnum, false); tab = ATGetQueueEntry(wqueue, rel); tab->verify_new_notnull = true; @@ -15419,11 +15438,25 @@ RememberStatisticsForRebuilding(Oid stxoid, AlteredTableInfo *tab) { /* OK, capture the statistics object's existing definition string */ char *defstring = pg_get_statisticsobjdef_string(stxoid); + HeapTuple tup; + Form_pg_statistic_ext statext; + + tup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(stxoid)); + + if (!HeapTupleIsValid(tup)) /* should not happen */ + elog(ERROR, "cache lookup failed for statistics object %u", stxoid); + + statext = (Form_pg_statistic_ext) GETSTRUCT(tup); tab->changedStatisticsOids = lappend_oid(tab->changedStatisticsOids, stxoid); tab->changedStatisticsDefs = lappend(tab->changedStatisticsDefs, defstring); + + tab->changedStatisticsOwners = lappend_oid(tab->changedStatisticsOwners, + statext->stxowner); + + ReleaseSysCache(tup); } } @@ -15441,6 +15474,7 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) ObjectAddresses *objects; ListCell *def_item; ListCell *oid_item; + ListCell *owner_item; /* * Collect all the constraints and indexes to drop so we can process them @@ -15514,7 +15548,7 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) if (relid != tab->relid) LockRelationOid(relid, AccessExclusiveLock); - ATPostAlterTypeParse(oldId, relid, confrelid, + ATPostAlterTypeParse(oldId, relid, confrelid, InvalidOid, (char *) lfirst(def_item), wqueue, lockmode, tab->rewrite); } @@ -15533,7 +15567,7 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) if (relid != tab->relid) LockRelationOid(relid, AccessExclusiveLock); - ATPostAlterTypeParse(oldId, relid, InvalidOid, + ATPostAlterTypeParse(oldId, relid, InvalidOid, InvalidOid, (char *) lfirst(def_item), wqueue, lockmode, tab->rewrite); @@ -15542,8 +15576,9 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) } /* add dependencies for new statistics */ - forboth(oid_item, tab->changedStatisticsOids, - def_item, tab->changedStatisticsDefs) + forthree(oid_item, tab->changedStatisticsOids, + def_item, tab->changedStatisticsDefs, + owner_item, tab->changedStatisticsOwners) { Oid oldId = lfirst_oid(oid_item); Oid relid; @@ -15563,7 +15598,7 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) if (relid != tab->relid) LockRelationOid(relid, ShareUpdateExclusiveLock); - ATPostAlterTypeParse(oldId, relid, InvalidOid, + ATPostAlterTypeParse(oldId, relid, InvalidOid, lfirst_oid(owner_item), (char *) lfirst(def_item), wqueue, lockmode, tab->rewrite); @@ -15627,8 +15662,9 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) * operator that's not available for the new column type. */ static void -ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd, - List **wqueue, LOCKMODE lockmode, bool rewrite) +ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, Oid ownerId, + char *cmd, List **wqueue, LOCKMODE lockmode, + bool rewrite) { List *raw_parsetree_list; List *querytree_list; @@ -15668,10 +15704,14 @@ ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd, querytree_list = list_concat(querytree_list, afterStmts); } else if (IsA(stmt, CreateStatsStmt)) - querytree_list = lappend(querytree_list, - transformStatsStmt(oldRelId, - (CreateStatsStmt *) stmt, - cmd)); + { + CreateStatsStmt *csstmt; + + csstmt = transformStatsStmt(oldRelId, (CreateStatsStmt *) stmt, cmd); + csstmt->owner = ownerId; + + querytree_list = lappend(querytree_list, csstmt); + } else querytree_list = lappend(querytree_list, stmt); } @@ -18232,6 +18272,7 @@ ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode) ObjectAddress tableobj, typeobj; HeapTuple classtuple; + AclResult aclresult; /* Validate the type. */ typetuple = typenameType(NULL, ofTypename, NULL); @@ -18239,6 +18280,10 @@ ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode) typeform = (Form_pg_type) GETSTRUCT(typetuple); typeid = typeform->oid; + aclresult = object_aclcheck(TypeRelationId, typeid, GetUserId(), ACL_USAGE); + if (aclresult != ACLCHECK_OK) + aclcheck_error_type(aclresult, typeid); + /* Fail if the table has any inheritance parents. */ inheritsRelation = table_open(InheritsRelationId, AccessShareLock); ScanKeyInit(&key, diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 17f1e224f91..7ae6557d897 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -1131,8 +1131,13 @@ CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, * expression (eg, functions, as well as any columns used). */ if (whenRtable != NIL) + { + if (!isInternal) + CheckUsageOnTypesInExpr(whenClause, whenRtable, GetUserId()); + recordDependencyOnExpr(&myself, whenClause, whenRtable, DEPENDENCY_NORMAL); + } /* Post creation hook for new trigger */ InvokeObjectPostCreateHookArg(TriggerRelationId, trigoid, 0, diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 3f3a0f9d1a3..2ed7973d1b4 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -133,7 +133,8 @@ static void checkEnumOwner(HeapTuple tup); static char *domainAddCheckConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, int typMod, Constraint *constr, - const char *domainName, ObjectAddress *constrAddr); + const char *domainName, ObjectAddress *constrAddr, + bool is_readd); static Node *replace_domain_constraint_value(ParseState *pstate, ColumnRef *cref); static void domainAddNotNullConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, @@ -1048,6 +1049,13 @@ DefineDomain(ParseState *pstate, CreateDomainStmt *stmt) } } + /* + * The below call to TypeCreate() calls GenerateTypeDependencies(), which + * adds the dependencies on types. We are responsible for checking USAGE. + */ + if (defaultValueBin) + CheckUsageOnTypesInExpr(stringToNode(defaultValueBin), NIL, GetUserId()); + /* Allocate OID for array type */ domainArrayOid = AssignTypeArrayOid(); @@ -1145,7 +1153,7 @@ DefineDomain(ParseState *pstate, CreateDomainStmt *stmt) case CONSTR_CHECK: domainAddCheckConstraint(address.objectId, domainNamespace, basetypeoid, basetypeMod, - constr, domainName, NULL); + constr, domainName, NULL, false); break; case CONSTR_NOTNULL: @@ -1514,6 +1522,10 @@ DefineRange(ParseState *pstate, CreateRangeStmt *stmt) errmsg("range subtype cannot be %s", format_type_be(rangeSubtype)))); + aclresult = object_aclcheck(TypeRelationId, rangeSubtype, GetUserId(), ACL_USAGE); + if (aclresult != ACLCHECK_OK) + aclcheck_error_type(aclresult, rangeSubtype); + /* Identify subopclass */ rangeSubOpclass = findRangeSubOpclass(rangeSubOpclassName, rangeSubtype); @@ -2684,6 +2696,12 @@ AlterDomainDefault(List *names, Node *defaultRaw) } else { + /* + * The below call to GenerateTypeDependencies() creates the + * dependencies on types. We are responsible for checking USAGE. + */ + CheckUsageOnTypesInExpr(defaultExpr, NIL, GetUserId()); + /* * Expression must be stored as a nodeToString result, but we also * require a valid textual representation (mainly to make life @@ -2940,7 +2958,7 @@ AlterDomainDropConstraint(List *names, const char *constrName, */ ObjectAddress AlterDomainAddConstraint(List *names, Node *newConstraint, - ObjectAddress *constrAddr) + ObjectAddress *constrAddr, bool is_readd) { TypeName *typename; Oid domainoid; @@ -2984,7 +3002,8 @@ AlterDomainAddConstraint(List *names, Node *newConstraint, ccbin = domainAddCheckConstraint(domainoid, typTup->typnamespace, typTup->typbasetype, typTup->typtypmod, - constr, NameStr(typTup->typname), constrAddr); + constr, NameStr(typTup->typname), constrAddr, + is_readd); /* @@ -3511,7 +3530,8 @@ checkDomainOwner(HeapTuple tup) static char * domainAddCheckConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, int typMod, Constraint *constr, - const char *domainName, ObjectAddress *constrAddr) + const char *domainName, ObjectAddress *constrAddr, + bool is_readd) { Node *expr; char *ccbin; @@ -3574,6 +3594,13 @@ domainAddCheckConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, */ assign_expr_collations(pstate, expr); + /* + * The below call to CreateConstraintEntry() creates the dependencies on + * types. We are responsible for checking USAGE. + */ + if (!is_readd) + CheckUsageOnTypesInExpr(expr, NIL, GetUserId()); + /* * Domains don't allow variables (this is probably dead code now that * add_missing_from is history, but let's be sure). diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index be863db81cb..934b645efd6 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -1187,7 +1187,7 @@ vacuum_get_cutoffs(Relation rel, const VacuumParams *params, ereport(WARNING, (errmsg("cutoff for freezing multixacts is far in the past"), errhint("Close open transactions soon to avoid wraparound problems.\n" - "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); + "You might also need to commit or roll back old prepared transactions."))); /* * Determine the minimum freeze age to use: as specified by the caller, or diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index e5d8345de54..80ac19baa25 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -176,24 +176,24 @@ static Datum ExecJustHashInnerVarVirt(ExprState *state, ExprContext *econtext, b static Datum ExecJustHashOuterVarStrict(ExprState *state, ExprContext *econtext, bool *isnull); /* execution helper functions */ -static pg_attribute_always_inline void ExecEvalArrayCompareInternal(FunctionCallInfo fcinfo, - ArrayType *arr, - int16 typlen, - bool typbyval, - char typalign, - bool useOr, - Datum *result, - bool *resultnull); -static pg_attribute_always_inline void ExecAggPlainTransByVal(AggState *aggstate, - AggStatePerTrans pertrans, - AggStatePerGroup pergroup, - ExprContext *aggcontext, - int setno); -static pg_attribute_always_inline void ExecAggPlainTransByRef(AggState *aggstate, - AggStatePerTrans pertrans, - AggStatePerGroup pergroup, - ExprContext *aggcontext, - int setno); +static pg_always_inline void ExecEvalArrayCompareInternal(FunctionCallInfo fcinfo, + ArrayType *arr, + int16 typlen, + bool typbyval, + char typalign, + bool useOr, + Datum *result, + bool *resultnull); +static pg_always_inline void ExecAggPlainTransByVal(AggState *aggstate, + AggStatePerTrans pertrans, + AggStatePerGroup pergroup, + ExprContext *aggcontext, + int setno); +static pg_always_inline void ExecAggPlainTransByRef(AggState *aggstate, + AggStatePerTrans pertrans, + AggStatePerGroup pergroup, + ExprContext *aggcontext, + int setno); static char *ExecGetJsonValueItemString(JsonbValue *item, bool *resnull); /* @@ -1841,8 +1841,8 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) * ignoring NULL input values. We've nothing more to do after * finding a NULL. */ - *op->resnull = true; - *op->resvalue = (Datum) 0; + state->resnull = true; + state->resvalue = (Datum) 0; EEO_JUMP(op->d.hashdatum.jumpdone); } @@ -1889,8 +1889,8 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) * ignoring NULL input values. We've nothing more to do after * finding a NULL. */ - *op->resnull = true; - *op->resvalue = (Datum) 0; + state->resnull = true; + state->resvalue = (Datum) 0; EEO_JUMP(op->d.hashdatum.jumpdone); } else @@ -2550,7 +2550,7 @@ get_cached_rowtype(Oid type_id, int32 typmod, */ /* implementation of ExecJust(Inner|Outer|Scan)Var */ -static pg_attribute_always_inline Datum +static pg_always_inline Datum ExecJustVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull) { ExprEvalStep *op = &state->steps[1]; @@ -2588,7 +2588,7 @@ ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull) } /* implementation of ExecJustAssign(Inner|Outer|Scan)Var */ -static pg_attribute_always_inline Datum +static pg_always_inline Datum ExecJustAssignVarImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull) { ExprEvalStep *op = &state->steps[1]; @@ -2683,7 +2683,7 @@ ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull) } /* implementation of ExecJust(Inner|Outer|Scan)VarVirt */ -static pg_attribute_always_inline Datum +static pg_always_inline Datum ExecJustVarVirtImpl(ExprState *state, TupleTableSlot *slot, bool *isnull) { ExprEvalStep *op = &state->steps[0]; @@ -2726,7 +2726,7 @@ ExecJustScanVarVirt(ExprState *state, ExprContext *econtext, bool *isnull) } /* implementation of ExecJustAssign(Inner|Outer|Scan)VarVirt */ -static pg_attribute_always_inline Datum +static pg_always_inline Datum ExecJustAssignVarVirtImpl(ExprState *state, TupleTableSlot *inslot, bool *isnull) { ExprEvalStep *op = &state->steps[0]; @@ -2805,7 +2805,7 @@ ExecJustHashInnerVarWithIV(ExprState *state, ExprContext *econtext, } /* implementation of ExecJustHash(Inner|Outer)Var */ -static pg_attribute_always_inline Datum +static pg_always_inline Datum ExecJustHashVarImpl(ExprState *state, TupleTableSlot *slot, bool *isnull) { ExprEvalStep *fetchop = &state->steps[0]; @@ -2843,7 +2843,7 @@ ExecJustHashInnerVar(ExprState *state, ExprContext *econtext, bool *isnull) } /* implementation of ExecJustHash(Inner|Outer)VarVirt */ -static pg_attribute_always_inline Datum +static pg_always_inline Datum ExecJustHashVarVirtImpl(ExprState *state, TupleTableSlot *slot, bool *isnull) { ExprEvalStep *var = &state->steps[0]; @@ -4105,7 +4105,7 @@ ExecEvalScalarArrayOp(ExprState *state, ExprEvalStep *op) * Callers must handle the strict LHS-is-NULL; return NULL fast path prior to * calling this. */ -static pg_attribute_always_inline void +static pg_always_inline void ExecEvalArrayCompareInternal(FunctionCallInfo fcinfo, ArrayType *arr, int16 typlen, bool typbyval, char typalign, bool useOr, Datum *result, bool *resultnull) @@ -5903,7 +5903,7 @@ ExecEvalAggOrderedTransTuple(ExprState *state, ExprEvalStep *op, } /* implementation of transition function invocation for byval types */ -static pg_attribute_always_inline void +static pg_always_inline void ExecAggPlainTransByVal(AggState *aggstate, AggStatePerTrans pertrans, AggStatePerGroup pergroup, ExprContext *aggcontext, int setno) @@ -5935,7 +5935,7 @@ ExecAggPlainTransByVal(AggState *aggstate, AggStatePerTrans pertrans, } /* implementation of transition function invocation for byref types */ -static pg_attribute_always_inline void +static pg_always_inline void ExecAggPlainTransByRef(AggState *aggstate, AggStatePerTrans pertrans, AggStatePerGroup pergroup, ExprContext *aggcontext, int setno) diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index 8e02d68824f..ebe32b411a5 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -72,8 +72,8 @@ static TupleDesc ExecTypeFromTLInternal(List *targetList, bool skipjunk); -static pg_attribute_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp, - int natts); +static pg_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp, + int natts); static inline void tts_buffer_heap_store_tuple(TupleTableSlot *slot, HeapTuple tuple, Buffer buffer, @@ -1118,7 +1118,7 @@ slot_deform_heap_tuple_internal(TupleTableSlot *slot, HeapTuple tuple, * This is marked as always inline, so the different offp for different types * of slots gets optimized away. */ -static pg_attribute_always_inline void +static pg_always_inline void slot_deform_heap_tuple(TupleTableSlot *slot, HeapTuple tuple, uint32 *offp, int natts) { diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index a11b36c7176..590d34e9e26 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -92,6 +92,7 @@ static void ExecAppendAsyncBegin(AppendState *node); static bool ExecAppendAsyncGetNext(AppendState *node, TupleTableSlot **result); static bool ExecAppendAsyncRequest(AppendState *node, TupleTableSlot **result); static void ExecAppendAsyncEventWait(AppendState *node); +static void ExecAppendAsyncReset(AppendState *node); static void classify_matching_subplans(AppendState *node); /* ---------------------------------------------------------------- @@ -423,6 +424,10 @@ ExecReScanAppend(AppendState *node) int nasyncplans = node->as_nasyncplans; int i; + /* If there are any async subplans, reset async requests made for them. */ + if (nasyncplans > 0) + ExecAppendAsyncReset(node); + /* * If any PARAM_EXEC Params used in pruning expressions have changed, then * we'd better unset the valid subplans so that they are reselected for @@ -458,25 +463,6 @@ ExecReScanAppend(AppendState *node) ExecReScan(subnode); } - /* Reset async state */ - if (nasyncplans > 0) - { - i = -1; - while ((i = bms_next_member(node->as_asyncplans, i)) >= 0) - { - AsyncRequest *areq = node->as_asyncrequests[i]; - - areq->callback_pending = false; - areq->request_complete = false; - areq->result = NULL; - } - - node->as_nasyncresults = 0; - node->as_nasyncremain = 0; - bms_free(node->as_needrequest); - node->as_needrequest = NULL; - } - /* Let choose_next_subplan_* function handle setting the first subplan */ node->as_whichplan = INVALID_SUBPLAN_INDEX; node->as_syncdone = false; @@ -1132,6 +1118,79 @@ ExecAppendAsyncEventWait(AppendState *node) } } +/* ---------------------------------------------------------------- + * ExecAppendAsyncReset + * + * Reset asynchronous requests made for async-capable subplans. + * ---------------------------------------------------------------- + */ +static void +ExecAppendAsyncReset(AppendState *node) +{ + int i; + + /* We should never be called when there are no async subplans. */ + Assert(node->as_nasyncplans > 0); + + /* + * Drain pending async requests if any. We force the as_syncdone flag to + * be true so that ExecAppendAsyncEventWait() waits until at least one + * event occurs. + */ + node->as_syncdone = true; + for (;;) + { + bool found = false; + + /* + * When called from ExecAppendAsyncEventWait(), postgres_fdw (and + * possibly other FDWs) will skip configuration of events for pending + * requests in some cases if as_needrequest isn't empty. To avoid + * that, discard results we already have. Note that we need to do + * this on every iteration, as the call to that function may produce + * new results. + */ + node->as_nasyncresults = 0; + bms_free(node->as_needrequest); + node->as_needrequest = NULL; + + i = -1; + while ((i = bms_next_member(node->as_asyncplans, i)) >= 0) + { + AsyncRequest *areq = node->as_asyncrequests[i]; + + if (areq->callback_pending) + { + found = true; + break; + } + } + if (!found) + break; + + CHECK_FOR_INTERRUPTS(); + + /* Wait or poll for async events. */ + ExecAppendAsyncEventWait(node); + } + + /* Reset async requests. */ + i = -1; + while ((i = bms_next_member(node->as_asyncplans, i)) >= 0) + { + AsyncRequest *areq = node->as_asyncrequests[i]; + + Assert(!areq->callback_pending); + areq->request_complete = false; + areq->result = NULL; + } + + /* Reset state variables. */ + Assert(node->as_nasyncresults == 0); + Assert(node->as_needrequest == NULL); + node->as_nasyncremain = 0; +} + /* ---------------------------------------------------------------- * ExecAsyncAppendResponse * diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 5661ad76830..039d43ea541 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -217,7 +217,7 @@ static void ExecParallelHashJoinPartitionOuter(HashJoinState *hjstate); * the other one is "outer". * ---------------------------------------------------------------- */ -static pg_attribute_always_inline TupleTableSlot * +static pg_always_inline TupleTableSlot * ExecHashJoinImpl(PlanState *pstate, bool parallel) { HashJoinState *node = castNode(HashJoinState, pstate); diff --git a/src/backend/executor/nodeIndexonlyscan.c b/src/backend/executor/nodeIndexonlyscan.c index a6a00d594c0..867a8e40e78 100644 --- a/src/backend/executor/nodeIndexonlyscan.c +++ b/src/backend/executor/nodeIndexonlyscan.c @@ -31,6 +31,7 @@ #include "postgres.h" #include "access/genam.h" +#include "access/htup_details.h" #include "access/relscan.h" #include "access/tableam.h" #include "access/tupdesc.h" @@ -48,7 +49,7 @@ static TupleTableSlot *IndexOnlyNext(IndexOnlyScanState *node); static void StoreIndexTuple(IndexOnlyScanState *node, TupleTableSlot *slot, - IndexTuple itup, TupleDesc itupdesc); + IndexScanDesc scandesc); /* ---------------------------------------------------------------- @@ -190,27 +191,8 @@ IndexOnlyNext(IndexOnlyScanState *node) tuple_from_heap = true; } - /* - * Fill the scan tuple slot with data from the index. This might be - * provided in either HeapTuple or IndexTuple format. Conceivably an - * index AM might fill both fields, in which case we prefer the heap - * format, since it's probably a bit cheaper to fill a slot from. - */ - if (scandesc->xs_hitup) - { - /* - * We don't take the trouble to verify that the provided tuple has - * exactly the slot's format, but it seems worth doing a quick - * check on the number of fields. - */ - Assert(slot->tts_tupleDescriptor->natts == - scandesc->xs_hitupdesc->natts); - ExecForceStoreHeapTuple(scandesc->xs_hitup, slot, false); - } - else if (scandesc->xs_itup) - StoreIndexTuple(node, slot, scandesc->xs_itup, scandesc->xs_itupdesc); - else - elog(ERROR, "no data returned for index-only scan"); + /* Fill the scan tuple slot with data from the index */ + StoreIndexTuple(node, slot, scandesc); /* * If the index was lossy, we have to recheck the index quals. @@ -260,56 +242,79 @@ IndexOnlyNext(IndexOnlyScanState *node) /* * StoreIndexTuple - * Fill the slot with data from the index tuple. + * Fill the slot with the data the index AM returned. + * + * The data might be provided in either HeapTuple (xs_hitup) or IndexTuple + * (xs_itup) format. Conceivably an index AM might fill both fields, in which + * case we prefer the heap format, since it's probably a bit cheaper to fill a + * slot from. * * At some point this might be generally-useful functionality, but * right now we don't need it elsewhere. */ static void StoreIndexTuple(IndexOnlyScanState *node, TupleTableSlot *slot, - IndexTuple itup, TupleDesc itupdesc) + IndexScanDesc scandesc) { - /* - * Note: we must use the tupdesc supplied by the AM in index_deform_tuple, - * not the slot's tupdesc, in case the latter has different datatypes - * (this happens for btree name_ops in particular). They'd better have - * the same number of columns though, as well as being datatype-compatible - * which is something we can't so easily check. - */ - Assert(slot->tts_tupleDescriptor->natts == itupdesc->natts); - ExecClearTuple(slot); - index_deform_tuple(itup, itupdesc, slot->tts_values, slot->tts_isnull); /* - * Copy all name columns stored as cstrings back into a NAMEDATALEN byte - * sized allocation. We mark this branch as unlikely as generally "name" - * is used only for the system catalogs and this would have to be a user - * query running on those or some other user table with an index on a name - * column. + * We must deform the tuple using the tupdesc the index AM formed it with + * (xs_hitupdesc or xs_itupdesc), not the slot's tupdesc. The datums + * returned by the index AM must be binary compatible, but the descriptors + * may align each column differently in certain rare cases. (Actually, + * btree's "name" opclass stores cstring tuples that _aren't_ even binary + * compatible, in the strictest sense. We directly handle that here.) */ - if (unlikely(node->ioss_NameCStringAttNums != NULL)) + if (scandesc->xs_hitup) { - int attcount = node->ioss_NameCStringCount; + Assert(slot->tts_tupleDescriptor->natts == scandesc->xs_hitupdesc->natts); - for (int idx = 0; idx < attcount; idx++) - { - int attnum = node->ioss_NameCStringAttNums[idx]; - Name name; + heap_deform_tuple(scandesc->xs_hitup, scandesc->xs_hitupdesc, + slot->tts_values, slot->tts_isnull); + } + else if (scandesc->xs_itup) + { + Assert(slot->tts_tupleDescriptor->natts == scandesc->xs_itupdesc->natts); - /* skip null Datums */ - if (slot->tts_isnull[attnum]) - continue; + index_deform_tuple(scandesc->xs_itup, scandesc->xs_itupdesc, + slot->tts_values, slot->tts_isnull); - /* allocate the NAMEDATALEN and copy the datum into that memory */ - name = (Name) MemoryContextAlloc(node->ss.ps.ps_ExprContext->ecxt_per_tuple_memory, - NAMEDATALEN); + /* + * Copy all name columns stored as cstrings back into a NAMEDATALEN + * byte sized allocation. We mark this branch as unlikely as + * generally "name" is used only for the system catalogs and this + * would have to be a user query running on those or some other user + * table with an index on a name column. + */ + if (unlikely(node->ioss_NameCStringAttNums != NULL)) + { + int attcount = node->ioss_NameCStringCount; - /* use namestrcpy to zero-pad all trailing bytes */ - namestrcpy(name, DatumGetCString(slot->tts_values[attnum])); - slot->tts_values[attnum] = NameGetDatum(name); + for (int idx = 0; idx < attcount; idx++) + { + int attnum = node->ioss_NameCStringAttNums[idx]; + Name name; + + /* skip null Datums */ + if (slot->tts_isnull[attnum]) + continue; + + /* + * allocate the NAMEDATALEN and copy the datum into that + * memory + */ + name = (Name) MemoryContextAlloc(node->ss.ps.ps_ExprContext->ecxt_per_tuple_memory, + NAMEDATALEN); + + /* use namestrcpy to zero-pad all trailing bytes */ + namestrcpy(name, DatumGetCString(slot->tts_values[attnum])); + slot->tts_values[attnum] = NameGetDatum(name); + } } } + else + elog(ERROR, "no data returned for index-only scan"); ExecStoreVirtualTuple(slot); } diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index ea8ed94a764..df99a204e0c 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -2477,9 +2477,28 @@ ExecUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, * Prepare for the update. This includes BEFORE ROW triggers, so we're * done if it says we are. */ + context->tmfd.traversed = false; if (!ExecUpdatePrologue(context, resultRelInfo, tupleid, oldtuple, slot, NULL)) return NULL; + /* + * If the target tuple was concurrently updated, the trigger code will + * have done EPQ and updated tupleid, following the update chain. In this + * case, we must fetch the most recent version of old tuple for the + * benefit of RETURNING. Technically, we could get away with not doing + * this, if there is no RETURNING clause, or it doesn't refer to OLD, but + * it seems preferable to always ensure that the contents of oldSlot are + * correct. + */ + if (context->tmfd.traversed) + { + if (!table_tuple_fetch_row_version(resultRelInfo->ri_RelationDesc, + tupleid, + SnapshotAny, + oldSlot)) + elog(ERROR, "failed to re-fetch tuple updated during trigger execution"); + } + /* INSTEAD OF ROW UPDATE Triggers */ if (resultRelInfo->ri_TrigDesc && resultRelInfo->ri_TrigDesc->trig_update_instead_row) @@ -4647,6 +4666,8 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) List *updateColnosLists = NIL; List *mergeActionLists = NIL; List *mergeJoinConditions = NIL; + List *fdwPrivLists = NIL; + Bitmapset *fdwDirectModifyPlans = NULL; ResultRelInfo *resultRelInfo; List *arowmarks; ListCell *l; @@ -4689,6 +4710,8 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) if (keep_rel) { + List *fdwPrivList = (List *) list_nth(node->fdwPrivLists, i); + resultRelations = lappend_int(resultRelations, rti); if (node->withCheckOptionLists) { @@ -4724,6 +4747,19 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) mergeJoinConditions = lappend(mergeJoinConditions, mergeJoinCondition); } + + /* + * fdwPrivLists/fdwDirectModifyPlans are re-indexed to match + * resultRelations + */ + fdwPrivLists = lappend(fdwPrivLists, fdwPrivList); + if (bms_is_member(i, node->fdwDirectModifyPlans)) + { + int new_index = list_length(resultRelations) - 1; + + fdwDirectModifyPlans = bms_add_member(fdwDirectModifyPlans, + new_index); + } } i++; } @@ -4828,7 +4864,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) /* Initialize the usesFdwDirectModify flag */ resultRelInfo->ri_usesFdwDirectModify = - bms_is_member(i, node->fdwDirectModifyPlans); + bms_is_member(i, fdwDirectModifyPlans); /* * Verify result relation is a valid target for the current operation @@ -4857,7 +4893,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) resultRelInfo->ri_FdwRoutine != NULL && resultRelInfo->ri_FdwRoutine->BeginForeignModify != NULL) { - List *fdw_private = (List *) list_nth(node->fdwPrivLists, i); + List *fdw_private = (List *) list_nth(fdwPrivLists, i); resultRelInfo->ri_FdwRoutine->BeginForeignModify(mtstate, resultRelInfo, diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index ed99059afd6..e61c84ba617 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -1039,6 +1039,20 @@ eval_windowfunction(WindowAggState *winstate, WindowStatePerFunc perfuncstate, oldContext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_tuple_memory); + /* + * Protect fixed-size fcinfo. Ordinarily this would have been checked + * while creating the WindowFunc, but it's possible that we are looking at + * a parsetree from a stored view that was made by a server executable + * with a different value of FUNC_MAX_ARGS. + */ + if (perfuncstate->numArguments > FUNC_MAX_ARGS) + ereport(ERROR, + (errcode(ERRCODE_TOO_MANY_ARGUMENTS), + errmsg_plural("cannot pass more than %d argument to a function", + "cannot pass more than %d arguments to a function", + FUNC_MAX_ARGS, + FUNC_MAX_ARGS))); + /* * We don't pass any normal arguments to a window function, but we do pass * it the number of arguments, in order to permit window function @@ -2884,6 +2898,25 @@ initialize_peragg(WindowAggState *winstate, WindowFunc *wfunc, numArguments = list_length(wfunc->args); + /* + * Check the number of arguments, to protect fixed-size arrays here and + * later in node execution. + * + * Aggregates can have at most FUNC_MAX_ARGS-1 args (compare + * AggregateCreate, whose error message we want to match). Ordinarily + * this would have been checked while creating the WindowFunc, but it's + * possible that we are looking at a parsetree from a stored view that was + * made by a server executable with a different value of FUNC_MAX_ARGS, or + * an executable in which parse_func.c didn't enforce the correct limit. + */ + if (numArguments > FUNC_MAX_ARGS - 1) + ereport(ERROR, + (errcode(ERRCODE_TOO_MANY_ARGUMENTS), + errmsg_plural("aggregates cannot have more than %d argument", + "aggregates cannot have more than %d arguments", + FUNC_MAX_ARGS - 1, + FUNC_MAX_ARGS - 1))); + i = 0; foreach(lc, wfunc->args) { diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c index e64f9b31c43..2d448f3cc87 100644 --- a/src/backend/jit/llvm/llvmjit.c +++ b/src/backend/jit/llvm/llvmjit.c @@ -1048,9 +1048,6 @@ llvm_create_types(void) void llvm_split_symbol_name(const char *name, char **modname, char **funcname) { - *modname = NULL; - *funcname = NULL; - /* * Module function names are pgextern.$module.$funcname */ @@ -1060,14 +1057,21 @@ llvm_split_symbol_name(const char *name, char **modname, char **funcname) * Symbol names cannot contain a ., therefore we can split based on * first and last occurrence of one. */ - *funcname = rindex(name, '.'); - (*funcname)++; /* jump over . */ - - *modname = pnstrdup(name + strlen("pgextern."), - *funcname - name - strlen("pgextern.") - 1); - Assert(funcname); + const char *lastdot; - *funcname = pstrdup(*funcname); + name += strlen("pgextern."); + lastdot = strrchr(name, '.'); + if (lastdot) + { + *modname = pnstrdup(name, lastdot - name); + *funcname = pstrdup(lastdot + 1); + } + else + { + /* hmm, no second dot? */ + *modname = NULL; + *funcname = pstrdup(name); + } } else { diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c index 798c1ce4ed2..9cff932d058 100644 --- a/src/backend/jit/llvm/llvmjit_deform.c +++ b/src/backend/jit/llvm/llvmjit_deform.c @@ -105,27 +105,32 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, funcname = llvm_expand_funcname(context, "deform"); /* - * Check which columns have to exist, so we don't have to check the row's - * natts unnecessarily. + * Check which columns have to exist in all tuples, so we don't have to + * check the row's natts unnecessarily. */ for (attnum = 0; attnum < desc->natts; attnum++) { - CompactAttribute *att = TupleDescCompactAttr(desc, attnum); + CompactAttribute *catt = TupleDescCompactAttr(desc, attnum); + Form_pg_attribute attr = TupleDescAttr(desc, attnum); /* * If the column is declared NOT NULL then it must be present in every * tuple, unless there's a "missing" entry that could provide a * non-NULL value for it. That in turn guarantees that the NULL bitmap * - if there are any NULLable columns - is at least long enough to - * cover columns up to attnum. + * cover columns up to attnum. We treat virtual generated columns + * similar to atthasmissing columns, as these columns could either not + * be represented in the tuple or could have the column represented as + * a NULL in the null bitmap. * * Be paranoid and also check !attisdropped, even though the * combination of attisdropped && attnotnull combination shouldn't * exist. */ - if (att->attnullability == ATTNULLABLE_VALID && - !att->atthasmissing && - !att->attisdropped) + if (catt->attnullability == ATTNULLABLE_VALID && + !catt->atthasmissing && + !catt->attisdropped && + attr->attgenerated != ATTRIBUTE_GENERATED_VIRTUAL) guaranteed_column_number = attnum; } @@ -394,6 +399,8 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, for (attnum = 0; attnum < natts; attnum++) { CompactAttribute *att = TupleDescCompactAttr(desc, attnum); + Form_pg_attribute attr = TupleDescAttr(desc, attnum); + LLVMValueRef v_incby; int alignto = att->attalignby; LLVMValueRef l_attno = l_int16_const(lc, attnum); @@ -436,9 +443,12 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, /* * Check for nulls if necessary. No need to take missing attributes * into account, because if they're present the heaptuple's natts - * would have indicated that a slot_getmissingattrs() is needed. + * would have indicated that a slot_getmissingattrs() is needed. When + * present in the tuple, virtual generated columns are always stored + * as NULL, so we must always perform NULL checks for these. */ - if (att->attnullability != ATTNULLABLE_VALID) + if (att->attnullability != ATTNULLABLE_VALID || + attr->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL) { LLVMBasicBlockRef b_ifnotnull; LLVMBasicBlockRef b_ifnull; @@ -616,12 +626,14 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, known_alignment += att->attlen; } else if (att->attnullability == ATTNULLABLE_VALID && + attr->attgenerated != ATTRIBUTE_GENERATED_VIRTUAL && (att->attlen % alignto) == 0) { /* - * After a NOT NULL fixed-width column with a length that is a - * multiple of its alignment requirement, we know the following - * column is aligned to at least the current column's alignment. + * After a NOT NULL (and not virtual generated) fixed-width column + * with a length that is a multiple of its alignment requirement, + * we know the following column is aligned to at least the current + * column's alignment. */ Assert(att->attlen > 0); known_alignment = alignto; diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index 2326223996e..e807e60e311 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -2111,11 +2111,12 @@ llvm_compile_expr(ExprState *state) LLVMPositionBuilderAtEnd(b, b_ifnullblock); /* - * In strict node, NULL inputs result in NULL. Save - * the NULL result and goto jumpdone. + * In strict mode, NULL inputs result in NULL. Save + * the NULL to the ExprState's resnull/resvalue fields + * directly, then goto jumpdone. */ - LLVMBuildStore(b, l_sbool_const(1), v_resnullp); - LLVMBuildStore(b, l_sizet_const(0), v_resvaluep); + LLVMBuildStore(b, l_sbool_const(1), v_tmpisnullp); + LLVMBuildStore(b, l_sizet_const(0), v_tmpvaluep); LLVMBuildBr(b, opblocks[op->d.hashdatum.jumpdone]); } else diff --git a/src/backend/libpq/auth-scram.c b/src/backend/libpq/auth-scram.c index 8fe5b989c2f..dcdf0dfbb40 100644 --- a/src/backend/libpq/auth-scram.c +++ b/src/backend/libpq/auth-scram.c @@ -729,7 +729,7 @@ mock_scram_secret(const char *username, pg_cryptohash_type *hash_type, encoded_salt[encoded_len] = '\0'; *salt = encoded_salt; - *iterations = SCRAM_SHA_256_DEFAULT_ITERATIONS; + *iterations = scram_sha_256_iterations; /* StoredKey and ServerKey are not used in a doomed authentication */ memset(stored_key, 0, SCRAM_MAX_KEY_LEN); diff --git a/src/backend/libpq/be-secure-openssl.c b/src/backend/libpq/be-secure-openssl.c index c8b63ef8249..b67b91a54b2 100644 --- a/src/backend/libpq/be-secure-openssl.c +++ b/src/backend/libpq/be-secure-openssl.c @@ -78,7 +78,7 @@ static bool initialize_ecdh(SSL_CTX *context, bool isServerStart); static const char *SSLerrmessageExt(unsigned long ecode, const char *replacement); static const char *SSLerrmessage(unsigned long ecode); -static char *X509_NAME_to_cstring(X509_NAME *name); +static char *X509_NAME_to_cstring(const X509_NAME *name); static SSL_CTX *SSL_context = NULL; static bool dummy_ssl_passwd_cb_called = false; @@ -638,18 +638,18 @@ be_tls_open_server(Port *port) if (port->peer != NULL) { int len; - X509_NAME *x509name = X509_get_subject_name(port->peer); + const X509_NAME *x509name = X509_get_subject_name(port->peer); char *peer_dn; BIO *bio = NULL; BUF_MEM *bio_buf = NULL; - len = X509_NAME_get_text_by_NID(x509name, NID_commonName, NULL, 0); + len = X509_NAME_get_text_by_NID(unconstify(X509_NAME *, x509name), NID_commonName, NULL, 0); if (len != -1) { char *peer_cn; peer_cn = MemoryContextAlloc(TopMemoryContext, len + 1); - r = X509_NAME_get_text_by_NID(x509name, NID_commonName, peer_cn, + r = X509_NAME_get_text_by_NID(unconstify(X509_NAME *, x509name), NID_commonName, peer_cn, len + 1); peer_cn[len] = '\0'; if (r != len) @@ -1642,14 +1642,14 @@ be_tls_get_certificate_hash(Port *port, size_t *len) * */ static char * -X509_NAME_to_cstring(X509_NAME *name) +X509_NAME_to_cstring(const X509_NAME *name) { BIO *membuf = BIO_new(BIO_s_mem()); int i, nid, count = X509_NAME_entry_count(name); - X509_NAME_ENTRY *e; - ASN1_STRING *v; + const X509_NAME_ENTRY *e; + const ASN1_STRING *v; const char *field_name; size_t size; char nullterm; diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index e2d9e9be41a..bc48966c5d1 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -988,6 +988,8 @@ makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType item_type, { JsonIsPredicate *n = makeNode(JsonIsPredicate); + Assert(expr != NULL); + n->expr = expr; n->format = format; n->item_type = item_type; diff --git a/src/backend/nodes/queryjumblefuncs.c b/src/backend/nodes/queryjumblefuncs.c index 31f97151977..3ce073beb53 100644 --- a/src/backend/nodes/queryjumblefuncs.c +++ b/src/backend/nodes/queryjumblefuncs.c @@ -230,7 +230,7 @@ DoJumble(JumbleState *jstate, Node *node) * * Note: Callers must ensure that size > 0. */ -static pg_attribute_always_inline void +static pg_always_inline void AppendJumbleInternal(JumbleState *jstate, const unsigned char *item, Size size) { @@ -306,7 +306,7 @@ AppendJumble(JumbleState *jstate, const unsigned char *value, Size size) * AppendJumbleNull * For jumbling NULL pointers */ -static pg_attribute_always_inline void +static pg_always_inline void AppendJumbleNull(JumbleState *jstate) { jstate->pending_nulls++; @@ -373,7 +373,7 @@ AppendJumble64(JumbleState *jstate, const unsigned char *value) * * Note: Callers must ensure that there's at least 1 pending NULL. */ -static pg_attribute_always_inline void +static pg_always_inline void FlushPendingNulls(JumbleState *jstate) { Assert(jstate->pending_nulls > 0); diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 8feeed9f303..b53722036cd 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -154,6 +154,10 @@ static bool targetIsInAllPartitionLists(TargetEntry *tle, Query *query); static pushdown_safe_type qual_is_pushdown_safe(Query *subquery, Index rti, RestrictInfo *rinfo, pushdown_safety_info *safetyInfo); +static Oid pushdown_var_grouping_eqop(Var *var, void *context); +static Oid subquery_column_grouping_eqop(Query *subquery, AttrNumber attno); +static Oid setop_column_grouping_eqop(Node *setop, AttrNumber attno); +static bool setop_has_grouping(Node *setop); static void subquery_push_qual(Query *subquery, RangeTblEntry *rte, Index rti, Node *qual); static void recurse_push_qual(Node *setOp, Query *topquery, @@ -3818,7 +3822,7 @@ check_output_expressions(Query *subquery, pushdown_safety_info *safetyInfo) /* If subquery uses window functions, check point 4 */ if (subquery->hasWindowFuncs && (safetyInfo->unsafeFlags[tle->resno] & - UNSAFE_NOTIN_DISTINCTON_CLAUSE) == 0 && + UNSAFE_NOTIN_PARTITIONBY_CLAUSE) == 0 && !targetIsInAllPartitionLists(tle, subquery)) { /* not present in all PARTITION BY clauses, so mark it unsafe */ @@ -3920,6 +3924,16 @@ targetIsInAllPartitionLists(TargetEntry *tle, Query *query) * * 5. rinfo's clause must not refer to any subquery output columns that were * found to be unsafe to reference by subquery_is_pushdown_safe(). + * + * 6. If the subquery has a grouping layer (DISTINCT, DISTINCT ON, window + * PARTITION BY, or a set operation that groups rows by equality), rinfo's + * clause must not apply a different equivalence relation to a grouping column + * than the grouping uses; otherwise it would distinguish rows the grouping + * considers equal, and pushing such a clause past the grouping would drop + * members of a group and change which row becomes the group's representative + * (or, for window functions, change per-partition values such as ranks and + * counts). See expression_has_grouping_conflict for the kinds of conflict + * detected. */ static pushdown_safe_type qual_is_pushdown_safe(Query *subquery, Index rti, RestrictInfo *rinfo, @@ -4016,9 +4030,174 @@ qual_is_pushdown_safe(Query *subquery, Index rti, RestrictInfo *rinfo, list_free(vars); + /* Check point 6 */ + if (safe == PUSHDOWN_SAFE && + (subquery->hasWindowFuncs || + subquery->distinctClause != NIL || + (subquery->setOperations != NULL && + setop_has_grouping(subquery->setOperations)))) + { + if (expression_has_grouping_conflict(qual, pushdown_var_grouping_eqop, + subquery)) + safe = PUSHDOWN_UNSAFE; + } + return safe; } +/* + * pushdown_var_grouping_eqop + * grouping_eqop_callback for qual_is_pushdown_safe. + * + * Returns the grouping equality operator for 'var' if it references a subquery + * output column that participates in the subquery's grouping layer; InvalidOid + * otherwise. + * + * 'context' is the subquery Query whose pushdown safety we're checking. + */ +static Oid +pushdown_var_grouping_eqop(Var *var, void *context) +{ + Query *subquery = (Query *) context; + Oid eqop; + + if (var->varlevelsup != 0) + return InvalidOid; + + eqop = subquery_column_grouping_eqop(subquery, var->varattno); + + /* + * qual_is_pushdown_safe ensures any level-0 subquery Var that reaches us + * references a grouping column. + */ + Assert(OidIsValid(eqop)); + + return eqop; +} + +/* + * subquery_column_grouping_eqop + * Return the equality operator that the subquery uses to group rows on + * the given output column, or InvalidOid if the column doesn't + * participate in any grouping mechanism. + * + * A subquery output column is grouping-relevant if it appears in + * subquery->distinctClause (covering both DISTINCT and DISTINCT ON), in every + * window's PARTITION BY clause, or is grouped by some node in a set-operation + * tree. In all of these cases the parser builds the SortGroupClause with the + * column's type-default equality operator via get_sort_group_operators, so any + * matching SortGroupClause carries the correct eqop. + */ +static Oid +subquery_column_grouping_eqop(Query *subquery, AttrNumber attno) +{ + TargetEntry *tle; + ListCell *lc; + + if (attno <= 0 || attno > list_length(subquery->targetList)) + return InvalidOid; + + tle = list_nth_node(TargetEntry, subquery->targetList, attno - 1); + + /* DISTINCT or DISTINCT ON */ + foreach(lc, subquery->distinctClause) + { + SortGroupClause *sgc = lfirst_node(SortGroupClause, lc); + + if (sgc->tleSortGroupRef == tle->ressortgroupref) + return sgc->eqop; + } + + /* Window function PARTITION BY: must appear in every window's list. */ + if (subquery->hasWindowFuncs && subquery->windowClause != NIL) + { + Oid eqop = InvalidOid; + + foreach(lc, subquery->windowClause) + { + WindowClause *wc = (WindowClause *) lfirst(lc); + ListCell *lc2; + + foreach(lc2, wc->partitionClause) + { + SortGroupClause *sgc = lfirst_node(SortGroupClause, lc2); + + if (sgc->tleSortGroupRef == tle->ressortgroupref) + break; + } + if (lc2 == NULL) + break; /* not present in this window's list */ + eqop = lfirst_node(SortGroupClause, lc2)->eqop; + } + if (lc == NULL) + return eqop; /* matched in every window */ + } + + /* Set operation */ + if (subquery->setOperations != NULL) + return setop_column_grouping_eqop(subquery->setOperations, attno); + + return InvalidOid; +} + +/* + * setop_column_grouping_eqop + * Recursively search a SetOperationStmt tree for any node that groups + * rows by equality, and return the equality operator used for the given + * output column. Returns InvalidOid if no node in the tree groups (i.e., + * an entirely-UNION-ALL tree). + * + * For any set operation other than UNION ALL, groupClauses is a positional + * list of SortGroupClauses, with element N-1 corresponding to output column N + * (see makeSortGroupClauseForSetOp). + */ +static Oid +setop_column_grouping_eqop(Node *setop, AttrNumber attno) +{ + SetOperationStmt *op; + Oid eqop; + + if (setop == NULL || !IsA(setop, SetOperationStmt)) + return InvalidOid; + + op = (SetOperationStmt *) setop; + + if (op->groupClauses != NIL && + attno >= 1 && attno <= list_length(op->groupClauses)) + { + SortGroupClause *sgc = list_nth_node(SortGroupClause, + op->groupClauses, attno - 1); + + return sgc->eqop; + } + + /* Recurse into children to find any inner grouping */ + eqop = setop_column_grouping_eqop(op->larg, attno); + if (OidIsValid(eqop)) + return eqop; + return setop_column_grouping_eqop(op->rarg, attno); +} + +/* + * setop_has_grouping + * Return true if any node in the SetOperationStmt tree groups rows by + * equality (i.e., has non-NIL groupClauses). + */ +static bool +setop_has_grouping(Node *setop) +{ + SetOperationStmt *op; + + if (setop == NULL || !IsA(setop, SetOperationStmt)) + return false; + + op = (SetOperationStmt *) setop; + if (op->groupClauses != NIL) + return true; + + return setop_has_grouping(op->larg) || setop_has_grouping(op->rarg); +} + /* * subquery_push_qual - push down a qual that we have determined is safe */ diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 9f546b4d3a6..4d19204da0a 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -72,9 +72,13 @@ static void remove_leftjoinrel_from_query(PlannerInfo *root, int relid, SpecialJoinInfo *sjinfo); static void remove_rel_from_restrictinfo(RestrictInfo *rinfo, int relid, int ojrelid); -static void remove_rel_from_eclass(EquivalenceClass *ec, +static void remove_rel_from_eclass(PlannerInfo *root, EquivalenceClass *ec, SpecialJoinInfo *sjinfo, int relid, int subst); +static void remove_rel_from_restrictinfo_phvs(RestrictInfo *rinfo, + int relid, int ojrelid); +static Node *remove_rel_from_phvs(Node *node, int relid, int ojrelid); +static Node *remove_rel_from_phvs_mutator(Node *node, Relids removable); static List *remove_rel_from_joinlist(List *joinlist, int relid, int *nremoved); static bool rel_supports_distinctness(PlannerInfo *root, RelOptInfo *rel); static bool rel_is_distinct_for(PlannerInfo *root, RelOptInfo *rel, @@ -345,6 +349,7 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel, int relid = rel->relid; Index rti; ListCell *l; + Bitmapset *seen_serials = NULL; /* * Update all_baserels and related relid sets. @@ -502,9 +507,7 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel, { EquivalenceClass *ec = (EquivalenceClass *) lfirst(l); - if (bms_is_member(relid, ec->ec_relids) || - (sjinfo == NULL || bms_is_member(sjinfo->ojrelid, ec->ec_relids))) - remove_rel_from_eclass(ec, sjinfo, relid, subst); + remove_rel_from_eclass(root, ec, sjinfo, relid, subst); } /* @@ -520,6 +523,11 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel, * * So, start by removing all other bits from attr_needed sets and * lateral_vars lists. (We already did this above for ph_needed.) + * + * Also, for left-join removal, we strip the removed rel and join from any + * PlaceHolderVar embedded in the surviving rels' restriction clauses and + * join clauses; we needn't bother with the rel being removed, nor when + * the query has no PlaceHolderVars. */ for (rti = 1; rti < root->simple_rel_array_size; rti++) { @@ -545,6 +553,33 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel, if (subst > 0) ChangeVarNodesExtended((Node *) otherrel->lateral_vars, relid, subst, 0, replace_relid_callback); + + if (sjinfo != NULL && rti != relid && root->glob->lastPHId != 0) + { + foreach_node(RestrictInfo, rinfo, otherrel->baserestrictinfo) + remove_rel_from_restrictinfo_phvs(rinfo, relid, sjinfo->ojrelid); + + /* + * Join clauses need the same treatment, but there's no value in + * processing any join clause more than once. So it's slightly + * annoying that we have to find them via the per-base-relation + * joininfo lists. Avoid duplicate processing by tracking the + * rinfo_serial numbers of join clauses we've already seen. (This + * doesn't work for is_clone clauses, so we must waste effort on + * them.) + */ + foreach_node(RestrictInfo, rinfo, otherrel->joininfo) + { + if (!rinfo->is_clone) /* else serial number is not unique */ + { + if (bms_is_member(rinfo->rinfo_serial, seen_serials)) + continue; /* saw it already */ + seen_serials = bms_add_member(seen_serials, + rinfo->rinfo_serial); + } + remove_rel_from_restrictinfo_phvs(rinfo, relid, sjinfo->ojrelid); + } + } } } @@ -741,18 +776,41 @@ remove_rel_from_restrictinfo(RestrictInfo *rinfo, int relid, int ojrelid) * Remove any references to relid or sjinfo->ojrelid (if sjinfo != NULL) * from the EquivalenceClass. * - * Like remove_rel_from_restrictinfo, we don't worry about cleaning out - * any nullingrel bits in contained Vars and PHVs. (This might have to be - * improved sometime.) We do need to fix the EC and EM relid sets to ensure - * that implied join equalities will be generated at the appropriate join - * level(s). + * We fix the EC and EM relid sets to ensure that implied join equalities will + * be generated at the appropriate join level(s). We also strip the removed + * rel from PlaceHolderVars embedded in member expressions; a member's + * em_relids reflects ph_eval_at rather than the PHV's phrels, so the latter + * can still mention the removed rel even when em_relids does not. Like + * remove_rel_from_restrictinfo, we don't bother with nullingrel bits in + * contained plain Vars. */ static void -remove_rel_from_eclass(EquivalenceClass *ec, SpecialJoinInfo *sjinfo, +remove_rel_from_eclass(PlannerInfo *root, EquivalenceClass *ec, + SpecialJoinInfo *sjinfo, int relid, int subst) { ListCell *lc; + /* + * Strip the removed rel/join from PlaceHolderVars in member expressions. + * This is needed even when the EC's relids don't mention the removed rel. + * Plain Vars and Consts can't contain a PlaceHolderVar, so skip them. + */ + if (sjinfo != NULL && root->glob->lastPHId != 0) + { + foreach_node(EquivalenceMember, em, ec->ec_members) + { + if (!IsA(em->em_expr, Var) && !IsA(em->em_expr, Const)) + em->em_expr = (Expr *) + remove_rel_from_phvs((Node *) em->em_expr, relid, + sjinfo->ojrelid); + } + } + + if (!bms_is_member(relid, ec->ec_relids) && + (sjinfo == NULL || !bms_is_member(sjinfo->ojrelid, ec->ec_relids))) + return; + /* Fix up the EC's overall relids */ ec->ec_relids = adjust_relid_set(ec->ec_relids, relid, subst); if (sjinfo != NULL) @@ -809,6 +867,116 @@ remove_rel_from_eclass(EquivalenceClass *ec, SpecialJoinInfo *sjinfo, ec_clear_derived_clauses(ec); } +/* + * Remove any references to relid or ojrelid from the PlaceHolderVars embedded + * in a RestrictInfo's clause. + * + * If it's an OR clause, we must also fix up the orclause, which is a parallel + * representation built from its own sub-RestrictInfos. We recurse into the + * sub-clauses for that, mirroring remove_rel_from_restrictinfo. + */ +static void +remove_rel_from_restrictinfo_phvs(RestrictInfo *rinfo, int relid, int ojrelid) +{ + rinfo->clause = (Expr *) + remove_rel_from_phvs((Node *) rinfo->clause, relid, ojrelid); + + /* If it's an OR, recurse to clean up sub-clauses */ + if (restriction_is_or_clause(rinfo)) + { + ListCell *lc; + + Assert(is_orclause(rinfo->orclause)); + foreach(lc, ((BoolExpr *) rinfo->orclause)->args) + { + Node *orarg = (Node *) lfirst(lc); + + /* OR arguments should be ANDs or sub-RestrictInfos */ + if (is_andclause(orarg)) + { + List *andargs = ((BoolExpr *) orarg)->args; + ListCell *lc2; + + foreach(lc2, andargs) + { + RestrictInfo *rinfo2 = lfirst_node(RestrictInfo, lc2); + + remove_rel_from_restrictinfo_phvs(rinfo2, relid, ojrelid); + } + } + else + { + RestrictInfo *rinfo2 = castNode(RestrictInfo, orarg); + + remove_rel_from_restrictinfo_phvs(rinfo2, relid, ojrelid); + } + } + } +} + +/* + * Remove any references to the specified RT index(es) from the phrels (and + * phnullingrels) of every PlaceHolderVar in the given expression. + * + * remove_rel_from_query() fixes up the relid sets of RestrictInfos and + * EquivalenceMembers, but not the PlaceHolderVars embedded in their + * expressions. That's normally fine, but such an expression may later be + * translated for an appendrel child and have its relids recomputed by + * pull_varnos(). A leftover removed relid in phrels would then make + * pull_varnos() reference a nonexistent rel, so we strip it here to match the + * canonical PlaceHolderVar. + */ +static Node * +remove_rel_from_phvs(Node *node, int relid, int ojrelid) +{ + Relids removable = bms_add_member(bms_make_singleton(relid), ojrelid); + + return remove_rel_from_phvs_mutator(node, removable); +} + +static Node * +remove_rel_from_phvs_mutator(Node *node, Relids removable) +{ + if (node == NULL) + return NULL; + if (IsA(node, PlaceHolderVar)) + { + PlaceHolderVar *phv = (PlaceHolderVar *) node; + Relids newphrels; + + /* Upper-level PlaceHolderVars should be long gone at this point */ + Assert(phv->phlevelsup == 0); + + /* Copy the PlaceHolderVar and mutate what's below ... */ + phv = (PlaceHolderVar *) + expression_tree_mutator(node, + remove_rel_from_phvs_mutator, + removable); + + /* + * ... then strip the removed rels from its relid sets. + * + * If stripping would empty phrels, the PHV is evaluated only at the + * removed relation(s); it then belongs to an EquivalenceMember that + * the caller drops immediately afterwards. Leave such a PHV + * untouched rather than build one with empty phrels, which the rest + * of the planner assumes never occurs. + */ + newphrels = bms_difference(phv->phrels, removable); + if (!bms_is_empty(newphrels)) + { + phv->phrels = newphrels; + phv->phnullingrels = bms_difference(phv->phnullingrels, + removable); + } + + return (Node *) phv; + } + return expression_tree_mutator(node, + remove_rel_from_phvs_mutator, + removable); +} + /* * Remove any occurrences of the target relid from a joinlist structure. * diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 55fddf804c4..cf49f8604fa 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -129,26 +129,21 @@ typedef struct } standard_qp_extra; /* - * Context for the find_having_collation_conflicts walker. - * - * ancestor_collids is a stack of inputcollids contributed by collation-aware - * ancestors of the current node. Entries are pushed before recursing into a - * node's children and popped afterwards, so the stack reflects exactly the - * inputcollids on the current root-to-node path. + * Context for find_having_conflicts. This is the callback context passed to + * expression_has_grouping_conflict in clauses.c. */ typedef struct { + Query *parse; Index group_rtindex; - List *ancestor_collids; -} having_collation_ctx; +} having_grouping_ctx; /* Local functions */ static Node *preprocess_expression(PlannerInfo *root, Node *expr, int kind); static void preprocess_qual_conditions(PlannerInfo *root, Node *jtnode); -static Bitmapset *find_having_collation_conflicts(Query *parse, - Index group_rtindex); -static bool having_collation_conflict_walker(Node *node, - having_collation_ctx *ctx); +static Bitmapset *find_having_conflicts(Query *parse, Index group_rtindex); +static Oid having_var_grouping_eqop(Var *var, void *context); +static Oid group_var_eqop(Query *parse, Var *var); static void grouping_planner(PlannerInfo *root, double tuple_fraction, SetOperationStmt *setops); static grouping_sets_data *preprocess_grouping_sets(PlannerInfo *root); @@ -673,7 +668,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse, PlannerInfo *parent_root, PlannerInfo *root; List *newWithCheckOptions; List *newHaving; - Bitmapset *havingCollationConflicts; + Bitmapset *havingPushdownConflicts; int havingIdx; bool hasOuterJoins; bool hasResultRTEs; @@ -1097,25 +1092,14 @@ subquery_planner(PlannerGlobal *glob, Query *parse, PlannerInfo *parent_root, } /* - * Before we flatten GROUP Vars, check which HAVING clauses have collation - * conflicts. When GROUP BY uses a nondeterministic collation, values - * that are "equal" for grouping may be distinguishable under a different - * collation. If such a HAVING clause were moved to WHERE, it would - * filter individual rows before grouping, potentially eliminating some - * members of a group and thereby changing aggregate results. - * - * We do this check before flatten_group_exprs because we can easily - * identify grouping expressions by checking whether a Var references - * RTE_GROUP, and such Vars directly carry the GROUP BY collation as their - * varcollid. After flattening, these Vars are replaced by the underlying - * expressions, and we would have to match expressions in the HAVING - * clause back to grouping expressions, which is much more complex. + * Before we flatten GROUP Vars, identify HAVING clauses whose equality + * semantics disagree with the GROUP BY's. See find_having_conflicts. */ if (parse->hasGroupRTE) - havingCollationConflicts = - find_having_collation_conflicts(parse, root->group_rtindex); + havingPushdownConflicts = find_having_conflicts(parse, + root->group_rtindex); else - havingCollationConflicts = NULL; + havingPushdownConflicts = NULL; /* * Replace any Vars in the subquery's targetlist and havingQual that @@ -1161,13 +1145,13 @@ subquery_planner(PlannerGlobal *glob, Query *parse, PlannerInfo *parent_root, * but it's okay: it's just an optimization to avoid running pull_varnos * when there cannot be any Vars in the HAVING clause.) * - * We also cannot do this if the HAVING clause uses a different collation - * than the GROUP BY for any grouping expression whose GROUP BY collation - * is nondeterministic. This is detected before flatten_group_exprs (see - * find_having_collation_conflicts above) and recorded in the - * havingCollationConflicts bitmapset. The bitmapset indexes remain valid - * here because flatten_group_exprs uses expression_tree_mutator, which - * preserves the list length and ordering of havingQual. + * We also cannot do this for HAVING clauses that conflict with GROUP BY + * on collation or operator family. Both kinds of conflict are detected + * before flatten_group_exprs (see find_having_conflicts above) and + * recorded in the havingPushdownConflicts bitmapset. The bitmapset + * indexes remain valid here because flatten_group_exprs uses + * expression_tree_mutator, which preserves the list length and ordering + * of havingQual. * * Also, it may be that the clause is so expensive to execute that we're * better off doing it only once per group, despite the loss of @@ -1209,7 +1193,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse, PlannerInfo *parent_root, if (contain_agg_clause(havingclause) || contain_volatile_functions(havingclause) || contain_subplans(havingclause) || - bms_is_member(havingIdx, havingCollationConflicts) || + bms_is_member(havingIdx, havingPushdownConflicts) || (parse->groupClause && parse->groupingSets && bms_is_member(root->group_rtindex, pull_varnos(root, havingclause)))) { @@ -1440,192 +1424,99 @@ preprocess_qual_conditions(PlannerInfo *root, Node *jtnode) } /* - * find_having_collation_conflicts - * Identify HAVING clauses that must not be moved to WHERE due to collation - * mismatches with GROUP BY. + * find_having_conflicts + * Identify HAVING clauses that must not be moved to WHERE because they + * apply a different equivalence relation than GROUP BY. Pushing such a + * clause to WHERE would filter individual rows before grouping happens, + * eliminating rows that GROUP BY would have merged into a single group + * and thereby changing aggregate results. + * + * The actual walking is done by expression_has_grouping_conflict; see that + * function for the kinds of conflict it looks for. We just iterate over + * havingQual and supply a HAVING-specific callback that identifies GROUP + * Vars. * * This must be called before flatten_group_exprs, while the HAVING clause * still contains GROUP Vars (Vars referencing RTE_GROUP). These GROUP Vars - * carry the GROUP BY collation as their varcollid. A GROUP Var with a - * nondeterministic varcollid conflicts whenever some collation-aware ancestor - * on its path applies a different inputcollid: that operator would distinguish - * values which the GROUP BY considers equal, so the clause is unsafe to push - * to WHERE. + * carry the GROUP BY collation as their varcollid and let us recover the + * grouping eqop via varattno. After flattening, those Vars are replaced by + * the underlying expressions, and matching back to grouping expressions is + * much harder. * * Returns a Bitmapset of zero-based indexes into the havingQual list for - * clauses that have collation conflicts and must stay in HAVING. + * clauses that conflict and must stay in HAVING. */ static Bitmapset * -find_having_collation_conflicts(Query *parse, Index group_rtindex) +find_having_conflicts(Query *parse, Index group_rtindex) { Bitmapset *result = NULL; - having_collation_ctx ctx; + having_grouping_ctx ctx; int idx; if (parse->havingQual == NULL) return NULL; + ctx.parse = parse; ctx.group_rtindex = group_rtindex; - ctx.ancestor_collids = NIL; idx = 0; foreach_ptr(Node, clause, (List *) parse->havingQual) { - if (having_collation_conflict_walker(clause, &ctx)) + if (expression_has_grouping_conflict(clause, having_var_grouping_eqop, + &ctx)) result = bms_add_member(result, idx); idx++; - Assert(ctx.ancestor_collids == NIL); } return result; } /* - * Walker function for find_having_collation_conflicts. + * having_var_grouping_eqop + * grouping_eqop_callback for find_having_conflicts. * - * Walk the clause top-down, maintaining a stack of inputcollids contributed - * by collation-aware ancestors. At each GROUP Var with a nondeterministic - * varcollid, the clause has a conflict if any ancestor's inputcollid differs - * from the GROUP Var's varcollid. Most collation-aware nodes expose their - * inputcollid through exprInputCollation(). Two structural exceptions need - * special handling: - * - * - RowCompareExpr carries one inputcollid per column in inputcollids[], so we - * descend into its (largs[i], rargs[i]) pairs explicitly with the matching - * collation pushed onto the stack. - * - * - A simple CASE (CaseExpr with a non-NULL arg) holds the arg outside the - * WHEN's OpExpr, even though the WHEN's OpExpr is the place where the - * comparison's inputcollid lives. Parse analysis builds each WHEN as - * "OpExpr(CaseTestExpr op val)" -- the CaseTestExpr is a placeholder for - * the arg. Before walking cexpr->arg we therefore push every WHEN's - * inputcollid onto the ancestor stack, so a GROUP Var at the arg is - * checked against the same collations the WHEN comparisons would apply. - * The WHEN bodies and defresult are then walked under the unchanged stack - * so their own collation contexts are picked up by the default path. + * Returns the GROUP BY equality operator for 'var' if it references the + * query's RTE_GROUP, or InvalidOid otherwise. */ -static bool -having_collation_conflict_walker(Node *node, having_collation_ctx *ctx) +static Oid +having_var_grouping_eqop(Var *var, void *context) { - Oid this_collid; - bool result; + having_grouping_ctx *ctx = (having_grouping_ctx *) context; - if (node == NULL) - return false; - - if (IsA(node, Var)) - { - Var *var = (Var *) node; - - /* We should not see any upper-level Vars here */ - Assert(var->varlevelsup == 0); + if (var->varno != ctx->group_rtindex || var->varlevelsup != 0) + return InvalidOid; - if (var->varno == ctx->group_rtindex && - OidIsValid(var->varcollid) && - !get_collation_isdeterministic(var->varcollid)) - { - foreach_oid(collid, ctx->ancestor_collids) - { - if (collid != var->varcollid) - return true; - } - } - return false; - } - - if (IsA(node, RowCompareExpr)) - { - RowCompareExpr *rcexpr = (RowCompareExpr *) node; - ListCell *lc_l; - ListCell *lc_r; - ListCell *lc_c; - - /* - * Each column of a row comparison is compared under its own - * inputcollids[i]. Walk each (largs[i], rargs[i]) pair with that - * collation pushed, so a Var in column i is checked against the - * collation that actually applies to it. - */ - forthree(lc_l, rcexpr->largs, - lc_r, rcexpr->rargs, - lc_c, rcexpr->inputcollids) - { - Oid collid = lfirst_oid(lc_c); - bool found; - - if (OidIsValid(collid)) - ctx->ancestor_collids = lappend_oid(ctx->ancestor_collids, - collid); - - found = having_collation_conflict_walker((Node *) lfirst(lc_l), - ctx) || - having_collation_conflict_walker((Node *) lfirst(lc_r), - ctx); + return group_var_eqop(ctx->parse, var); +} - if (OidIsValid(collid)) - ctx->ancestor_collids = - list_delete_last(ctx->ancestor_collids); +/* + * group_var_eqop + * Return the equality operator that GROUP BY uses for the given GROUP Var. + * + * A GROUP Var's varattno is its 1-based position in the RTE_GROUP's groupexprs + * list, which addRangeTableEntryForGroup built by iterating parse->groupClause + * and including every SortGroupClause whose TLE was present in the targetlist. + * Replay that traversal here to recover the SortGroupClause for the given + * varattno. + */ +static Oid +group_var_eqop(Query *parse, Var *var) +{ + int counter = 0; - if (found) - return true; - } - return false; - } + Assert(var->varlevelsup == 0); - if (IsA(node, CaseExpr) && ((CaseExpr *) node)->arg != NULL) + foreach_node(SortGroupClause, sgc, parse->groupClause) { - CaseExpr *cexpr = (CaseExpr *) node; - int saved_len = list_length(ctx->ancestor_collids); - bool found; - - /* - * Push every WHEN's inputcollid before walking cexpr->arg, since each - * WHEN implicitly compares the arg under that inputcollid. - */ - foreach_node(CaseWhen, cw, cexpr->args) - { - Oid collid = exprInputCollation((Node *) cw->expr); - - if (OidIsValid(collid)) - ctx->ancestor_collids = lappend_oid(ctx->ancestor_collids, - collid); - } - - found = having_collation_conflict_walker((Node *) cexpr->arg, ctx); - - ctx->ancestor_collids = list_truncate(ctx->ancestor_collids, - saved_len); - - if (found) - return true; - - /* - * Walk the WHEN bodies and defresult under the unchanged ancestor - * stack; any inputcollids inside them are picked up by the default - * path. - */ - foreach_node(CaseWhen, cw, cexpr->args) - { - if (having_collation_conflict_walker((Node *) cw->expr, ctx) || - having_collation_conflict_walker((Node *) cw->result, ctx)) - return true; - } - return having_collation_conflict_walker((Node *) cexpr->defresult, - ctx); + if (get_sortgroupclause_tle(sgc, parse->targetList) == NULL) + continue; + if (++counter == var->varattno) + return sgc->eqop; } - this_collid = exprInputCollation(node); - if (OidIsValid(this_collid)) - ctx->ancestor_collids = lappend_oid(ctx->ancestor_collids, - this_collid); - - result = expression_tree_walker(node, having_collation_conflict_walker, - ctx); - - if (OidIsValid(this_collid)) - ctx->ancestor_collids = list_delete_last(ctx->ancestor_collids); - - return result; + elog(ERROR, "could not find GROUP clause for GROUP Var attno %d", + var->varattno); + return InvalidOid; /* keep compiler quiet */ } /* diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index 0e567890c72..23eace9dbc4 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -837,7 +837,9 @@ hash_ok_operator(OpExpr *expr) if (list_length(expr->args) != 2) return false; if (opid == ARRAY_EQ_OP || - opid == RECORD_EQ_OP) + opid == RECORD_EQ_OP || + opid == RANGE_EQ_OP || + opid == MULTIRANGE_EQ_OP) { /* these are strict, but must check input type to ensure hashable */ Node *leftarg = linitial(expr->args); diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 7bf4e55c7a1..b150a933aad 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -158,13 +158,15 @@ static void reduce_outer_joins_pass2(Node *jtnode, static void report_reduced_full_join(reduce_outer_joins_pass2_state *state2, int rtindex, Relids relids); static Node *remove_useless_results_recurse(PlannerInfo *root, Node *jtnode, + Relids baserels, Node **parent_quals, Relids *dropped_outer_joins); static int get_result_relid(PlannerInfo *root, Node *jtnode); static void remove_result_refs(PlannerInfo *root, int varno, Node *newjtloc); -static bool find_dependent_phvs(PlannerInfo *root, int varno); +static bool find_dependent_phvs(PlannerInfo *root, int varno, Relids baserels); static bool find_dependent_phvs_in_jointree(PlannerInfo *root, - Node *node, int varno); + Node *node, int varno, + Relids baserels); static void substitute_phv_relids(Node *node, int varno, Relids subrelids); static void fix_append_rel_relids(PlannerInfo *root, int varno, @@ -3614,15 +3616,26 @@ report_reduced_full_join(reduce_outer_joins_pass2_state *state2, void remove_useless_result_rtes(PlannerInfo *root) { + Relids baserels = NULL; Relids dropped_outer_joins = NULL; ListCell *cell; + /* + * We'll need the set of baserels in the jointree to perform + * find_dependent_phvs() checks. But if there are no PHVs anywhere in the + * query, those checks are no-ops, so we can skip the work. + */ + if (root->glob->lastPHId != 0) + baserels = get_relids_in_jointree((Node *) root->parse->jointree, + false, false); + /* Top level of jointree must always be a FromExpr */ Assert(IsA(root->parse->jointree, FromExpr)); /* Recurse ... */ root->parse->jointree = (FromExpr *) remove_useless_results_recurse(root, (Node *) root->parse->jointree, + baserels, NULL, &dropped_outer_joins); /* We should still have a FromExpr */ @@ -3683,9 +3696,13 @@ remove_useless_result_rtes(PlannerInfo *root) * the parent's quals list; otherwise, pass NULL for parent_quals. * (Note that in some cases, parent_quals points to the quals of a parent * more than one level up in the tree.) + * + * baserels is the set of base (non-join) RT indexes in the whole jointree; + * it can be NULL if the query contains no PHVs. */ static Node * remove_useless_results_recurse(PlannerInfo *root, Node *jtnode, + Relids baserels, Node **parent_quals, Relids *dropped_outer_joins) { @@ -3716,6 +3733,7 @@ remove_useless_results_recurse(PlannerInfo *root, Node *jtnode, /* Recursively transform child, allowing it to push up quals ... */ child = remove_useless_results_recurse(root, child, + baserels, &f->quals, dropped_outer_joins); /* ... and stick it back into the tree */ @@ -3729,7 +3747,8 @@ remove_useless_results_recurse(PlannerInfo *root, Node *jtnode, */ if (list_length(f->fromlist) > 1 && (varno = get_result_relid(root, child)) != 0 && - !find_dependent_phvs_in_jointree(root, (Node *) f, varno)) + !find_dependent_phvs_in_jointree(root, (Node *) f, varno, + baserels)) { f->fromlist = foreach_delete_current(f->fromlist, cell); result_relids = bms_add_member(result_relids, varno); @@ -3798,12 +3817,14 @@ remove_useless_results_recurse(PlannerInfo *root, Node *jtnode, * quals up, or at least there's no particular reason to. */ j->larg = remove_useless_results_recurse(root, j->larg, + baserels, (j->jointype == JOIN_INNER) ? &j->quals : (j->jointype == JOIN_LEFT) ? parent_quals : NULL, dropped_outer_joins); j->rarg = remove_useless_results_recurse(root, j->rarg, + baserels, (j->jointype == JOIN_INNER || j->jointype == JOIN_LEFT) ? &j->quals : NULL, @@ -3831,7 +3852,8 @@ remove_useless_results_recurse(PlannerInfo *root, Node *jtnode, * allowed to have such refs. */ if ((varno = get_result_relid(root, j->larg)) != 0 && - !find_dependent_phvs_in_jointree(root, j->rarg, varno)) + !find_dependent_phvs_in_jointree(root, j->rarg, varno, + baserels)) { remove_result_refs(root, varno, j->rarg); if (j->quals != NULL && parent_quals == NULL) @@ -3886,7 +3908,7 @@ remove_useless_results_recurse(PlannerInfo *root, Node *jtnode, */ if ((varno = get_result_relid(root, j->rarg)) != 0 && (j->quals == NULL || - !find_dependent_phvs(root, varno))) + !find_dependent_phvs(root, varno, baserels))) { remove_result_refs(root, varno, j->larg); *dropped_outer_joins = bms_add_member(*dropped_outer_joins, @@ -4008,9 +4030,19 @@ remove_result_refs(PlannerInfo *root, int varno, Node *newjtloc) /* - * find_dependent_phvs - are there any PlaceHolderVars whose relids are + * find_dependent_phvs - are there any PlaceHolderVars whose base relids are * exactly the given varno? * + * We ignore outer-join relids present in a PHV's phrels, by intersecting + * with the caller-supplied "baserels" set. This is necessary in part + * because some of the OJ relids may be stale, that is we may have + * already decided to remove those joins in remove_useless_result_rtes + * and not yet have cleaned their relid bits out of upper PHVs. + * But in general, it's the set of baserels that identify possible places + * to evaluate a PHV, and we mustn't let that go to empty. (The caller is + * allowed to pass baserels as NULL if the query contains no PHVs at all, + * since then there is no work to do anyway.) + * * find_dependent_phvs should be used when we want to see if there are * any such PHVs anywhere in the Query. Another use-case is to see if * a subtree of the join tree contains such PHVs; but for that, we have @@ -4020,8 +4052,9 @@ remove_result_refs(PlannerInfo *root, int varno, Node *newjtloc) typedef struct { - Relids relids; - int sublevels_up; + Relids relids; /* target relid, represented as a relid set */ + Relids baserels; /* base RT indexes in query, NULL if no PHVs */ + int sublevels_up; /* current nesting level */ } find_dependent_phvs_context; static bool @@ -4034,9 +4067,16 @@ find_dependent_phvs_walker(Node *node, { PlaceHolderVar *phv = (PlaceHolderVar *) node; - if (phv->phlevelsup == context->sublevels_up && - bms_equal(context->relids, phv->phrels)) - return true; + if (phv->phlevelsup == context->sublevels_up) + { + Relids phbaserels = bms_intersect(phv->phrels, + context->baserels); + bool match = bms_equal(context->relids, phbaserels); + + bms_free(phbaserels); + if (match) + return true; + } /* fall through to examine children */ } if (IsA(node, Query)) @@ -4060,7 +4100,7 @@ find_dependent_phvs_walker(Node *node, } static bool -find_dependent_phvs(PlannerInfo *root, int varno) +find_dependent_phvs(PlannerInfo *root, int varno, Relids baserels) { find_dependent_phvs_context context; @@ -4069,6 +4109,7 @@ find_dependent_phvs(PlannerInfo *root, int varno) return false; context.relids = bms_make_singleton(varno); + context.baserels = baserels; context.sublevels_up = 0; if (query_tree_walker(root->parse, find_dependent_phvs_walker, &context, 0)) @@ -4082,7 +4123,8 @@ find_dependent_phvs(PlannerInfo *root, int varno) } static bool -find_dependent_phvs_in_jointree(PlannerInfo *root, Node *node, int varno) +find_dependent_phvs_in_jointree(PlannerInfo *root, Node *node, int varno, + Relids baserels) { find_dependent_phvs_context context; Relids subrelids; @@ -4093,6 +4135,7 @@ find_dependent_phvs_in_jointree(PlannerInfo *root, Node *node, int varno) return false; context.relids = bms_make_singleton(varno); + context.baserels = baserels; context.sublevels_up = 0; /* diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 8e44e92057d..aa70667c4a5 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -94,6 +94,17 @@ typedef struct List *safe_param_ids; /* PARAM_EXEC Param IDs to treat as safe */ } max_parallel_hazard_context; +/* + * Walker context for expression_has_grouping_conflict. get_eqop is a callback + * that returns the equality operator used for grouping. cb_context is opaque + * to the walker and is forwarded to get_eqop unchanged. + */ +typedef struct +{ + grouping_eqop_callback get_eqop; + void *cb_context; +} grouping_walker_ctx; + static bool contain_agg_clause_walker(Node *node, void *context); static bool find_window_functions_walker(Node *node, WindowFuncLists *lists); static bool contain_subplans_walker(Node *node, void *context); @@ -111,6 +122,11 @@ static Relids find_nonnullable_rels_walker(Node *node, bool top_level); static List *find_nonnullable_vars_walker(Node *node, bool top_level); static bool is_strict_saop(ScalarArrayOpExpr *expr, bool falseOK); static bool convert_saop_to_hashed_saop_walker(Node *node, void *context); +static bool grouping_conflict_walker(Node *node, grouping_walker_ctx *ctx); +static bool grouping_check_operands(Oid opno, Oid inputcollid, + List *args, grouping_walker_ctx *ctx); +static bool grouping_check_operand(Node *arg, Oid opno, Oid inputcollid, + grouping_walker_ctx *ctx); static Node *eval_const_expressions_mutator(Node *node, eval_const_expressions_context *context); static bool contain_non_const_walker(Node *node, void *context); @@ -1009,7 +1025,7 @@ contain_nonstrict_functions_walker(Node *node, void *context) /* an aggregate could return non-null with null input */ return true; } - if (IsA(node, GroupingFunc)) + else if (IsA(node, GroupingFunc)) { /* * A GroupingFunc doesn't evaluate its arguments, and therefore must @@ -1017,12 +1033,12 @@ contain_nonstrict_functions_walker(Node *node, void *context) */ return true; } - if (IsA(node, WindowFunc)) + else if (IsA(node, WindowFunc)) { /* a window function could return non-null with null input */ return true; } - if (IsA(node, SubscriptingRef)) + else if (IsA(node, SubscriptingRef)) { SubscriptingRef *sbsref = (SubscriptingRef *) node; const SubscriptRoutines *sbsroutines; @@ -1036,17 +1052,25 @@ contain_nonstrict_functions_walker(Node *node, void *context) return true; /* else fall through to check args */ } - if (IsA(node, DistinctExpr)) + else if (IsA(node, DistinctExpr)) { /* IS DISTINCT FROM is inherently non-strict */ return true; } - if (IsA(node, NullIfExpr)) + else if (IsA(node, NullIfExpr)) { /* NULLIF is inherently non-strict */ return true; } - if (IsA(node, BoolExpr)) + else if (IsA(node, ScalarArrayOpExpr)) + { + ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) node; + + if (!is_strict_saop(expr, false)) + return true; + /* else fall through to check args */ + } + else if (IsA(node, BoolExpr)) { BoolExpr *expr = (BoolExpr *) node; @@ -1060,28 +1084,26 @@ contain_nonstrict_functions_walker(Node *node, void *context) break; } } - if (IsA(node, SubLink)) + else if (IsA(node, SubLink)) { /* In some cases a sublink might be strict, but in general not */ return true; } - if (IsA(node, SubPlan)) + else if (IsA(node, SubPlan)) return true; - if (IsA(node, AlternativeSubPlan)) + else if (IsA(node, AlternativeSubPlan)) return true; - if (IsA(node, FieldStore)) + else if (IsA(node, FieldStore)) return true; - if (IsA(node, CoerceViaIO)) + else if (IsA(node, CoerceViaIO)) { /* * CoerceViaIO is strict regardless of whether the I/O functions are, - * so just go look at its argument; asking check_functions_in_node is - * useless expense and could deliver the wrong answer. + * so we should skip check_functions_in_node() and just fall through + * to check the arguments. */ - return contain_nonstrict_functions_walker((Node *) ((CoerceViaIO *) node)->arg, - context); } - if (IsA(node, ArrayCoerceExpr)) + else if (IsA(node, ArrayCoerceExpr)) { /* * ArrayCoerceExpr is strict at the array level, regardless of what @@ -1091,31 +1113,33 @@ contain_nonstrict_functions_walker(Node *node, void *context) return contain_nonstrict_functions_walker((Node *) ((ArrayCoerceExpr *) node)->arg, context); } - if (IsA(node, CaseExpr)) + else if (IsA(node, CaseExpr)) return true; - if (IsA(node, ArrayExpr)) + else if (IsA(node, ArrayExpr)) return true; - if (IsA(node, RowExpr)) + else if (IsA(node, RowExpr)) return true; - if (IsA(node, RowCompareExpr)) + else if (IsA(node, RowCompareExpr)) return true; - if (IsA(node, CoalesceExpr)) + else if (IsA(node, CoalesceExpr)) return true; - if (IsA(node, MinMaxExpr)) + else if (IsA(node, MinMaxExpr)) return true; - if (IsA(node, XmlExpr)) + else if (IsA(node, XmlExpr)) return true; - if (IsA(node, NullTest)) + else if (IsA(node, NullTest)) return true; - if (IsA(node, BooleanTest)) + else if (IsA(node, BooleanTest)) return true; - if (IsA(node, JsonConstructorExpr)) - return true; - - /* Check other function-containing nodes */ - if (check_functions_in_node(node, contain_nonstrict_functions_checker, - context)) + else if (IsA(node, JsonConstructorExpr)) return true; + else + { + /* Check other function-containing nodes */ + if (check_functions_in_node(node, contain_nonstrict_functions_checker, + context)) + return true; + } return expression_tree_walker(node, contain_nonstrict_functions_walker, context); @@ -1511,7 +1535,7 @@ find_nonnullable_rels_walker(Node *node, bool top_level) { ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) node; - if (is_strict_saop(expr, true)) + if (is_strict_saop(expr, top_level)) result = find_nonnullable_rels_walker((Node *) expr->args, false); } else if (IsA(node, BoolExpr)) @@ -1764,7 +1788,7 @@ find_nonnullable_vars_walker(Node *node, bool top_level) { ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) node; - if (is_strict_saop(expr, true)) + if (is_strict_saop(expr, top_level)) result = find_nonnullable_vars_walker((Node *) expr->args, false); } else if (IsA(node, BoolExpr)) @@ -2299,7 +2323,8 @@ convert_saop_to_hashed_saop_walker(Node *node, void *context) if (IsA(node, ScalarArrayOpExpr)) { ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) node; - Expr *arrayarg = (Expr *) lsecond(saop->args); + Node *leftarg = (Node *) linitial(saop->args); + Node *arrayarg = (Node *) lsecond(saop->args); Oid lefthashfunc; Oid righthashfunc; @@ -2308,7 +2333,8 @@ convert_saop_to_hashed_saop_walker(Node *node, void *context) { if (saop->useOr) { - if (get_op_hash_functions(saop->opno, &lefthashfunc, &righthashfunc) && + if (get_op_hash_functions_ext(saop->opno, exprType(leftarg), + &lefthashfunc, &righthashfunc) && lefthashfunc == righthashfunc) { Datum arrdatum = ((Const *) arrayarg)->constvalue; @@ -2340,7 +2366,8 @@ convert_saop_to_hashed_saop_walker(Node *node, void *context) * just ensure the lookup items are not in the hash table. */ if (OidIsValid(negator) && - get_op_hash_functions(negator, &lefthashfunc, &righthashfunc) && + get_op_hash_functions_ext(negator, exprType(leftarg), + &lefthashfunc, &righthashfunc) && lefthashfunc == righthashfunc) { Datum arrdatum = ((Const *) arrayarg)->constvalue; @@ -4386,7 +4413,7 @@ recheck_cast_function_args(List *args, Oid result_type, { Form_pg_proc funcform = (Form_pg_proc) GETSTRUCT(func_tuple); int nargs; - Oid actual_arg_types[FUNC_MAX_ARGS]; + Oid actual_arg_types[FUNC_MAX_ARGS] = {0}; Oid declared_arg_types[FUNC_MAX_ARGS]; Oid rettype; ListCell *lc; @@ -5441,6 +5468,258 @@ pull_paramids_walker(Node *node, Bitmapset **context) return expression_tree_walker(node, pull_paramids_walker, context); } +/* + * expression_has_grouping_conflict + * Detect whether 'expr' would distinguish rows that a grouping mechanism + * (GROUP BY, DISTINCT, DISTINCT ON, window PARTITION BY, or set operation) + * considers equal. + * + * The caller supplies a get_eqop callback (see clauses.h) so the same walker + * serves every grouping context. The callback identifies a grouping column by + * returning a valid eqop for its Var. A grouping column is safe to reference + * only if the reference yields the same result for every value the grouping + * treats as equal. Otherwise, pushing the clause past the grouping could + * discard rows that the grouping would have combined into a single group. + * + * The reference is provably safe only when the grouping column is a direct + * operand of a comparison that tests the grouping's own equality. Such an + * operand is rejected when the comparison's operator does not have equality + * semantics compatible with the grouping eqop, or, for a nondeterministic + * collation, when the comparison applies a collation other than the column's. + * + * For a nondeterministic collation, every other reference is rejected: a + * comparison under a different collation, and any function or operator over + * the column, because we cannot tell whether the function yields the same + * result for values the grouping treats as equal, and many do not. A column + * with a deterministic collation is not restricted this way. + * + * This leaves one case uncaught: with a deterministic collation, a function + * over the column can still feed a finer comparison than the direct-operand + * check sees, for example record_image_ops over a rebuilt record, or scale() + * over numeric where two equal values differ in scale. Catching it would + * require knowing that a type's equality is bitwise, which we do not test + * here. + * + * Returns true if any such conflict exists. + */ +bool +expression_has_grouping_conflict(Node *expr, + grouping_eqop_callback get_eqop, + void *context) +{ + grouping_walker_ctx ctx; + + if (expr == NULL) + return false; + + ctx.get_eqop = get_eqop; + ctx.cb_context = context; + + return grouping_conflict_walker(expr, &ctx); +} + +/* + * Walker function for expression_has_grouping_conflict. + * + * A comparison node checks its direct operands with grouping_check_operand, + * which does not recurse into a grouping-column operand. A grouping column + * therefore reaches the Var branch only when it is referenced in some other + * way: wrapped in a function or other expression, used as the whole qual (a + * bare boolean column), or used as an operand of an operator that is not a + * btree/hash member and so is not treated as a comparison here. + * + * Comparison nodes are OpExpr/ScalarArrayOpExpr whose operator is a btree/hash + * member, and RowCompareExpr (one operator and collation per column). A + * simple CASE (CaseExpr with a non-NULL arg) is a comparison in disguise: + * parse analysis builds each WHEN as "OpExpr(CaseTestExpr op val)", with the + * CaseTestExpr standing in for the arg, so the arg is effectively an operand + * of each WHEN's comparison. Those WHEN operators are always the type-default + * "=", matching the grouping eqop, so only a collation conflict is possible + * there. + */ +static bool +grouping_conflict_walker(Node *node, grouping_walker_ctx *ctx) +{ + if (node == NULL) + return false; + + if (IsA(node, Var)) + { + Var *var = (Var *) node; + + /* + * A grouping column reaches here when it was not handled as a direct + * operand by a comparison node above (see the function header). That + * is safe for a deterministic collation, but not for a + * nondeterministic one, where the reference may distinguish values + * the grouping considers equal. A bare boolean qual is safe too: + * boolean is not collatable, so it takes the deterministic path here. + */ + if (OidIsValid(ctx->get_eqop(var, ctx->cb_context)) && + OidIsValid(var->varcollid) && + !get_collation_isdeterministic(var->varcollid)) + return true; + return false; + } + else if (IsA(node, OpExpr)) + { + OpExpr *opexpr = (OpExpr *) node; + + if (op_is_safe_index_member(opexpr->opno)) + return grouping_check_operands(opexpr->opno, opexpr->inputcollid, + opexpr->args, ctx); + /* fall through */ + } + else if (IsA(node, ScalarArrayOpExpr)) + { + ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) node; + + if (op_is_safe_index_member(saop->opno)) + return grouping_check_operands(saop->opno, saop->inputcollid, + saop->args, ctx); + /* fall through */ + } + else if (IsA(node, RowCompareExpr)) + { + RowCompareExpr *rcexpr = (RowCompareExpr *) node; + ListCell *lc_l; + ListCell *lc_r; + ListCell *lc_o; + ListCell *lc_c; + + /* Each column is compared under its own operator and inputcollid. */ + forfour(lc_l, rcexpr->largs, + lc_r, rcexpr->rargs, + lc_o, rcexpr->opnos, + lc_c, rcexpr->inputcollids) + { + Oid opno = lfirst_oid(lc_o); + Oid collid = lfirst_oid(lc_c); + + if (grouping_check_operand((Node *) lfirst(lc_l), opno, collid, ctx) || + grouping_check_operand((Node *) lfirst(lc_r), opno, collid, ctx)) + return true; + } + return false; + } + else if (IsA(node, CaseExpr) && ((CaseExpr *) node)->arg != NULL) + { + CaseExpr *cexpr = (CaseExpr *) node; + Node *arg = (Node *) cexpr->arg; + + /* Look through RelabelType to find a direct Var arg. */ + while (arg && IsA(arg, RelabelType)) + arg = (Node *) ((RelabelType *) arg)->arg; + + if (arg && IsA(arg, Var)) + { + Var *var = (Var *) arg; + + /* + * The arg is a grouping column compared by every WHEN. For a + * nondeterministic collation, reject if any WHEN applies a + * different collation. + */ + if (OidIsValid(ctx->get_eqop(var, ctx->cb_context)) && + OidIsValid(var->varcollid) && + !get_collation_isdeterministic(var->varcollid)) + { + foreach_node(CaseWhen, cw, cexpr->args) + { + Oid collid = exprInputCollation((Node *) cw->expr); + + if (OidIsValid(collid) && collid != var->varcollid) + return true; + } + } + } + else if (grouping_conflict_walker((Node *) cexpr->arg, ctx)) + { + /* arg is a complex expression; walked as a non-operand */ + return true; + } + + /* + * Walk the WHEN conditions, their results, and the default result as + * non-operands. The WHEN conditions hold a CaseTestExpr in place of + * the arg, so they contribute no grouping operand of their own, but + * the condition expression or the substitution result may reference + * another grouping column. + */ + foreach_node(CaseWhen, cw, cexpr->args) + { + if (grouping_conflict_walker((Node *) cw->expr, ctx) || + grouping_conflict_walker((Node *) cw->result, ctx)) + return true; + } + return grouping_conflict_walker((Node *) cexpr->defresult, ctx); + } + + return expression_tree_walker(node, grouping_conflict_walker, ctx); +} + +/* + * grouping_check_operands + * Check every argument of a comparison node as a direct operand of the + * comparison's operator 'opno' and collation 'inputcollid'. + */ +static bool +grouping_check_operands(Oid opno, Oid inputcollid, List *args, + grouping_walker_ctx *ctx) +{ + ListCell *lc; + + foreach(lc, args) + { + if (grouping_check_operand((Node *) lfirst(lc), opno, inputcollid, ctx)) + return true; + } + return false; +} + +/* + * grouping_check_operand + * Handle one operand 'arg' of a comparison with operator 'opno' and + * collation 'inputcollid'. + * + * If 'arg' is a grouping column (after looking through RelabelType), verify + * that comparison's operator has equality semantics compatible with the + * grouping eqop and, for a nondeterministic collation, that it uses the same + * collation; such a direct operand is then fully handled and is not recursed + * into. Any other operand is walked normally, so a grouping column buried + * inside it is seen as a non-operand reference. + */ +static bool +grouping_check_operand(Node *arg, Oid opno, Oid inputcollid, + grouping_walker_ctx *ctx) +{ + Node *node = arg; + + while (node && IsA(node, RelabelType)) + node = (Node *) ((RelabelType *) node)->arg; + + if (node && IsA(node, Var)) + { + Var *var = (Var *) node; + Oid grouping_eqop = ctx->get_eqop(var, ctx->cb_context); + + if (OidIsValid(grouping_eqop)) + { + /* incompatible equality semantics */ + if (!equality_ops_are_compatible(opno, grouping_eqop)) + return true; + /* nondeterministic collation compared under a different collation */ + if (OidIsValid(var->varcollid) && + !get_collation_isdeterministic(var->varcollid) && + inputcollid != var->varcollid) + return true; + } + return false; /* direct operand handled; do not recurse */ + } + + return grouping_conflict_walker(arg, ctx); +} + /* * Build ScalarArrayOpExpr on top of 'exprs.' 'haveNonConst' indicates * whether at least one of the expressions is not Const. When it's false, diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index 4163d9a5930..9ba2690b3db 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -2054,7 +2054,23 @@ get_aggregate_argtypes(Aggref *aggref, Oid *inputTypes) int numArguments = 0; ListCell *lc; - Assert(list_length(aggref->aggargtypes) <= FUNC_MAX_ARGS); + /* + * Check the number of arguments to protect fixed-size arrays in callers. + * + * Aggregates can have at most FUNC_MAX_ARGS-1 args (compare + * AggregateCreate, whose error message we want to match). Ordinarily + * this would have been checked while creating the Aggref, but it's + * possible that we are looking at a parsetree from a stored view that was + * made by a server executable with a different value of FUNC_MAX_ARGS, or + * an executable in which parse_func.c didn't enforce the correct limit. + */ + if (list_length(aggref->aggargtypes) > FUNC_MAX_ARGS - 1) + ereport(ERROR, + (errcode(ERRCODE_TOO_MANY_ARGUMENTS), + errmsg_plural("aggregates cannot have more than %d argument", + "aggregates cannot have more than %d arguments", + FUNC_MAX_ARGS - 1, + FUNC_MAX_ARGS - 1))); foreach(lc, aggref->aggargtypes) { diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 0b5b81c7f27..19d7aeff75f 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -572,6 +572,10 @@ can_coerce_type(int nargs, const Oid *input_typeids, const Oid *target_typeids, if (inputTypeId == targetTypeId) continue; + /* reject all cases of casting something else to/from "internal" */ + if (inputTypeId == INTERNALOID || targetTypeId == INTERNALOID) + return false; + /* accept if target is ANY */ if (targetTypeId == ANYOID) continue; @@ -1034,13 +1038,12 @@ coerce_record_to_complex(ParseState *pstate, Node *node, else if (node && IsA(node, Var) && ((Var *) node)->varattno == InvalidAttrNumber) { - int rtindex = ((Var *) node)->varno; - int sublevels_up = ((Var *) node)->varlevelsup; - int vlocation = ((Var *) node)->location; + Var *var = (Var *) node; ParseNamespaceItem *nsitem; - nsitem = GetNSItemByRangeTablePosn(pstate, rtindex, sublevels_up); - args = expandNSItemVars(pstate, nsitem, sublevels_up, vlocation, NULL); + nsitem = GetNSItemByVar(pstate, var); + args = expandNSItemVars(pstate, nsitem, var->varlevelsup, + var->location, NULL); } else ereport(ERROR, @@ -3169,6 +3172,10 @@ find_coercion_pathway(Oid targetTypeId, Oid sourceTypeId, if (sourceTypeId == targetTypeId) return COERCION_PATH_RELABELTYPE; + /* Reject all cases of casting something else to/from "internal" */ + if (sourceTypeId == INTERNALOID || targetTypeId == INTERNALOID) + return COERCION_PATH_NONE; + /* Look in pg_cast */ tuple = SearchSysCache2(CASTSOURCETARGET, ObjectIdGetDatum(sourceTypeId), diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index b6d30ddc298..cf872ce79b5 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -4088,10 +4088,20 @@ transformJsonParseArg(ParseState *pstate, Node *jsexpr, JsonFormat *format, if (*exprtype == UNKNOWNOID || typcategory == TYPCATEGORY_STRING) { + int location = exprLocation(expr); + expr = coerce_to_target_type(pstate, (Node *) expr, *exprtype, TEXTOID, -1, COERCION_IMPLICIT, COERCE_IMPLICIT_CAST, -1); + if (expr == NULL) + ereport(ERROR, + errcode(ERRCODE_CANNOT_COERCE), + errmsg("cannot cast type %s to %s", + format_type_be(*exprtype), + format_type_be(TEXTOID)), + parser_errposition(pstate, location)); + *exprtype = TEXTOID; } @@ -4809,8 +4819,17 @@ transformJsonBehavior(ParseState *pstate, JsonExpr *jsexpr, * * For other non-NULL expressions, try to find a cast and error out if one * is not found. + * + * The DEFAULT expression's base type may already match the RETURNING type + * yet still need coercion: when the RETURNING type carries a type + * modifier (e.g. numeric(4,1)), the cast below is what enforces it, so + * skipping it here would let the DEFAULT yield a value that violates its + * declared RETURNING type. A NULL constant needs no such enforcement. */ - if (expr && exprType(expr) != returning->typid) + if (expr && + (exprType(expr) != returning->typid || + (returning->typmod >= 0 && + !(IsA(expr, Const) && ((Const *) expr)->constisnull)))) { bool isnull = (IsA(expr, Const) && ((Const *) expr)->constisnull); diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index 583bbbf232f..a7074c9e2e6 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -672,6 +672,32 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, rettype, false); + /* + * Reject any attempt to call a function that takes or returns type + * internal from SQL. (The FUNCDETAIL_COERCION case does not reach this + * check because of the early return above, but that's okay because we + * disallow coercions to or from type internal.) Note that we are + * checking the resolved argument and result types, so this will reject + * calls to polymorphic functions that pass internal-type arguments. The + * casting rules should prevent that anyway, since we won't cast internal + * to any polymorphic type, but no harm in being doubly sure. + */ + for (int i = 0; i < nargsplusdefs; i++) + { + if (declared_arg_types[i] == INTERNALOID) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("functions accepting type \"%s\" cannot be called explicitly", + "internal"), + parser_errposition(pstate, location))); + } + if (rettype == INTERNALOID) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("functions returning type \"%s\" cannot be called explicitly", + "internal"), + parser_errposition(pstate, location))); + /* perform the necessary typecasting of arguments */ make_fn_arguments(pstate, fargs, actual_arg_types, declared_arg_types); @@ -781,6 +807,22 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, aggref->aggtransno = -1; aggref->location = location; + /* + * The argument-count limit for aggregates is one less than for other + * kinds of functions (cf. AggregateCreate). Now that we know it's an + * aggregate, apply the stricter limit. We need an explicit check + * because hypothetical-set aggregates don't have a fixed number of + * arguments, so having matched the pg_proc entry proves nothing. + */ + if (list_length(fargs) > FUNC_MAX_ARGS - 1) + ereport(ERROR, + (errcode(ERRCODE_TOO_MANY_ARGUMENTS), + errmsg_plural("aggregates cannot have more than %d argument", + "aggregates cannot have more than %d arguments", + FUNC_MAX_ARGS - 1, + FUNC_MAX_ARGS - 1), + parser_errposition(pstate, location))); + /* * Reject attempt to call a parameterless aggregate without (*) * syntax. This is mere pedantry but some folks insisted ... @@ -846,6 +888,19 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, errmsg("DISTINCT is not implemented for window functions"), parser_errposition(pstate, location))); + /* + * As above, enforce the correct argument-count limit if it's really + * an aggregate. + */ + if (wfunc->winagg && list_length(fargs) > FUNC_MAX_ARGS - 1) + ereport(ERROR, + (errcode(ERRCODE_TOO_MANY_ARGUMENTS), + errmsg_plural("aggregates cannot have more than %d argument", + "aggregates cannot have more than %d arguments", + FUNC_MAX_ARGS - 1, + FUNC_MAX_ARGS - 1), + parser_errposition(pstate, location))); + /* * Reject attempt to call a parameterless aggregate without (*) * syntax. This is mere pedantry but some folks insisted ... @@ -1930,9 +1985,7 @@ ParseComplexProjection(ParseState *pstate, const char *funcname, Node *first_arg { ParseNamespaceItem *nsitem; - nsitem = GetNSItemByRangeTablePosn(pstate, - ((Var *) first_arg)->varno, - ((Var *) first_arg)->varlevelsup); + nsitem = GetNSItemByVar(pstate, (Var *) first_arg); /* Return a Var if funcname matches a column, else NULL */ return scanNSItemForColumn(pstate, nsitem, ((Var *) first_arg)->varlevelsup, diff --git a/src/backend/parser/parse_oper.c b/src/backend/parser/parse_oper.c index 0c4337563cf..44c715a5a4f 100644 --- a/src/backend/parser/parse_oper.c +++ b/src/backend/parser/parse_oper.c @@ -736,6 +736,28 @@ make_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree, opform->oprresult, false); + /* + * Reject any attempt to call a function that takes or returns type + * internal from SQL. This is just like the check in ParseFuncOrColumn, + * but for operator syntax. (Despite that, we say "function" in the error + * messages; doesn't seem worth having two sets of translatable strings.) + */ + for (int i = 0; i < nargs; i++) + { + if (declared_arg_types[i] == INTERNALOID) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("functions accepting type \"%s\" cannot be called explicitly", + "internal"), + parser_errposition(pstate, location))); + } + if (rettype == INTERNALOID) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("functions returning type \"%s\" cannot be called explicitly", + "internal"), + parser_errposition(pstate, location))); + /* perform the necessary typecasting of arguments */ make_fn_arguments(pstate, args, actual_arg_types, declared_arg_types); diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 04ecf64b1fc..b59df7dcdf3 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -513,6 +513,9 @@ check_lateral_ref_ok(ParseState *pstate, ParseNamespaceItem *nsitem, /* * Given an RT index and nesting depth, find the corresponding * ParseNamespaceItem (there must be one). + * + * NB: Callers starting from a Var should consider using GetNSItemByVar() + * instead, to find the namespace item with matching varreturningtype. */ ParseNamespaceItem * GetNSItemByRangeTablePosn(ParseState *pstate, @@ -537,6 +540,35 @@ GetNSItemByRangeTablePosn(ParseState *pstate, return NULL; /* keep compiler quiet */ } +/* + * Given a Var, find the corresponding ParseNamespaceItem (there must be one). + * + * Like GetNSItemByRangeTablePosn(), but uses the Var's varreturningtype in + * addition to its varno and varlevelsup to find the namespace item. + */ +ParseNamespaceItem * +GetNSItemByVar(ParseState *pstate, Var *var) +{ + int sublevels_up = var->varlevelsup; + ListCell *lc; + + while (sublevels_up-- > 0) + { + pstate = pstate->parentParseState; + Assert(pstate != NULL); + } + foreach(lc, pstate->p_namespace) + { + ParseNamespaceItem *nsitem = (ParseNamespaceItem *) lfirst(lc); + + if (nsitem->p_rtindex == var->varno && + nsitem->p_returning_type == var->varreturningtype) + return nsitem; + } + elog(ERROR, "nsitem not found (internal error)"); + return NULL; /* keep compiler quiet */ +} + /* * Given an RT index and nesting depth, find the corresponding RTE. * (Note that the RTE need not be in the query's namespace.) diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index 4aba0d9d4d5..336cf66f224 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -1446,7 +1446,7 @@ ExpandRowReference(ParseState *pstate, Node *expr, Var *var = (Var *) expr; ParseNamespaceItem *nsitem; - nsitem = GetNSItemByRangeTablePosn(pstate, var->varno, var->varlevelsup); + nsitem = GetNSItemByVar(pstate, var); return ExpandSingleTable(pstate, nsitem, var->varlevelsup, var->location, make_target_entry); } diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index bddda2543d1..cacb1379e97 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -1486,6 +1486,16 @@ expandTableLikeClause(RangeVar *heapRel, TableLikeClause *table_like_clause) ccname, RelationGetRelationName(relation)))); + /* + * Copying a CHECK constraint adds new references. Since the + * constraint arrives pre-cooked, it bypasses the checks in + * AddRelationNewConstraints(), so we must check for USAGE on + * types here. + */ + CheckUsageOnTypesInSingleRelExpr(stringToNode(ccbin), + RelationGetRelid(relation), + GetUserId()); + n = makeNode(Constraint); n->contype = CONSTR_CHECK; n->conname = pstrdup(ccname); diff --git a/src/backend/partitioning/partbounds.c b/src/backend/partitioning/partbounds.c index 4bdc2941efb..a0a1363d5be 100644 --- a/src/backend/partitioning/partbounds.c +++ b/src/backend/partitioning/partbounds.c @@ -4868,6 +4868,12 @@ satisfies_hash_partition(PG_FUNCTION_ARGS) fcinfo->flinfo->fn_mcxt); } } + else if (PG_ARGISNULL(3)) + { + /* Special case for VARIADIC NULL::sometype[] */ + relation_close(parent, NoLock); + PG_RETURN_BOOL(false); + } else { ArrayType *variadic_array = PG_GETARG_ARRAYTYPE_P(3); @@ -4938,12 +4944,18 @@ satisfies_hash_partition(PG_FUNCTION_ARGS) } else { - ArrayType *variadic_array = PG_GETARG_ARRAYTYPE_P(3); + ArrayType *variadic_array; int i; int nelems; Datum *datum; bool *isnull; + /* Special case for VARIADIC NULL::sometype[] */ + if (PG_ARGISNULL(3)) + PG_RETURN_BOOL(false); + + variadic_array = PG_GETARG_ARRAYTYPE_P(3); + deconstruct_array(variadic_array, my_extra->variadic_type, my_extra->variadic_typlen, diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c index 2ef98d6ad6e..5dae151da0f 100644 --- a/src/backend/partitioning/partprune.c +++ b/src/backend/partitioning/partprune.c @@ -3032,15 +3032,9 @@ get_matching_range_bounds(PartitionPruneContext *context, */ if (nvalues == 0) { - /* ignore key space not covered by any partitions */ - if (partindices[minoff] < 0) - minoff++; - if (partindices[maxoff] < 0) - maxoff--; - result->scan_default = partition_bound_has_default(boundinfo); - Assert(partindices[minoff] >= 0 && - partindices[maxoff] >= 0); + Assert(partindices[minoff] >= -1 && + partindices[maxoff] >= -1); result->bound_offsets = bms_add_range(NULL, minoff, maxoff); return result; diff --git a/src/backend/po/de.po b/src/backend/po/de.po index 05941cd212a..ecc5a463113 100644 --- a/src/backend/po/de.po +++ b/src/backend/po/de.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-05 12:03+0000\n" -"PO-Revision-Date: 2026-05-06 16:05+0200\n" +"POT-Creation-Date: 2026-08-08 06:11+0000\n" +"PO-Revision-Date: 2026-08-08 10:01+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -89,14 +89,14 @@ msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" #: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 #: access/transam/timeline.c:143 access/transam/timeline.c:362 #: access/transam/twophase.c:1354 access/transam/xlog.c:3478 -#: access/transam/xlog.c:4369 access/transam/xlogrecovery.c:1257 -#: access/transam/xlogrecovery.c:1355 access/transam/xlogrecovery.c:1392 -#: access/transam/xlogrecovery.c:1459 backup/basebackup.c:2128 +#: access/transam/xlog.c:4369 access/transam/xlogrecovery.c:1266 +#: access/transam/xlogrecovery.c:1364 access/transam/xlogrecovery.c:1401 +#: access/transam/xlogrecovery.c:1468 backup/basebackup.c:2126 #: backup/walsummary.c:283 commands/extension.c:3970 libpq/hba.c:769 #: replication/logical/origin.c:768 replication/logical/origin.c:804 -#: replication/logical/reorderbuffer.c:5366 -#: replication/logical/snapbuild.c:1951 replication/slot.c:2546 -#: replication/slot.c:2587 replication/walsender.c:643 +#: replication/logical/reorderbuffer.c:5390 +#: replication/logical/snapbuild.c:1951 replication/slot.c:2548 +#: replication/slot.c:2589 replication/walsender.c:643 #: storage/file/buffile.c:470 storage/file/copydir.c:201 #: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format @@ -106,8 +106,8 @@ msgstr "konnte Datei »%s« nicht lesen: %m" #: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 #: access/transam/xlog.c:3483 access/transam/xlog.c:4374 #: replication/logical/origin.c:773 replication/logical/origin.c:812 -#: replication/logical/snapbuild.c:1956 replication/slot.c:2550 -#: replication/slot.c:2591 replication/walsender.c:648 +#: replication/logical/snapbuild.c:1956 replication/slot.c:2552 +#: replication/slot.c:2593 replication/walsender.c:648 #: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" @@ -124,9 +124,9 @@ msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" #: access/transam/xlog.c:5311 commands/copyfrom.c:1929 commands/copyto.c:598 #: libpq/be-fsstubs.c:475 libpq/be-fsstubs.c:545 #: replication/logical/origin.c:706 replication/logical/origin.c:845 -#: replication/logical/reorderbuffer.c:5418 +#: replication/logical/reorderbuffer.c:5442 #: replication/logical/snapbuild.c:1696 replication/logical/snapbuild.c:1822 -#: replication/slot.c:2432 replication/slot.c:2598 replication/walsender.c:658 +#: replication/slot.c:2434 replication/slot.c:2600 replication/walsender.c:658 #: storage/file/copydir.c:224 storage/file/copydir.c:229 #: storage/file/copydir.c:284 storage/file/copydir.c:289 storage/file/fd.c:828 #: storage/file/fd.c:3818 storage/file/fd.c:3924 utils/cache/relmapper.c:841 @@ -161,16 +161,16 @@ msgstr "" #: access/transam/twophase.c:1310 access/transam/xlog.c:3214 #: access/transam/xlog.c:3394 access/transam/xlog.c:3433 #: access/transam/xlog.c:3626 access/transam/xlog.c:4359 -#: access/transam/xlogrecovery.c:4307 access/transam/xlogrecovery.c:4408 -#: access/transam/xlogutils.c:825 backup/basebackup.c:549 -#: backup/basebackup.c:1600 backup/walsummary.c:220 libpq/hba.c:626 -#: postmaster/syslogger.c:1512 replication/logical/origin.c:758 -#: replication/logical/reorderbuffer.c:4019 -#: replication/logical/reorderbuffer.c:4573 -#: replication/logical/reorderbuffer.c:5346 +#: access/transam/xlogrecovery.c:4318 access/transam/xlogrecovery.c:4419 +#: access/transam/xlogutils.c:849 backup/basebackup.c:549 +#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:626 +#: postmaster/syslogger.c:1512 postmaster/walsummarizer.c:1617 +#: replication/logical/origin.c:758 replication/logical/reorderbuffer.c:4043 +#: replication/logical/reorderbuffer.c:4597 +#: replication/logical/reorderbuffer.c:5370 #: replication/logical/snapbuild.c:1651 replication/logical/snapbuild.c:1763 -#: replication/slot.c:2518 replication/walsender.c:616 -#: replication/walsender.c:3103 storage/file/copydir.c:167 +#: replication/slot.c:2520 replication/walsender.c:616 +#: replication/walsender.c:3125 storage/file/copydir.c:167 #: storage/file/copydir.c:255 storage/file/fd.c:803 storage/file/fd.c:3575 #: storage/file/fd.c:3805 storage/file/fd.c:3895 storage/smgr/md.c:686 #: utils/cache/relmapper.c:818 utils/cache/relmapper.c:935 @@ -183,7 +183,7 @@ msgstr "konnte Datei »%s« nicht öffnen: %m" #: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 #: access/transam/twophase.c:1757 access/transam/twophase.c:1766 -#: access/transam/xlog.c:9340 access/transam/xlogfuncs.c:699 +#: access/transam/xlog.c:9342 access/transam/xlogfuncs.c:699 #: backup/basebackup_server.c:173 backup/basebackup_server.c:266 #: backup/walsummary.c:304 postmaster/postmaster.c:4087 #: postmaster/syslogger.c:1523 postmaster/syslogger.c:1536 @@ -198,10 +198,10 @@ msgstr "konnte Datei »%s« nicht schreiben: %m" #: access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 #: access/transam/timeline.c:506 access/transam/twophase.c:1778 #: access/transam/xlog.c:3314 access/transam/xlog.c:3512 -#: access/transam/xlog.c:4332 access/transam/xlog.c:8726 -#: access/transam/xlog.c:8770 backup/basebackup_server.c:207 +#: access/transam/xlog.c:4332 access/transam/xlog.c:8728 +#: access/transam/xlog.c:8772 backup/basebackup_server.c:207 #: commands/dbcommands.c:515 replication/logical/snapbuild.c:1689 -#: replication/slot.c:2416 replication/slot.c:2528 storage/file/fd.c:820 +#: replication/slot.c:2418 replication/slot.c:2530 storage/file/fd.c:820 #: storage/file/fd.c:3916 storage/smgr/md.c:1469 storage/smgr/md.c:1529 #: storage/sync/sync.c:446 utils/misc/guc.c:4527 #, c-format @@ -214,20 +214,20 @@ msgstr "konnte Datei »%s« nicht fsyncen: %m" #: ../common/hmac_openssl.c:151 ../common/hmac_openssl.c:339 #: ../common/jsonapi.c:2459 ../common/md5_common.c:156 #: ../common/parse_manifest.c:157 ../common/parse_manifest.c:852 -#: ../common/psprintf.c:140 ../common/scram-common.c:268 ../port/path.c:829 -#: ../port/path.c:866 ../port/path.c:883 access/transam/twophase.c:1419 -#: access/transam/xlogrecovery.c:571 lib/dshash.c:253 libpq/auth.c:1353 +#: ../common/psprintf.c:140 ../common/scram-common.c:268 ../port/path.c:846 +#: ../port/path.c:883 ../port/path.c:900 access/transam/twophase.c:1419 +#: access/transam/xlogrecovery.c:580 lib/dshash.c:253 libpq/auth.c:1353 #: libpq/auth.c:1397 libpq/auth.c:1959 libpq/be-secure-gssapi.c:537 #: libpq/be-secure-gssapi.c:717 postmaster/bgworker.c:355 #: postmaster/bgworker.c:1023 postmaster/postmaster.c:3557 -#: postmaster/walsummarizer.c:939 +#: postmaster/walsummarizer.c:1038 #: replication/libpqwalreceiver/libpqwalreceiver.c:364 #: replication/logical/logical.c:212 replication/walsender.c:825 -#: storage/buffer/localbuf.c:745 storage/file/fd.c:912 storage/file/fd.c:1447 +#: storage/buffer/localbuf.c:753 storage/file/fd.c:912 storage/file/fd.c:1447 #: storage/file/fd.c:1608 storage/file/fd.c:2592 storage/ipc/procarray.c:1465 #: storage/ipc/procarray.c:2217 storage/ipc/procarray.c:2224 #: storage/ipc/procarray.c:2727 storage/ipc/procarray.c:3436 -#: utils/activity/pgstat_shmem.c:535 utils/adt/pg_locale.c:517 +#: utils/activity/pgstat_shmem.c:538 utils/adt/pg_locale.c:517 #: utils/adt/pg_locale.c:591 utils/adt/pg_locale_icu.c:358 #: utils/adt/pg_locale_libc.c:207 utils/adt/pg_locale_libc.c:302 #: utils/adt/pg_locale_libc.c:390 utils/fmgr/dfmgr.c:234 @@ -237,7 +237,7 @@ msgstr "konnte Datei »%s« nicht fsyncen: %m" #: utils/misc/guc.c:672 utils/misc/guc.c:1060 utils/misc/guc.c:4505 #: utils/misc/tzparser.c:479 utils/mmgr/aset.c:451 utils/mmgr/bump.c:183 #: utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 utils/mmgr/dsa.c:810 -#: utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1162 utils/mmgr/slab.c:370 +#: utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1165 utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -301,20 +301,30 @@ msgstr "Befehl »%s« gab keine Daten zurück" 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:142 ../port/path.c:831 ../port/path.c:868 -#: ../port/path.c:885 utils/misc/ps_status.c:195 utils/misc/ps_status.c:203 +#: ../common/fe_memutils.c:41 ../common/fe_memutils.c:81 +#: ../common/fe_memutils.c:104 ../common/fe_memutils.c:167 +#: ../common/psprintf.c:142 ../port/path.c:848 ../port/path.c:885 +#: ../port/path.c:902 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 "Speicher aufgebraucht\n" -#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 +#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../common/file_utils.c:75 storage/file/fd.c:3581 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -357,8 +367,8 @@ msgstr "konnte Verzeichnis »%s« nicht lesen: %m" #: ../common/file_utils.c:520 access/transam/xlogarchive.c:389 #: postmaster/pgarch.c:836 postmaster/syslogger.c:1560 -#: replication/logical/snapbuild.c:1708 replication/slot.c:1027 -#: replication/slot.c:2299 replication/slot.c:2448 storage/file/fd.c:838 +#: replication/logical/snapbuild.c:1708 replication/slot.c:1029 +#: replication/slot.c:2301 replication/slot.c:2450 storage/file/fd.c:838 #: utils/time/snapmgr.c:1273 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -582,7 +592,7 @@ msgstr "konnte Dateinamen nicht dekodieren" msgid "file size is not an integer" msgstr "Dateigröße ist keine ganze Zahl" -#: ../common/parse_manifest.c:699 backup/basebackup.c:872 +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "unbekannter Prüfsummenalgorithmus: »%s«" @@ -651,7 +661,7 @@ msgstr "konnte Backup-Manifest nicht parsen: %s" #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 -#: tcop/backend_startup.c:769 utils/misc/guc.c:3164 utils/misc/guc.c:3205 +#: tcop/backend_startup.c:788 utils/misc/guc.c:3164 utils/misc/guc.c:3205 #: utils/misc/guc.c:3280 utils/misc/guc.c:4709 utils/misc/guc.c:6940 #: utils/misc/guc.c:6981 #, c-format @@ -717,9 +727,9 @@ msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" #: access/transam/twophase.c:1717 access/transam/xlogarchive.c:119 #: access/transam/xlogarchive.c:399 backup/walsummary.c:254 #: postmaster/postmaster.c:1070 postmaster/syslogger.c:1489 -#: replication/logical/origin.c:614 replication/logical/reorderbuffer.c:4841 +#: replication/logical/origin.c:614 replication/logical/reorderbuffer.c:4865 #: replication/logical/snapbuild.c:1589 replication/logical/snapbuild.c:2045 -#: replication/slot.c:2502 storage/file/fd.c:878 storage/file/fd.c:3443 +#: replication/slot.c:2504 storage/file/fd.c:878 storage/file/fd.c:3443 #: storage/file/fd.c:3505 storage/file/reinit.c:261 storage/ipc/dsm.c:343 #: storage/smgr/md.c:401 storage/smgr/md.c:460 storage/sync/sync.c:243 #: utils/time/snapmgr.c:1609 @@ -864,7 +874,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:853 +#: ../port/path.c:870 #, c-format msgid "could not get current working directory: %m\n" msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %m\n" @@ -899,8 +909,8 @@ msgstr "Aufforderung für BRIN-Range-Summarization für Index »%s« Seite %u wu #: access/transam/xlogfuncs.c:242 access/transam/xlogfuncs.c:281 #: access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:323 #: access/transam/xlogfuncs.c:389 access/transam/xlogfuncs.c:447 -#: statistics/attribute_stats.c:191 statistics/attribute_stats.c:936 -#: statistics/relation_stats.c:97 +#: statistics/attribute_stats.c:191 statistics/attribute_stats.c:962 +#: statistics/relation_stats.c:99 #, c-format msgid "recovery is in progress" msgstr "Wiederherstellung läuft" @@ -1193,7 +1203,7 @@ msgstr "konnte Tupel mit Index »%s« nicht erneut finden" #: access/gin/gininsert.c:1310 access/gin/ginutil.c:152 #: executor/execExpr.c:2244 utils/adt/array_userfuncs.c:1972 -#: utils/adt/arrayfuncs.c:4034 utils/adt/arrayfuncs.c:6732 +#: utils/adt/arrayfuncs.c:4034 utils/adt/arrayfuncs.c:6739 #: utils/adt/rowtypes.c:974 utils/sort/tuplesortvariants.c:646 #, c-format msgid "could not identify a comparison function for type %s" @@ -1290,11 +1300,11 @@ msgstr "konnte die für das Zeichenketten-Hashing zu verwendende Sortierfolge ni #: access/hash/hashfunc.c:281 access/hash/hashfunc.c:336 catalog/heap.c:702 #: catalog/heap.c:708 commands/createas.c:203 commands/createas.c:515 -#: commands/indexcmds.c:2092 commands/tablecmds.c:19999 commands/view.c:80 -#: regex/regc_pg_locale.c:242 utils/adt/formatting.c:1657 -#: utils/adt/formatting.c:1721 utils/adt/formatting.c:1785 -#: utils/adt/formatting.c:1849 utils/adt/like.c:163 utils/adt/like.c:194 -#: utils/adt/like_support.c:1020 utils/adt/varchar.c:738 +#: commands/indexcmds.c:2092 commands/tablecmds.c:19998 commands/view.c:80 +#: regex/regc_pg_locale.c:242 utils/adt/formatting.c:1658 +#: utils/adt/formatting.c:1722 utils/adt/formatting.c:1786 +#: utils/adt/formatting.c:1850 utils/adt/like.c:163 utils/adt/like.c:194 +#: utils/adt/like_support.c:1032 utils/adt/varchar.c:738 #: utils/adt/varchar.c:1001 utils/adt/varchar.c:1057 utils/adt/varlena.c:1648 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." @@ -1346,39 +1356,39 @@ msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlt Support-Funktion msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlen typübergreifende Operatoren" -#: access/heap/heapam.c:2283 +#: access/heap/heapam.c:2310 #, 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:2806 +#: access/heap/heapam.c:2862 #, 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:2853 +#: access/heap/heapam.c:2909 #, c-format msgid "attempted to delete invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu löschen" -#: access/heap/heapam.c:3303 access/index/genam.c:829 +#: access/heap/heapam.c:3387 access/index/genam.c:829 #, 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:3480 +#: access/heap/heapam.c:3564 #, c-format msgid "attempted to update invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu aktualisieren" -#: access/heap/heapam.c:4993 access/heap/heapam.c:5031 -#: access/heap/heapam.c:5298 access/heap/heapam_handler.c:470 +#: access/heap/heapam.c:5196 access/heap/heapam.c:5234 +#: access/heap/heapam.c:5524 access/heap/heapam_handler.c:470 #, 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:6425 commands/trigger.c:3401 -#: executor/nodeModifyTable.c:2568 executor/nodeModifyTable.c:2658 +#: access/heap/heapam.c:6678 commands/trigger.c:3401 +#: executor/nodeModifyTable.c:2587 executor/nodeModifyTable.c:2677 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "das zu aktualisierende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" @@ -1401,12 +1411,12 @@ msgstr "konnte nicht in Datei »%s« schreiben, %d von %d geschrieben: %m" #: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 #: access/transam/timeline.c:329 access/transam/timeline.c:481 #: access/transam/xlog.c:3239 access/transam/xlog.c:3447 -#: access/transam/xlog.c:4311 access/transam/xlog.c:9329 +#: access/transam/xlog.c:4311 access/transam/xlog.c:9331 #: access/transam/xlogfuncs.c:693 backup/basebackup_server.c:149 #: backup/basebackup_server.c:242 commands/dbcommands.c:495 #: postmaster/launch_backend.c:354 postmaster/postmaster.c:4074 -#: postmaster/walsummarizer.c:1216 replication/logical/origin.c:626 -#: replication/slot.c:2360 storage/file/copydir.c:173 +#: postmaster/walsummarizer.c:1315 replication/logical/origin.c:626 +#: replication/slot.c:2362 storage/file/copydir.c:173 #: storage/file/copydir.c:261 storage/smgr/md.c:252 utils/time/snapmgr.c:1252 #, c-format msgid "could not create file \"%s\": %m" @@ -1419,12 +1429,12 @@ msgstr "konnte Datei »%s« nicht auf %u kürzen: %m" #: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:498 -#: access/transam/xlog.c:3300 access/transam/xlog.c:3503 +#: access/transam/xlog.c:3292 access/transam/xlog.c:3503 #: access/transam/xlog.c:4323 commands/dbcommands.c:507 #: postmaster/launch_backend.c:365 postmaster/launch_backend.c:377 #: replication/logical/origin.c:638 replication/logical/origin.c:680 #: replication/logical/origin.c:699 replication/logical/snapbuild.c:1665 -#: replication/slot.c:2396 storage/file/buffile.c:545 +#: replication/slot.c:2398 storage/file/buffile.c:545 #: storage/file/copydir.c:213 utils/init/miscinit.c:1661 #: utils/init/miscinit.c:1672 utils/init/miscinit.c:1680 utils/misc/guc.c:4488 #: utils/misc/guc.c:4519 utils/misc/guc.c:5678 utils/misc/guc.c:5696 @@ -1569,27 +1579,27 @@ msgstr "WAL-Benutzung: % Einträge, % Full Page Images, % dead item identifiers in %u pages" msgstr "Tabelle »%s«: % tote Item-Bezeichner in %u Seiten entfernt" -#: access/heap/vacuumlazy.c:2982 +#: access/heap/vacuumlazy.c:3006 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" msgstr "umgehe nicht essentielle Wartung der Tabelle »%s.%s.%s« als Ausfallsicherung nach %d Index-Scans" -#: access/heap/vacuumlazy.c:2985 +#: access/heap/vacuumlazy.c:3009 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "relfrozenxid oder relminmxid der Tabelle ist zu weit in der Vergangenheit." -#: access/heap/vacuumlazy.c:2986 +#: access/heap/vacuumlazy.c:3010 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1598,67 +1608,67 @@ msgstr "" "Erhöhen Sie eventuell die Konfigurationsparameter »maintenance_work_mem« oder »autovacuum_work_mem«.\n" "Sie müssen möglicherweise auch andere Wege in Betracht ziehen, wie VACUUM mit der Benutzung von Transaktions-IDs mithalten kann." -#: access/heap/vacuumlazy.c:3248 +#: access/heap/vacuumlazy.c:3272 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "»%s«: Truncate wird gestoppt wegen Sperrkonflikt" -#: access/heap/vacuumlazy.c:3318 +#: access/heap/vacuumlazy.c:3342 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "Tabelle »%s«: von %u auf %u Seiten verkürzt" -#: access/heap/vacuumlazy.c:3380 +#: access/heap/vacuumlazy.c:3404 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "Tabelle »%s«: Truncate wird ausgesetzt wegen Sperrkonflikt" -#: access/heap/vacuumlazy.c:3499 +#: access/heap/vacuumlazy.c:3523 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "Paralleloption für Vacuum von »%s« wird deaktiviert --- Vacuum in temporären Tabellen kann nicht parallel ausgeführt werden" -#: access/heap/vacuumlazy.c:3768 +#: access/heap/vacuumlazy.c:3792 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "beim Scannen von Block %u Offset %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3771 +#: access/heap/vacuumlazy.c:3795 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "beim Scannen von Block %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3775 +#: access/heap/vacuumlazy.c:3799 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "beim Scannen von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3783 +#: access/heap/vacuumlazy.c:3807 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "beim Vacuum von Block %u Offset %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3786 +#: access/heap/vacuumlazy.c:3810 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "beim Vacuum von Block %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3790 +#: access/heap/vacuumlazy.c:3814 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "beim Vacuum von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3795 commands/vacuumparallel.c:1126 +#: access/heap/vacuumlazy.c:3819 commands/vacuumparallel.c:1126 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "beim Vacuum von Index »%s« von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3800 commands/vacuumparallel.c:1132 +#: access/heap/vacuumlazy.c:3824 commands/vacuumparallel.c:1132 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "beim Säubern von Index »%s« von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3806 +#: access/heap/vacuumlazy.c:3830 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "beim Trunkieren von Relation »%s.%s« auf %u Blöcke" @@ -1685,7 +1695,7 @@ msgstr "auf Index »%s« kann nicht zugegriffen werden, während er reindiziert #: access/index/indexam.c:203 catalog/objectaddress.c:1361 #: commands/indexcmds.c:3018 commands/tablecmds.c:284 commands/tablecmds.c:308 -#: commands/tablecmds.c:19678 commands/tablecmds.c:21620 +#: commands/tablecmds.c:19677 commands/tablecmds.c:21619 #, c-format msgid "\"%s\" is not an index" msgstr "»%s« ist kein Index" @@ -1791,7 +1801,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:113 access/transam/xlogrecovery.c:4912 +#: access/table/tableamapi.c:113 access/transam/xlogrecovery.c:4923 #, c-format msgid "\"%s\" is too long (maximum %d characters)." msgstr "»%s« ist zu lang (maximal %d Zeichen)." @@ -1838,14 +1848,13 @@ msgstr "Datenbank nimmt keine Befehle an, die neue MultiXactIds zuweisen, um Dat #: access/transam/multixact.c:1268 access/transam/multixact.c:1275 #: access/transam/multixact.c:1299 access/transam/multixact.c:1308 -#: access/transam/varsup.c:158 access/transam/varsup.c:165 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" -"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +"You might also need to commit or roll back old prepared transactions." msgstr "" "Führen Sie ein datenbankweites VACUUM in dieser Datenbank aus.\n" -"Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." +"Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen." #: access/transam/multixact.c:1273 #, c-format @@ -1914,10 +1923,10 @@ msgstr "MultiXact %u hat ungültiges nächstes Offset" #, c-format msgid "" "To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" -"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +"You might also need to commit or roll back old prepared transactions." msgstr "" "Um Scheitern von MultiXactId-Zuweisungen zu vermeiden, führen Sie ein komplettes VACUUM über diese Datenbank aus.\n" -"Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." +"Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen." #: access/transam/multixact.c:2947 #, c-format @@ -2137,7 +2146,7 @@ msgstr "ungültige Daten in History-Datei »%s«" msgid "Timeline IDs must be less than child timeline's ID." msgstr "Zeitleisten-IDs müssen kleiner als die Zeitleisten-ID des Kindes sein." -#: access/transam/timeline.c:589 +#: access/transam/timeline.c:589 postmaster/walsummarizer.c:930 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "angeforderte Zeitleiste %u ist nicht in der History dieses Servers" @@ -2239,8 +2248,8 @@ msgstr "ungültige Größe in Datei »%s« gespeichert" msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in Datei »%s« überein" -#: access/transam/twophase.c:1420 access/transam/xlogrecovery.c:572 -#: postmaster/walsummarizer.c:940 replication/logical/logical.c:213 +#: access/transam/twophase.c:1420 access/transam/xlogrecovery.c:581 +#: postmaster/walsummarizer.c:1039 replication/logical/logical.c:213 #: replication/walsender.c:826 #, c-format msgid "Failed while allocating a WAL reading processor." @@ -2328,6 +2337,15 @@ msgstr "konnte nicht auf Datei »%s« zugreifen: %m" msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database \"%s\"" msgstr "Datenbank nimmt keine Befehle an, die neue Transaktions-IDs zuweisen, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank »%s« zu vermeiden" +#: access/transam/varsup.c:158 access/transam/varsup.c:165 +#, c-format +msgid "" +"Execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"Führen Sie ein datenbankweites VACUUM in dieser Datenbank aus.\n" +"Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." + #: access/transam/varsup.c:163 #, c-format msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database with OID %u" @@ -2491,13 +2509,13 @@ msgstr "kann nicht hinter das Ende des erzeugten WAL lesen: Anforderung %X/%X, a msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." msgstr "Die WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein." -#: access/transam/xlog.c:2454 +#: access/transam/xlog.c:2451 #, c-format msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" msgstr "konnte nicht in Logdatei »%s« bei Position %u, Länge %zu schreiben: %m" -#: access/transam/xlog.c:3740 access/transam/xlogutils.c:820 -#: replication/walsender.c:3097 +#: access/transam/xlog.c:3740 access/transam/xlogutils.c:844 +#: postmaster/walsummarizer.c:1631 replication/walsender.c:3119 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "das angeforderte WAL-Segment %s wurde schon entfernt" @@ -2616,7 +2634,7 @@ msgstr "»%s« muss mindestens zweimal so groß wie »%s« sein" #: access/transam/xlog.c:4725 catalog/namespace.c:4699 #: commands/tablespace.c:1210 commands/user.c:2531 commands/variable.c:72 -#: replication/slot.c:2768 tcop/postgres.c:3630 utils/error/elog.c:2257 +#: replication/slot.c:2770 tcop/postgres.c:3630 utils/error/elog.c:2257 #, c-format msgid "List syntax is invalid." msgstr "Die Listensyntax ist ungültig." @@ -2732,160 +2750,160 @@ msgstr "gewählte neue Zeitleisten-ID: %u" msgid "archive recovery complete" msgstr "Wiederherstellung aus Archiv abgeschlossen" -#: access/transam/xlog.c:6653 +#: access/transam/xlog.c:6655 #, c-format msgid "shutting down" msgstr "fahre herunter" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6692 +#: access/transam/xlog.c:6694 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "Restart-Punkt beginnt:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6704 +#: access/transam/xlog.c:6706 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "Checkpoint beginnt:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6769 +#: access/transam/xlog.c:6771 #, c-format msgid "restartpoint complete: wrote %d buffers (%.1f%%), wrote %d SLRU buffers; %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "Restart-Punkt komplett: %d Puffer geschrieben (%.1f%%), %d SLRU-Puffer geschrieben; %d WAL-Datei(en) hinzugefügt, %d entfernt, %d wiederverwendet; Schreiben=%ld,%03d s, Sync=%ld,%03d s, gesamt=%ld,%03d s; sync. Dateien=%d, längste=%ld,%03d s, Durchschnitt=%ld.%03d s; Entfernung=%d kB, Schätzung=%d kB; LSN=%X/%X, Redo-LSN=%X/%X" -#: access/transam/xlog.c:6793 +#: access/transam/xlog.c:6795 #, c-format msgid "checkpoint complete: wrote %d buffers (%.1f%%), wrote %d SLRU buffers; %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "Checkpoint komplett: %d Puffer geschrieben (%.1f%%), %d SLRU-Puffer geschrieben; %d WAL-Datei(en) hinzugefügt, %d entfernt, %d wiederverwendet; Schreiben=%ld,%03d s, Sync=%ld,%03d s, gesamt=%ld,%03d s; sync. Dateien=%d, längste=%ld,%03d s, Durchschnitt=%ld.%03d s; Entfernung=%d kB, Schätzung=%d kB; LSN=%X/%X, Redo-LSN=%X/%X" -#: access/transam/xlog.c:7279 +#: access/transam/xlog.c:7281 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "gleichzeitige Write-Ahead-Log-Aktivität während das Datenbanksystem herunterfährt" -#: access/transam/xlog.c:7871 +#: access/transam/xlog.c:7873 #, c-format msgid "recovery restart point at %X/%X" msgstr "Recovery-Restart-Punkt bei %X/%X" -#: access/transam/xlog.c:7873 +#: access/transam/xlog.c:7875 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Die letzte vollständige Transaktion war bei Logzeit %s." -#: access/transam/xlog.c:8137 +#: access/transam/xlog.c:8139 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "Restore-Punkt »%s« erzeugt bei %X/%X" -#: access/transam/xlog.c:8344 +#: access/transam/xlog.c:8346 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "Online-Sicherung wurde storniert, Wiederherstellung kann nicht fortgesetzt werden" -#: access/transam/xlog.c:8402 +#: access/transam/xlog.c:8404 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Shutdown-Checkpoint-Datensatz" -#: access/transam/xlog.c:8468 +#: access/transam/xlog.c:8470 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Online-Checkpoint-Datensatz" -#: access/transam/xlog.c:8505 +#: access/transam/xlog.c:8507 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im End-of-Recovery-Datensatz" -#: access/transam/xlog.c:8775 +#: access/transam/xlog.c:8777 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "konnte Write-Through-Logdatei »%s« nicht fsyncen: %m" -#: access/transam/xlog.c:8780 +#: access/transam/xlog.c:8782 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fdatasyncen: %m" -#: access/transam/xlog.c:8857 access/transam/xlog.c:9193 +#: access/transam/xlog.c:8859 access/transam/xlog.c:9195 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "WAL-Level nicht ausreichend, um Online-Sicherung durchzuführen" -#: access/transam/xlog.c:8858 access/transam/xlog.c:9194 +#: access/transam/xlog.c:8860 access/transam/xlog.c:9196 #: access/transam/xlogfuncs.c:249 #, c-format msgid "\"wal_level\" must be set to \"replica\" or \"logical\" at server start." msgstr "»wal_level« muss beim Serverstart auf »replica« oder »logical« gesetzt werden." -#: access/transam/xlog.c:8863 +#: access/transam/xlog.c:8865 #, c-format msgid "backup label too long (max %d bytes)" msgstr "Backup-Label zu lang (maximal %d Bytes)" -#: access/transam/xlog.c:8984 +#: access/transam/xlog.c:8986 #, c-format msgid "WAL generated with \"full_page_writes=off\" was replayed since last restartpoint" msgstr "mit »full_page_writes=off« erzeugtes WAL wurde seit dem letzten Restart-Punkt zurückgespielt" -#: access/transam/xlog.c:8986 access/transam/xlog.c:9282 +#: access/transam/xlog.c:8988 access/transam/xlog.c:9284 #, c-format msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, and then try an online backup again." msgstr "Das bedeutet, dass die aktuelle Datensicherung auf dem Standby-Server verfälscht ist und nicht verwendet werden sollte. Schalten Sie auf dem Primärserver »full_page_writes« ein, führen Sie dort CHECKPOINT aus und versuchen Sie dann die Online-Sicherung erneut." -#: access/transam/xlog.c:9066 backup/basebackup.c:1419 utils/adt/misc.c:354 +#: access/transam/xlog.c:9068 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" -#: access/transam/xlog.c:9073 backup/basebackup.c:1424 utils/adt/misc.c:359 +#: access/transam/xlog.c:9075 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang" -#: access/transam/xlog.c:9232 backup/basebackup.c:1283 +#: access/transam/xlog.c:9234 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "der Standby-Server wurde während der Online-Sicherung zum Primärserver befördert" -#: access/transam/xlog.c:9233 backup/basebackup.c:1284 +#: access/transam/xlog.c:9235 backup/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "Das bedeutet, dass die aktuelle Online-Sicherung verfälscht ist und nicht verwendet werden sollte. Versuchen Sie, eine neue Online-Sicherung durchzuführen." -#: access/transam/xlog.c:9280 +#: access/transam/xlog.c:9282 #, c-format msgid "WAL generated with \"full_page_writes=off\" was replayed during online backup" msgstr "mit »full_page_writes=off« erzeugtes WAL wurde während der Online-Sicherung zurückgespielt" -#: access/transam/xlog.c:9396 +#: access/transam/xlog.c:9398 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "Basissicherung beendet, warte bis die benötigten WAL-Segmente archiviert sind" -#: access/transam/xlog.c:9410 +#: access/transam/xlog.c:9412 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "warte immer noch, bis alle benötigten WAL-Segmente archiviert sind (%d Sekunden abgelaufen)" -#: access/transam/xlog.c:9412 +#: access/transam/xlog.c:9414 #, c-format msgid "Check that your \"archive_command\" is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." msgstr "Prüfen Sie, ob das »archive_command« korrekt ausgeführt wird. Dieser Sicherungsvorgang kann gefahrlos abgebrochen werden, aber die Datenbanksicherung wird ohne die fehlenden WAL-Segmente nicht benutzbar sein." -#: access/transam/xlog.c:9419 +#: access/transam/xlog.c:9421 #, c-format msgid "all required WAL segments have been archived" msgstr "alle benötigten WAL-Segmente wurden archiviert" -#: access/transam/xlog.c:9423 +#: access/transam/xlog.c:9425 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "WAL-Archivierung ist nicht eingeschaltet; Sie müssen dafür sorgen, dass alle benötigten WAL-Segmente auf andere Art kopiert werden, um die Sicherung abzuschließen" -#: access/transam/xlog.c:9462 +#: access/transam/xlog.c:9464 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "Backup wird abgebrochen, weil Backend-Prozess beendete, bevor pg_backup_stop aufgerufen wurde" @@ -2928,7 +2946,7 @@ msgstr "konnte Archivstatusdatei »%s« nicht erstellen: %m" msgid "could not write archive status file \"%s\": %m" msgstr "konnte Archivstatusdatei »%s« nicht schreiben: %m" -#: access/transam/xlogfuncs.c:70 backup/basebackup.c:999 +#: access/transam/xlogfuncs.c:70 backup/basebackup.c:997 #, c-format msgid "a backup is already in progress in this session" msgstr "ein Backup läuft bereits in dieser Sitzung" @@ -3107,97 +3125,97 @@ msgstr "unerwartete Pageaddr %X/%X in WAL-Segment %s, LSN %X/%X, Offset %u" msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogreader.c:1769 +#: access/transam/xlogreader.c:1771 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u außer der Reihe bei %X/%X" -#: access/transam/xlogreader.c:1793 +#: access/transam/xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" -#: access/transam/xlogreader.c:1800 +#: access/transam/xlogreader.c:1802 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" -#: access/transam/xlogreader.c:1836 +#: access/transam/xlogreader.c:1838 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" -#: access/transam/xlogreader.c:1852 +#: access/transam/xlogreader.c:1854 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" -#: access/transam/xlogreader.c:1866 +#: access/transam/xlogreader.c:1868 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" -#: access/transam/xlogreader.c:1881 +#: access/transam/xlogreader.c:1883 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" -#: access/transam/xlogreader.c:1897 +#: access/transam/xlogreader.c:1899 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" -#: access/transam/xlogreader.c:1909 +#: access/transam/xlogreader.c:1911 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: access/transam/xlogreader.c:1976 +#: access/transam/xlogreader.c:1978 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: access/transam/xlogreader.c:2002 +#: access/transam/xlogreader.c:2004 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden" -#: access/transam/xlogreader.c:2086 +#: access/transam/xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen" -#: access/transam/xlogreader.c:2093 +#: access/transam/xlogreader.c:2095 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d" -#: access/transam/xlogreader.c:2120 access/transam/xlogreader.c:2137 +#: access/transam/xlogreader.c:2122 access/transam/xlogreader.c:2139 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d" -#: access/transam/xlogreader.c:2146 +#: access/transam/xlogreader.c:2148 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d" -#: access/transam/xlogreader.c:2154 +#: access/transam/xlogreader.c:2156 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" -#: access/transam/xlogrecovery.c:624 +#: access/transam/xlogrecovery.c:633 #, c-format msgid "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u" msgstr "starte Wiederherstellung aus Backup mit Redo-LSN %X/%X, Checkpoint-LSN %X/%X, auf Zeitleisten-ID %u" -#: access/transam/xlogrecovery.c:656 +#: access/transam/xlogrecovery.c:665 #, c-format msgid "could not find redo location %X/%X referenced by checkpoint record at %X/%X" msgstr "konnte die Redo-Position %X/%X, die vom Checkpoint-Datensatz bei %X/%X referenziert wird, nicht finden" -#: access/transam/xlogrecovery.c:658 access/transam/xlogrecovery.c:669 +#: access/transam/xlogrecovery.c:667 access/transam/xlogrecovery.c:678 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n" @@ -3208,488 +3226,488 @@ msgstr "" "Wenn Sie gerade kein Backup wiederherstellen, dann versuchen Sie, die Datei »%s/backup_label« zu entfernen.\n" "Vorsicht: Wenn ein Backup wiederhergestellt wird und »%s/backup_label« gelöscht wird, dann wird das den Cluster verfälschen." -#: access/transam/xlogrecovery.c:667 +#: access/transam/xlogrecovery.c:676 #, c-format msgid "could not locate required checkpoint record at %X/%X" msgstr "konnte den nötigen Checkpoint-Datensatz bei %X/%X nicht finden" -#: access/transam/xlogrecovery.c:697 commands/tablespace.c:664 +#: access/transam/xlogrecovery.c:706 commands/tablespace.c:664 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: access/transam/xlogrecovery.c:730 access/transam/xlogrecovery.c:736 +#: access/transam/xlogrecovery.c:739 access/transam/xlogrecovery.c:745 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "ignoriere Datei »%s«, weil keine Datei »%s« existiert" -#: access/transam/xlogrecovery.c:732 +#: access/transam/xlogrecovery.c:741 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Datei »%s« wurde in »%s« umbenannt." -#: access/transam/xlogrecovery.c:738 +#: access/transam/xlogrecovery.c:747 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Konnte Datei »%s« nicht in »%s« umbenennen: %m." -#: access/transam/xlogrecovery.c:777 +#: access/transam/xlogrecovery.c:786 #, c-format msgid "restarting backup recovery with redo LSN %X/%X" msgstr "starte Wiederherstellung aus Backup neu mit Redo-LSN %X/%X" -#: access/transam/xlogrecovery.c:802 +#: access/transam/xlogrecovery.c:811 #, c-format msgid "could not locate a valid checkpoint record at %X/%X" msgstr "konnte keinen gültigen Checkpoint-Datensatz bei %X/%X finden" -#: access/transam/xlogrecovery.c:814 +#: access/transam/xlogrecovery.c:823 #, c-format msgid "could not find redo location %X/%08X referenced by checkpoint record at %X/%08X" msgstr "konnte die Redo-Position %X/%08X, die vom Checkpoint-Datensatz bei %X/%08X referenziert wird, nicht finden" -#: access/transam/xlogrecovery.c:823 +#: access/transam/xlogrecovery.c:832 #, c-format msgid "entering standby mode" msgstr "Standby-Modus eingeschaltet" -#: access/transam/xlogrecovery.c:826 +#: access/transam/xlogrecovery.c:835 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "starte Point-in-Time-Recovery bis XID %u" -#: access/transam/xlogrecovery.c:830 +#: access/transam/xlogrecovery.c:839 #, c-format msgid "starting point-in-time recovery to %s" msgstr "starte Point-in-Time-Recovery bis %s" -#: access/transam/xlogrecovery.c:834 +#: access/transam/xlogrecovery.c:843 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "starte Point-in-Time-Recovery bis »%s«" -#: access/transam/xlogrecovery.c:838 +#: access/transam/xlogrecovery.c:847 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "starte Point-in-Time-Recovery bis WAL-Position (LSN) »%X/%X«" -#: access/transam/xlogrecovery.c:842 +#: access/transam/xlogrecovery.c:851 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "starte Point-in-Time-Recovery bis zum frühesten konsistenten Punkt" -#: access/transam/xlogrecovery.c:845 +#: access/transam/xlogrecovery.c:854 #, c-format msgid "starting archive recovery" msgstr "starte Wiederherstellung aus Archiv" -#: access/transam/xlogrecovery.c:866 +#: access/transam/xlogrecovery.c:875 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "angeforderte Zeitleiste %u ist kein Kind der History dieses Servers" #. translator: %s is a backup_label file or a pg_control file -#: access/transam/xlogrecovery.c:869 +#: access/transam/xlogrecovery.c:878 #, c-format msgid "Latest checkpoint in file \"%s\" is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." msgstr "Neuester Checkpoint in Datei »%s« ist bei %X/%X auf Zeitleiste %u, aber in der History der angeforderten Zeitleiste zweigte der Server von dieser Zeitleiste bei %X/%X ab." -#: access/transam/xlogrecovery.c:884 +#: access/transam/xlogrecovery.c:893 #, c-format msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" msgstr "angeforderte Zeitleiste %u enthält nicht den minimalen Wiederherstellungspunkt %X/%X auf Zeitleiste %u" -#: access/transam/xlogrecovery.c:912 +#: access/transam/xlogrecovery.c:921 #, c-format msgid "invalid next transaction ID" msgstr "ungültige nächste Transaktions-ID" -#: access/transam/xlogrecovery.c:917 +#: access/transam/xlogrecovery.c:926 #, c-format msgid "invalid redo in checkpoint record" msgstr "ungültiges Redo im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:928 +#: access/transam/xlogrecovery.c:937 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "ungültiger Redo-Datensatz im Shutdown-Checkpoint" -#: access/transam/xlogrecovery.c:957 +#: access/transam/xlogrecovery.c:966 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "Datenbanksystem wurde nicht richtig heruntergefahren; automatische Wiederherstellung läuft" -#: access/transam/xlogrecovery.c:961 +#: access/transam/xlogrecovery.c:970 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "Wiederherstellung nach Absturz beginnt in Zeitleiste %u und hat Zielzeitleiste %u" -#: access/transam/xlogrecovery.c:1004 +#: access/transam/xlogrecovery.c:1013 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "Daten in backup_label stimmen nicht mit Kontrolldatei überein" -#: access/transam/xlogrecovery.c:1005 +#: access/transam/xlogrecovery.c:1014 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "Das bedeutet, dass die Datensicherung verfälscht ist und Sie eine andere Datensicherung zur Wiederherstellung verwenden werden müssen." -#: access/transam/xlogrecovery.c:1059 +#: access/transam/xlogrecovery.c:1068 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "Verwendung von Recovery-Befehlsdatei »%s« wird nicht unterstützt" -#: access/transam/xlogrecovery.c:1124 +#: access/transam/xlogrecovery.c:1133 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "Standby-Modus wird von Servern im Einzelbenutzermodus nicht unterstützt" -#: access/transam/xlogrecovery.c:1141 +#: access/transam/xlogrecovery.c:1150 #, c-format msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" msgstr "weder »primary_conninfo« noch »restore_command« angegeben" -#: access/transam/xlogrecovery.c:1142 +#: access/transam/xlogrecovery.c:1151 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "Der Datenbankserver prüft das Unterverzeichnis pg_wal regelmäßig auf dort abgelegte Dateien." -#: access/transam/xlogrecovery.c:1150 +#: access/transam/xlogrecovery.c:1159 #, c-format msgid "must specify \"restore_command\" when standby mode is not enabled" msgstr "»restore_command« muss angegeben werden, wenn der Standby-Modus nicht eingeschaltet ist" -#: access/transam/xlogrecovery.c:1188 +#: access/transam/xlogrecovery.c:1197 #, c-format msgid "recovery target timeline %u does not exist" msgstr "recovery_target_timeline %u existiert nicht" -#: access/transam/xlogrecovery.c:1271 access/transam/xlogrecovery.c:1278 -#: access/transam/xlogrecovery.c:1337 access/transam/xlogrecovery.c:1425 -#: access/transam/xlogrecovery.c:1434 access/transam/xlogrecovery.c:1454 +#: access/transam/xlogrecovery.c:1280 access/transam/xlogrecovery.c:1287 +#: access/transam/xlogrecovery.c:1346 access/transam/xlogrecovery.c:1434 +#: access/transam/xlogrecovery.c:1443 access/transam/xlogrecovery.c:1463 #, c-format msgid "invalid data in file \"%s\"" msgstr "ungültige Daten in Datei »%s«" -#: access/transam/xlogrecovery.c:1338 +#: access/transam/xlogrecovery.c:1347 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "Gelesene Zeitleisten-ID ist %u, aber %u wurde erwartet." -#: access/transam/xlogrecovery.c:1349 +#: access/transam/xlogrecovery.c:1358 #, c-format msgid "this is an incremental backup, not a data directory" msgstr "dies ist ein inkrementelles Backup, kein Datenverzeichnis" -#: access/transam/xlogrecovery.c:1350 +#: access/transam/xlogrecovery.c:1359 #, c-format msgid "Use pg_combinebackup to reconstruct a valid data directory." msgstr "Verwenden Sie pg_combinebackup, um ein gültiges Datenverzeichnis zu rekonstruieren." -#: access/transam/xlogrecovery.c:1736 +#: access/transam/xlogrecovery.c:1745 #, c-format msgid "unexpected record type found at redo point %X/%X" msgstr "unerwarteter Datensatztyp bei Redo-Position %X/%X gefunden" -#: access/transam/xlogrecovery.c:1759 +#: access/transam/xlogrecovery.c:1768 #, c-format msgid "redo starts at %X/%X" msgstr "Redo beginnt bei %X/%X" -#: access/transam/xlogrecovery.c:1772 +#: access/transam/xlogrecovery.c:1781 #, c-format msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" msgstr "Redo im Gang, abgelaufene Zeit: %ld.%02d s, aktuelle LSN: %X/%X" -#: access/transam/xlogrecovery.c:1862 +#: access/transam/xlogrecovery.c:1871 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "angeforderter Recovery-Endpunkt ist vor konsistentem Recovery-Punkt" -#: access/transam/xlogrecovery.c:1894 +#: access/transam/xlogrecovery.c:1903 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "Redo fertig bei %X/%X Systembenutzung: %s" -#: access/transam/xlogrecovery.c:1900 +#: access/transam/xlogrecovery.c:1909 #, c-format msgid "last completed transaction was at log time %s" msgstr "letzte vollständige Transaktion war bei Logzeit %s" -#: access/transam/xlogrecovery.c:1909 +#: access/transam/xlogrecovery.c:1918 #, c-format msgid "redo is not required" msgstr "Redo nicht nötig" -#: access/transam/xlogrecovery.c:1921 +#: access/transam/xlogrecovery.c:1930 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "Wiederherstellung endete bevor das konfigurierte Wiederherstellungsziel erreicht wurde" -#: access/transam/xlogrecovery.c:2115 +#: access/transam/xlogrecovery.c:2124 #, c-format msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" msgstr "fehlender Contrecord bei %X/%X erfolgreich übersprungen, überschrieben am %s" -#: access/transam/xlogrecovery.c:2182 +#: access/transam/xlogrecovery.c:2191 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "unerwarteter Verzeichniseintrag »%s« in %s gefunden" -#: access/transam/xlogrecovery.c:2184 +#: access/transam/xlogrecovery.c:2193 #, c-format msgid "All directory entries in %s/ should be symbolic links." msgstr "Alle Verzeichniseinträge in %s/ sollten symbolische Verknüpfungen sein." -#: access/transam/xlogrecovery.c:2186 +#: access/transam/xlogrecovery.c:2195 #, c-format msgid "Remove those directories, or set \"allow_in_place_tablespaces\" to ON transiently to let recovery complete." msgstr "Entfernen Sie diese Verzeichnisse oder setzen Sie »allow_in_place_tablespaces« vorrübergehend auf ON, damit die Wiederherstellung abschließen kann." -#: access/transam/xlogrecovery.c:2238 +#: access/transam/xlogrecovery.c:2247 #, c-format msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" msgstr "Wiederherstellung aus Backup abgeschlossen mit Redo-LSN %X/%X und End-LSN %X/%X" -#: access/transam/xlogrecovery.c:2269 +#: access/transam/xlogrecovery.c:2278 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "konsistenter Wiederherstellungszustand erreicht bei %X/%X" #. translator: %s is a WAL record description -#: access/transam/xlogrecovery.c:2307 +#: access/transam/xlogrecovery.c:2316 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "WAL-Redo bei %X/%X für %s" -#: access/transam/xlogrecovery.c:2405 +#: access/transam/xlogrecovery.c:2414 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "unerwartete vorherige Zeitleisten-ID %u (aktuelle Zeitleisten-ID %u) im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:2414 +#: access/transam/xlogrecovery.c:2423 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "unerwartete Zeitleisten-ID %u (nach %u) im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:2430 +#: access/transam/xlogrecovery.c:2439 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "unerwartete Zeitleisten-ID %u in Checkpoint-Datensatz, bevor der minimale Wiederherstellungspunkt %X/%X auf Zeitleiste %u erreicht wurde" -#: access/transam/xlogrecovery.c:2614 access/transam/xlogrecovery.c:2890 +#: access/transam/xlogrecovery.c:2623 access/transam/xlogrecovery.c:2899 #, c-format msgid "recovery stopping after reaching consistency" msgstr "Wiederherstellung beendet nachdem Konsistenz erreicht wurde" -#: access/transam/xlogrecovery.c:2635 +#: access/transam/xlogrecovery.c:2644 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "Wiederherstellung beendet vor WAL-Position (LSN) »%X/%X«" -#: access/transam/xlogrecovery.c:2725 +#: access/transam/xlogrecovery.c:2734 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "Wiederherstellung beendet vor Commit der Transaktion %u, Zeit %s" -#: access/transam/xlogrecovery.c:2732 +#: access/transam/xlogrecovery.c:2741 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "Wiederherstellung beendet vor Abbruch der Transaktion %u, Zeit %s" -#: access/transam/xlogrecovery.c:2785 +#: access/transam/xlogrecovery.c:2794 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "Wiederherstellung beendet bei Restore-Punkt »%s«, Zeit %s" -#: access/transam/xlogrecovery.c:2803 +#: access/transam/xlogrecovery.c:2812 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "Wiederherstellung beendet nach WAL-Position (LSN) »%X/%X«" -#: access/transam/xlogrecovery.c:2870 +#: access/transam/xlogrecovery.c:2879 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "Wiederherstellung beendet nach Commit der Transaktion %u, Zeit %s" -#: access/transam/xlogrecovery.c:2878 +#: access/transam/xlogrecovery.c:2887 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "Wiederherstellung beendet nach Abbruch der Transaktion %u, Zeit %s" -#: access/transam/xlogrecovery.c:2959 +#: access/transam/xlogrecovery.c:2968 #, c-format msgid "pausing at the end of recovery" msgstr "pausiere am Ende der Wiederherstellung" -#: access/transam/xlogrecovery.c:2960 +#: access/transam/xlogrecovery.c:2969 #, c-format 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:2963 access/transam/xlogrecovery.c:4720 +#: access/transam/xlogrecovery.c:2972 access/transam/xlogrecovery.c:4731 #, c-format msgid "recovery has paused" msgstr "Wiederherstellung wurde pausiert" -#: access/transam/xlogrecovery.c:2964 +#: access/transam/xlogrecovery.c:2973 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Führen Sie pg_wal_replay_resume() aus um fortzusetzen." -#: access/transam/xlogrecovery.c:3227 +#: access/transam/xlogrecovery.c:3236 #, c-format msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" msgstr "unerwartete Zeitleisten-ID %u in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogrecovery.c:3443 +#: access/transam/xlogrecovery.c:3454 #, c-format msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" msgstr "konnte nicht aus WAL-Segment %s, LSN %X/%X, Position %u lesen: %m" -#: access/transam/xlogrecovery.c:3450 +#: access/transam/xlogrecovery.c:3461 #, c-format 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:4104 +#: access/transam/xlogrecovery.c:4115 #, c-format msgid "invalid checkpoint location" msgstr "ungültige Checkpoint-Position" -#: access/transam/xlogrecovery.c:4114 +#: access/transam/xlogrecovery.c:4125 #, c-format msgid "invalid checkpoint record" msgstr "ungültiger Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:4120 +#: access/transam/xlogrecovery.c:4131 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "ungültige Resource-Manager-ID im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:4128 +#: access/transam/xlogrecovery.c:4139 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "ungültige xl_info im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:4134 +#: access/transam/xlogrecovery.c:4145 #, c-format msgid "invalid length of checkpoint record" msgstr "ungültige Länge des Checkpoint-Datensatzes" -#: access/transam/xlogrecovery.c:4188 +#: access/transam/xlogrecovery.c:4199 #, 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:4202 +#: access/transam/xlogrecovery.c:4213 #, 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:4221 +#: access/transam/xlogrecovery.c:4232 #, c-format msgid "new target timeline is %u" msgstr "neue Zielzeitleiste ist %u" -#: access/transam/xlogrecovery.c:4422 +#: access/transam/xlogrecovery.c:4433 #, c-format msgid "WAL receiver process shutdown requested" msgstr "Herunterfahren des WAL-Receiver-Prozesses verlangt" -#: access/transam/xlogrecovery.c:4482 +#: access/transam/xlogrecovery.c:4493 #, c-format msgid "received promote request" msgstr "Anforderung zum Befördern empfangen" -#: access/transam/xlogrecovery.c:4711 +#: access/transam/xlogrecovery.c:4722 #, 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:4712 access/transam/xlogrecovery.c:4739 -#: access/transam/xlogrecovery.c:4769 +#: access/transam/xlogrecovery.c:4723 access/transam/xlogrecovery.c:4750 +#: access/transam/xlogrecovery.c:4780 #, 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:4721 +#: access/transam/xlogrecovery.c:4732 #, 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:4722 +#: access/transam/xlogrecovery.c:4733 #, 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:4733 +#: access/transam/xlogrecovery.c:4744 #, 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:4743 +#: access/transam/xlogrecovery.c:4754 #, 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:4767 +#: access/transam/xlogrecovery.c:4778 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "Wiederherstellung abgebrochen wegen unzureichender Parametereinstellungen" -#: access/transam/xlogrecovery.c:4773 +#: access/transam/xlogrecovery.c:4784 #, 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:4793 access/transam/xlogrecovery.c:4795 +#: access/transam/xlogrecovery.c:4804 access/transam/xlogrecovery.c:4806 #: catalog/dependency.c:1153 catalog/dependency.c:1160 #: catalog/dependency.c:1171 commands/tablecmds.c:1529 -#: commands/tablecmds.c:16752 commands/tablespace.c:460 commands/user.c:1302 +#: commands/tablecmds.c:16751 commands/tablespace.c:460 commands/user.c:1302 #: commands/vacuum.c:226 commands/view.c:441 executor/execExprInterp.c:5282 #: executor/execExprInterp.c:5290 libpq/auth.c:320 -#: replication/logical/applyparallelworker.c:1057 replication/slot.c:1705 -#: replication/slot.c:2783 replication/slot.c:2785 replication/syncrep.c:1079 +#: replication/logical/applyparallelworker.c:1057 replication/slot.c:1707 +#: replication/slot.c:2785 replication/slot.c:2787 replication/syncrep.c:1079 #: storage/aio/method_io_uring.c:389 storage/lmgr/deadlock.c:1137 -#: storage/lmgr/proc.c:1525 utils/misc/guc.c:3166 utils/misc/guc.c:3207 +#: storage/lmgr/proc.c:1558 utils/misc/guc.c:3166 utils/misc/guc.c:3207 #: utils/misc/guc.c:3282 utils/misc/guc.c:6834 utils/misc/guc.c:6868 #: utils/misc/guc.c:6902 utils/misc/guc.c:6945 utils/misc/guc.c:6987 #, c-format msgid "%s" msgstr "%s" -#: access/transam/xlogrecovery.c:4825 +#: access/transam/xlogrecovery.c:4836 #, c-format msgid "multiple recovery targets specified" msgstr "mehrere Wiederherstellungsziele angegeben" -#: access/transam/xlogrecovery.c:4826 +#: access/transam/xlogrecovery.c:4837 #, 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:4837 +#: access/transam/xlogrecovery.c:4848 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Der einzige erlaubte Wert ist »immediate«." -#: access/transam/xlogrecovery.c:4991 +#: access/transam/xlogrecovery.c:5002 #, c-format msgid "Timestamp out of range: \"%s\"." msgstr "Timestamp ist außerhalb des gültigen Bereichs: »%s«." -#: access/transam/xlogrecovery.c:5036 +#: access/transam/xlogrecovery.c:5047 #, c-format msgid "\"recovery_target_timeline\" is not a valid number." msgstr "»recovery_target_timeline« ist keine gültige Zahl." -#: access/transam/xlogutils.c:1023 +#: access/transam/xlogutils.c:1059 #, c-format msgid "could not read from WAL segment %s, offset %d: %m" msgstr "konnte nicht aus WAL-Segment %s, Position %d lesen: %m" -#: access/transam/xlogutils.c:1030 +#: access/transam/xlogutils.c:1066 #, c-format msgid "could not read from WAL segment %s, offset %d: read %d of %d" msgstr "konnte nicht aus WAL-Segment %s, Position %d lesen: %d von %d gelesen" @@ -3772,118 +3790,118 @@ msgstr[1] "%lld Prüfsummenfehler insgesamt" msgid "checksum verification failure during base backup" msgstr "Prüfsummenüberprüfung bei der Basissicherung fehlgeschlagen" -#: backup/basebackup.c:735 backup/basebackup.c:744 backup/basebackup.c:755 -#: backup/basebackup.c:772 backup/basebackup.c:781 backup/basebackup.c:790 -#: backup/basebackup.c:805 backup/basebackup.c:822 backup/basebackup.c:831 -#: backup/basebackup.c:843 backup/basebackup.c:867 backup/basebackup.c:881 -#: backup/basebackup.c:892 backup/basebackup.c:903 backup/basebackup.c:916 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 +#: backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 +#: backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 +#: backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 +#: backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format msgid "duplicate option \"%s\"" msgstr "doppelte Option »%s«" -#: backup/basebackup.c:763 +#: backup/basebackup.c:761 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "unbekannter Checkpoint-Typ: »%s«" -#: backup/basebackup.c:795 +#: backup/basebackup.c:793 #, c-format msgid "incremental backups cannot be taken unless WAL summarization is enabled" msgstr "inkrementelle Backups können nicht durchgeführt werden, wenn WAL-Zusammenfassung nicht eingeschaltet ist" -#: backup/basebackup.c:811 +#: backup/basebackup.c:809 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d ist außerhalb des gültigen Bereichs für Parameter »%s« (%d ... %d)" -#: backup/basebackup.c:856 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "unbekannte Manifestoption: »%s«" -#: backup/basebackup.c:907 +#: backup/basebackup.c:905 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "unbekannter Komprimierungsalgorithmus: »%s«" -#: backup/basebackup.c:923 +#: backup/basebackup.c:921 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "unbekannte Base-Backup-Option: »%s«" -#: backup/basebackup.c:934 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "Manifest-Prüfsummen benötigen ein Backup-Manifest" -#: backup/basebackup.c:943 +#: backup/basebackup.c:941 #, c-format msgid "target detail cannot be used without target" msgstr "Zieldetail kann nicht ohne Ziel verwendet werden" -#: backup/basebackup.c:952 backup/basebackup_target.c:218 +#: backup/basebackup.c:950 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "Ziel »%s« akzeptiert kein Zieldetail" -#: backup/basebackup.c:963 +#: backup/basebackup.c:961 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "Komprimierungsdetail kann nicht angegeben werden, wenn Komprimierung nicht eingeschaltet ist" -#: backup/basebackup.c:976 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "ungültige Komprimierungsangabe: %s" -#: backup/basebackup.c:1026 +#: backup/basebackup.c:1024 #, c-format msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" msgstr "UPLOAD_MANIFEST muss vor einem inkrementellen BASE_BACKUP ausgeführt werden" -#: backup/basebackup.c:1159 backup/basebackup.c:1360 +#: backup/basebackup.c:1157 backup/basebackup.c:1358 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m" -#: backup/basebackup.c:1546 +#: backup/basebackup.c:1544 #, c-format msgid "skipping special file \"%s\"" msgstr "überspringe besondere Datei »%s«" -#: backup/basebackup.c:1753 +#: backup/basebackup.c:1751 #, c-format msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" msgstr "konnte Prüfsumme in Datei »%s«, Block %u nicht überprüfen: gelesene Puffergröße %d und Seitengröße %d sind verschieden" -#: backup/basebackup.c:1815 +#: backup/basebackup.c:1813 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" msgstr[0] "Datei »%s« hat insgesamt %d Prüfsummenfehler" msgstr[1] "Datei »%s« hat insgesamt %d Prüfsummenfehler" -#: backup/basebackup.c:1920 +#: backup/basebackup.c:1918 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" msgstr "Prüfsummenüberprüfung fehlgeschlagen in Datei »%s«, Block %u: berechnet %X, aber erwartet %X" -#: backup/basebackup.c:1927 +#: backup/basebackup.c:1925 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "weitere Prüfsummenfehler in Datei »%s« werden nicht berichtet werden" -#: backup/basebackup.c:2052 +#: backup/basebackup.c:2050 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "Dateiname zu lang für Tar-Format: »%s«" -#: backup/basebackup.c:2058 +#: backup/basebackup.c:2056 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "Ziel der symbolischen Verknüpfung zu lang für Tar-Format: Dateiname »%s«, Ziel »%s«" -#: backup/basebackup.c:2132 +#: backup/basebackup.c:2130 #, c-format msgid "could not read file \"%s\": read %zd of %zu" msgstr "konnte Datei »%s« nicht lesen: %zd von %zu gelesen" @@ -3980,7 +3998,7 @@ msgstr "relativer Pfad nicht erlaubt für auf dem Server abgelegtes Backup" #: backup/basebackup_server.c:102 commands/dbcommands.c:478 #: commands/tablespace.c:157 commands/tablespace.c:173 -#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2287 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2289 #: storage/file/copydir.c:58 #, c-format msgid "could not create directory \"%s\": %m" @@ -4005,10 +4023,9 @@ msgid "Check free disk space." msgstr "Prüfen Sie den freien Festplattenplatz." #: backup/basebackup_server.c:179 backup/basebackup_server.c:272 -#: backup/walsummary.c:309 #, c-format -msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" -msgstr "konnte Datei »%s« nicht schreiben: es wurden nur %d von %d Bytes bei Offset %u geschrieben" +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %lld" +msgstr "konnte Datei »%s« nicht schreiben: es wurden nur %d von %d Bytes bei Offset %lld geschrieben" #: backup/basebackup_target.c:146 #, c-format @@ -4035,6 +4052,11 @@ msgstr "konnte Komprimierungs-Worker-Anzahl nicht auf %d setzen: %s" msgid "could not enable long-distance mode: %s" msgstr "konnte Long-Distance-Modus nicht einschalten: %s" +#: backup/walsummary.c:309 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "konnte Datei »%s« nicht schreiben: es wurden nur %d von %d Bytes bei Offset %u geschrieben" + #: backup/walsummaryfuncs.c:95 #, c-format msgid "invalid timeline %" @@ -4211,23 +4233,23 @@ msgstr "keine Berechtigung, um Vorgabeprivilegien zu ändern" msgid "cannot use IN SCHEMA clause when using %s" msgstr "Klausel IN SCHEMA kann nicht verwendet werden, wenn %s verwendet wird" -#: catalog/aclchk.c:1577 catalog/catalog.c:684 catalog/heap.c:2635 -#: catalog/heap.c:2957 catalog/objectaddress.c:1528 +#: catalog/aclchk.c:1577 catalog/catalog.c:684 catalog/heap.c:2638 +#: catalog/heap.c:2960 catalog/objectaddress.c:1528 #: catalog/pg_publication.c:570 commands/analyze.c:388 commands/copy.c:1040 -#: commands/sequence.c:1655 commands/tablecmds.c:7761 commands/tablecmds.c:7939 -#: commands/tablecmds.c:8140 commands/tablecmds.c:8269 -#: commands/tablecmds.c:8423 commands/tablecmds.c:8517 -#: commands/tablecmds.c:8620 commands/tablecmds.c:8786 -#: commands/tablecmds.c:8816 commands/tablecmds.c:8971 -#: commands/tablecmds.c:9074 commands/tablecmds.c:9208 -#: commands/tablecmds.c:9321 commands/tablecmds.c:14409 -#: commands/tablecmds.c:14612 commands/tablecmds.c:14773 -#: commands/tablecmds.c:16001 commands/tablecmds.c:18768 commands/trigger.c:948 -#: parser/analyze.c:2591 parser/parse_relation.c:749 parser/parse_target.c:1070 +#: commands/sequence.c:1655 commands/tablecmds.c:7761 commands/tablecmds.c:7935 +#: commands/tablecmds.c:8136 commands/tablecmds.c:8265 +#: commands/tablecmds.c:8419 commands/tablecmds.c:8513 +#: commands/tablecmds.c:8616 commands/tablecmds.c:8777 +#: commands/tablecmds.c:8807 commands/tablecmds.c:8962 +#: commands/tablecmds.c:9065 commands/tablecmds.c:9199 +#: commands/tablecmds.c:9312 commands/tablecmds.c:14408 +#: commands/tablecmds.c:14611 commands/tablecmds.c:14772 +#: commands/tablecmds.c:16000 commands/tablecmds.c:18767 commands/trigger.c:948 +#: parser/analyze.c:2591 parser/parse_relation.c:781 parser/parse_target.c:1070 #: parser/parse_type.c:144 parser/parse_utilcmd.c:3671 #: parser/parse_utilcmd.c:3711 parser/parse_utilcmd.c:3753 -#: statistics/attribute_stats.c:212 statistics/attribute_stats.c:955 -#: utils/adt/acl.c:2938 utils/adt/ruleutils.c:2858 +#: statistics/attribute_stats.c:212 statistics/attribute_stats.c:981 +#: utils/adt/acl.c:2938 utils/adt/ruleutils.c:2860 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "Spalte »%s« von Relation »%s« existiert nicht" @@ -4237,13 +4259,13 @@ msgstr "Spalte »%s« von Relation »%s« existiert nicht" msgid "\"%s\" is an index" msgstr "»%s« ist ein Index" -#: catalog/aclchk.c:1829 commands/tablecmds.c:16158 commands/tablecmds.c:19687 +#: catalog/aclchk.c:1829 commands/tablecmds.c:16157 commands/tablecmds.c:19686 #, c-format msgid "\"%s\" is a composite type" msgstr "»%s« ist ein zusammengesetzter Typ" #: catalog/aclchk.c:1837 catalog/objectaddress.c:1368 commands/tablecmds.c:266 -#: commands/tablecmds.c:19651 utils/adt/acl.c:2122 utils/adt/acl.c:2152 +#: commands/tablecmds.c:19650 utils/adt/acl.c:2122 utils/adt/acl.c:2152 #: utils/adt/acl.c:2185 utils/adt/acl.c:2221 utils/adt/acl.c:2252 #: utils/adt/acl.c:2283 #, c-format @@ -4781,19 +4803,19 @@ msgid_plural "drop cascades to %d other objects" msgstr[0] "Löschvorgang löscht ebenfalls %d weiteres Objekt" msgstr[1] "Löschvorgang löscht ebenfalls %d weitere Objekte" -#: catalog/dependency.c:1850 +#: catalog/dependency.c:1853 #, c-format msgid "constant of the type %s cannot be used here" msgstr "Konstante vom Typ %s kann hier nicht verwendet werden" -#: catalog/dependency.c:2205 +#: catalog/dependency.c:2208 #, c-format msgid "transition table \"%s\" cannot be referenced in a persistent object" msgstr "auf Übergangstabelle »%s« kann in einem persistenten Objekt nicht verwiesen werden" -#: catalog/dependency.c:2390 parser/parse_relation.c:3513 -#: parser/parse_relation.c:3523 statistics/attribute_stats.c:224 -#: statistics/attribute_stats.c:596 statistics/attribute_stats.c:604 +#: catalog/dependency.c:2393 parser/parse_relation.c:3545 +#: parser/parse_relation.c:3555 statistics/attribute_stats.c:224 +#: statistics/attribute_stats.c:613 statistics/attribute_stats.c:621 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "Spalte %d von Relation »%s« existiert nicht" @@ -4850,7 +4872,7 @@ msgstr "zusammengesetzter Typ %s kann nicht Teil von sich selbst werden" msgid "virtual generated column \"%s\" cannot have a user-defined type" msgstr "virtuelle generierte Spalte »%s« kann keinen benutzerdefinierten Typ haben" -#: catalog/heap.c:688 catalog/heap.c:3311 +#: catalog/heap.c:688 catalog/heap.c:3314 #, c-format msgid "Virtual generated columns that make use of user-defined types are not yet supported." msgstr "Virtuelle generierte Spalten, die benutzerdefinierte Typen verwenden, werden noch nicht unterstützt." @@ -4866,192 +4888,192 @@ msgstr "für Partitionierungsschlüsselspalte %s mit sortierbarem Typ %s wurde k msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "für Spalte »%s« mit sortierbarem Typ %s wurde keine Sortierfolge abgeleitet" -#: catalog/heap.c:1193 catalog/index.c:901 commands/createas.c:408 +#: catalog/heap.c:1196 catalog/index.c:905 commands/createas.c:408 #: commands/tablecmds.c:4306 #, c-format msgid "relation \"%s\" already exists" msgstr "Relation »%s« existiert bereits" -#: catalog/heap.c:1209 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: catalog/heap.c:1212 catalog/pg_type.c:434 catalog/pg_type.c:805 #: catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 #: commands/typecmds.c:758 commands/typecmds.c:1213 commands/typecmds.c:1439 -#: commands/typecmds.c:1619 commands/typecmds.c:2594 +#: commands/typecmds.c:1626 commands/typecmds.c:2601 #, c-format msgid "type \"%s\" already exists" msgstr "Typ »%s« existiert bereits" -#: catalog/heap.c:1210 +#: catalog/heap.c:1213 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "Eine Relation hat einen zugehörigen Typ mit dem selben Namen, daher müssen Sie einen Namen wählen, der nicht mit einem bestehenden Typ kollidiert." -#: catalog/heap.c:1250 +#: catalog/heap.c:1253 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "TOAST-Relfile-Nummer-Wert ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/heap.c:1261 +#: catalog/heap.c:1264 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "Heap-OID-Wert für pg_class ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/heap.c:1271 +#: catalog/heap.c:1274 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "Relfile-Nummer-Wert ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/heap.c:2216 +#: catalog/heap.c:2219 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "zur partitionierten Tabelle »%s« kann kein NO-INHERIT-Constraint hinzugefügt werden" -#: catalog/heap.c:2539 +#: catalog/heap.c:2542 #, c-format msgid "check constraint \"%s\" already exists" msgstr "Check-Constraint »%s« existiert bereits" -#: catalog/heap.c:2640 catalog/heap.c:2963 +#: catalog/heap.c:2643 catalog/heap.c:2966 #, c-format msgid "cannot add not-null constraint on system column \"%s\"" msgstr "zur Systemspalte »%s« kann kein Not-Null-Constraint hinzugefügt werden" -#: catalog/heap.c:2668 catalog/heap.c:2794 catalog/heap.c:3047 -#: catalog/index.c:915 catalog/pg_constraint.c:1025 commands/tablecmds.c:9831 +#: catalog/heap.c:2671 catalog/heap.c:2797 catalog/heap.c:3050 +#: catalog/index.c:919 catalog/pg_constraint.c:1025 commands/tablecmds.c:9822 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "Constraint »%s« existiert bereits für Relation »%s«" -#: catalog/heap.c:2801 +#: catalog/heap.c:2804 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit nicht vererbtem Constraint für Relation »%s«" -#: catalog/heap.c:2812 +#: catalog/heap.c:2815 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit vererbtem Constraint für Relation »%s«" -#: catalog/heap.c:2822 +#: catalog/heap.c:2825 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit NOT-VALID-Constraint für Relation »%s«" -#: catalog/heap.c:2834 +#: catalog/heap.c:2837 #, c-format msgid "constraint \"%s\" conflicts with NOT ENFORCED constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit NOT-ENFORCED-Constraint für Relation »%s«" -#: catalog/heap.c:2839 +#: catalog/heap.c:2842 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "Constraint »%s« wird mit geerbter Definition zusammengeführt" -#: catalog/heap.c:2863 catalog/pg_constraint.c:803 catalog/pg_constraint.c:1154 +#: catalog/heap.c:2866 catalog/pg_constraint.c:803 catalog/pg_constraint.c:1154 #: commands/tablecmds.c:3189 commands/tablecmds.c:3509 -#: commands/tablecmds.c:7296 commands/tablecmds.c:7977 -#: commands/tablecmds.c:17595 commands/tablecmds.c:17777 +#: commands/tablecmds.c:7296 commands/tablecmds.c:7973 +#: commands/tablecmds.c:17594 commands/tablecmds.c:17776 #, c-format msgid "too many inheritance parents" msgstr "zu viele Elterntabellen" -#: catalog/heap.c:2982 parser/parse_utilcmd.c:2659 +#: catalog/heap.c:2985 parser/parse_utilcmd.c:2659 #, c-format msgid "conflicting NO INHERIT declaration for not-null constraint on column \"%s\"" msgstr "widersprüchliche NO INHERIT-Deklaration für Not-Null-Constraint für Spalte »%s«" -#: catalog/heap.c:2996 +#: catalog/heap.c:2999 #, c-format msgid "conflicting not-null constraint names \"%s\" and \"%s\"" msgstr "widersprüchliche Not-Null-Constraint-Namen »%s« und »%s«" -#: catalog/heap.c:3026 +#: catalog/heap.c:3029 #, c-format msgid "cannot define not-null constraint with NO INHERIT on column \"%s\"" msgstr "kann keinen Not-Null-Constraint mit NO INHERIT für Spalte »%s« definieren" -#: catalog/heap.c:3028 +#: catalog/heap.c:3031 #, c-format msgid "The column has an inherited not-null constraint." msgstr "Die Spalte hat einen geerbten Not-Null-Constraint." -#: catalog/heap.c:3218 +#: catalog/heap.c:3221 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "generierte Spalte »%s« kann nicht im Spaltengenerierungsausdruck verwendet werden" -#: catalog/heap.c:3220 +#: catalog/heap.c:3223 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Eine generierte Spalte kann nicht auf eine andere generierte Spalte verweisen." -#: catalog/heap.c:3226 +#: catalog/heap.c:3229 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "Variable mit Verweis auf die ganze Zeile kann nicht im Spaltengenerierungsausdruck verwendet werden" -#: catalog/heap.c:3227 +#: catalog/heap.c:3230 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Dadurch würde die generierte Spalte von ihrem eigenen Wert abhängen." -#: catalog/heap.c:3294 +#: catalog/heap.c:3297 #, c-format msgid "generation expression uses user-defined function" msgstr "Generierungsausdruck verwendet benutzerdefinierte Funktion" -#: catalog/heap.c:3295 +#: catalog/heap.c:3298 #, c-format msgid "Virtual generated columns that make use of user-defined functions are not yet supported." msgstr "Virtuelle generierte Spalten, die benutzerdefinierte Funktionen verwenden, werden noch nicht unterstützt." -#: catalog/heap.c:3310 +#: catalog/heap.c:3313 #, c-format msgid "generation expression uses user-defined type" msgstr "Generierungsausdruck verwendet benutzerdefinierten Typ" -#: catalog/heap.c:3362 +#: catalog/heap.c:3365 #, c-format msgid "generation expression is not immutable" msgstr "Generierungsausdruck ist nicht »immutable«" -#: catalog/heap.c:3394 rewrite/rewriteHandler.c:1321 +#: catalog/heap.c:3397 rewrite/rewriteHandler.c:1321 #, 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:3399 commands/prepare.c:334 parser/analyze.c:2922 +#: catalog/heap.c:3402 commands/prepare.c:334 parser/analyze.c:2922 #: parser/parse_target.c:595 parser/parse_target.c:885 #: parser/parse_target.c:895 rewrite/rewriteHandler.c:1326 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Sie müssen den Ausdruck umschreiben oder eine Typumwandlung vornehmen." -#: catalog/heap.c:3446 +#: catalog/heap.c:3449 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "nur Verweise auf Tabelle »%s« sind im Check-Constraint zugelassen" -#: catalog/heap.c:3752 +#: catalog/heap.c:3755 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "nicht unterstützte Kombination aus ON COMMIT und Fremdschlüssel" -#: catalog/heap.c:3753 +#: catalog/heap.c:3756 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "Tabelle »%s« verweist auf »%s«, aber sie haben nicht die gleiche ON-COMMIT-Einstellung." -#: catalog/heap.c:3758 +#: catalog/heap.c:3761 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "kann eine Tabelle, die in einen Fremdschlüssel-Constraint eingebunden ist, nicht leeren" -#: catalog/heap.c:3759 +#: catalog/heap.c:3762 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabelle »%s« verweist auf »%s«." -#: catalog/heap.c:3761 +#: catalog/heap.c:3764 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Leeren Sie die Tabelle »%s« gleichzeitig oder verwenden Sie TRUNCATE ... CASCADE." @@ -5076,74 +5098,74 @@ msgstr "Primärschlüssel können keine Ausdrücke sein" msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "Primärschlüsselspalte »%s« ist nicht als NOT NULL markiert" -#: catalog/index.c:800 catalog/index.c:1921 +#: catalog/index.c:804 catalog/index.c:1935 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "benutzerdefinierte Indexe für Systemkatalogtabellen werden nicht unterstützt" -#: catalog/index.c:840 +#: catalog/index.c:844 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "nichtdeterministische Sortierfolgen werden von Operatorklasse »%s« nicht unterstützt" -#: catalog/index.c:855 +#: catalog/index.c:859 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "nebenläufige Indexerzeugung für Systemkatalogtabellen wird nicht unterstützt" -#: catalog/index.c:864 catalog/index.c:1333 +#: catalog/index.c:868 catalog/index.c:1340 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "nebenläufige Indexerzeugung für Exclusion-Constraints wird nicht unterstützt" -#: catalog/index.c:873 +#: catalog/index.c:877 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "Cluster-globale Indexe können nicht nach initdb erzeugt werden" -#: catalog/index.c:893 commands/createas.c:423 commands/sequence.c:159 +#: catalog/index.c:897 commands/createas.c:423 commands/sequence.c:159 #: parser/parse_utilcmd.c:210 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "Relation »%s« existiert bereits, wird übersprungen" -#: catalog/index.c:943 +#: catalog/index.c:947 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "Index-OID-Wert für pg_class ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/index.c:953 utils/cache/relcache.c:3795 +#: catalog/index.c:957 utils/cache/relcache.c:3797 #, c-format msgid "index relfilenumber value not set when in binary upgrade mode" msgstr "Index-Relfile-Nummer-Wert ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/index.c:2222 +#: catalog/index.c:2236 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY muss die erste Aktion in einer Transaktion sein" -#: catalog/index.c:3729 +#: catalog/index.c:3755 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht reindizieren" -#: catalog/index.c:3740 commands/indexcmds.c:3793 +#: catalog/index.c:3766 commands/indexcmds.c:3793 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "ungültiger Index einer TOAST-Tabelle kann nicht reindiziert werden" -#: catalog/index.c:3756 commands/indexcmds.c:3671 commands/indexcmds.c:3817 +#: catalog/index.c:3782 commands/indexcmds.c:3671 commands/indexcmds.c:3817 #: commands/tablecmds.c:3713 #, c-format msgid "cannot move system relation \"%s\"" msgstr "Systemrelation »%s« kann nicht verschoben werden" -#: catalog/index.c:3893 +#: catalog/index.c:3919 #, c-format msgid "index \"%s\" was reindexed" msgstr "Index »%s« wurde neu indiziert" -#: catalog/index.c:4059 +#: catalog/index.c:4085 #, c-format 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" @@ -5169,13 +5191,13 @@ msgstr "konnte Sperre für Relation »%s.%s« nicht setzen" msgid "could not obtain lock on relation \"%s\"" msgstr "konnte Sperre für Relation »%s« nicht setzen" -#: catalog/namespace.c:633 parser/parse_relation.c:1447 +#: catalog/namespace.c:633 parser/parse_relation.c:1479 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "Relation »%s.%s« existiert nicht" -#: catalog/namespace.c:638 parser/parse_relation.c:1460 -#: parser/parse_relation.c:1468 utils/adt/regproc.c:913 +#: catalog/namespace.c:638 parser/parse_relation.c:1492 +#: parser/parse_relation.c:1500 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "Relation »%s« existiert nicht" @@ -5222,7 +5244,7 @@ msgid "text search template \"%s\" does not exist" msgstr "Textsuchevorlage »%s« existiert nicht" #: catalog/namespace.c:3200 commands/tsearchcmds.c:1168 -#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 +#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:648 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "Textsuchekonfiguration »%s« existiert nicht" @@ -5286,25 +5308,25 @@ msgstr "während einer parallelen Operation können keine temporären Tabellen e #: catalog/objectaddress.c:1376 commands/policy.c:93 commands/policy.c:373 #: commands/tablecmds.c:260 commands/tablecmds.c:302 commands/tablecmds.c:2397 -#: commands/tablecmds.c:14547 +#: commands/tablecmds.c:14546 #, c-format msgid "\"%s\" is not a table" msgstr "»%s« ist keine Tabelle" #: catalog/objectaddress.c:1383 commands/tablecmds.c:272 -#: commands/tablecmds.c:19656 commands/view.c:113 +#: commands/tablecmds.c:19655 commands/view.c:113 #, c-format msgid "\"%s\" is not a view" msgstr "»%s« ist keine Sicht" #: catalog/objectaddress.c:1390 commands/matview.c:201 commands/tablecmds.c:278 -#: commands/tablecmds.c:19661 +#: commands/tablecmds.c:19660 #, c-format msgid "\"%s\" is not a materialized view" msgstr "»%s« ist keine materialisierte Sicht" #: catalog/objectaddress.c:1397 commands/tablecmds.c:296 -#: commands/tablecmds.c:19666 +#: commands/tablecmds.c:19665 #, c-format msgid "\"%s\" is not a foreign table" msgstr "»%s« ist keine Fremdtabelle" @@ -5325,7 +5347,7 @@ msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "Vorgabewert für Spalte »%s« von Relation »%s« existiert nicht" #: catalog/objectaddress.c:1623 commands/functioncmds.c:132 -#: commands/tablecmds.c:288 commands/typecmds.c:278 commands/typecmds.c:3842 +#: commands/tablecmds.c:288 commands/typecmds.c:278 commands/typecmds.c:3849 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 #: utils/adt/acl.c:4575 #, c-format @@ -5596,7 +5618,7 @@ msgstr "Textsuchekonfiguration %s" msgid "role %s" msgstr "Rolle %s" -#: catalog/objectaddress.c:3665 catalog/objectaddress.c:5589 +#: catalog/objectaddress.c:3665 #, c-format msgid "membership of role %s in role %s" msgstr "Mitgliedschaft von Rolle %s in Rolle %s" @@ -5896,12 +5918,12 @@ msgid "cannot change number of direct arguments of an aggregate function" msgstr "die Anzahl direkter Argumente einer Aggregatfunktion kann nicht geändert werden" #: catalog/pg_aggregate.c:859 commands/functioncmds.c:701 -#: commands/typecmds.c:2023 commands/typecmds.c:2069 commands/typecmds.c:2121 -#: commands/typecmds.c:2158 commands/typecmds.c:2192 commands/typecmds.c:2226 -#: commands/typecmds.c:2260 commands/typecmds.c:2289 commands/typecmds.c:2376 -#: commands/typecmds.c:2418 parser/parse_func.c:417 parser/parse_func.c:448 +#: commands/typecmds.c:2030 commands/typecmds.c:2076 commands/typecmds.c:2128 +#: commands/typecmds.c:2165 commands/typecmds.c:2199 commands/typecmds.c:2233 +#: commands/typecmds.c:2267 commands/typecmds.c:2296 commands/typecmds.c:2383 +#: commands/typecmds.c:2425 parser/parse_func.c:417 parser/parse_func.c:448 #: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 -#: parser/parse_func.c:631 parser/parse_func.c:2172 parser/parse_func.c:2445 +#: parser/parse_func.c:631 parser/parse_func.c:2170 parser/parse_func.c:2443 #, c-format msgid "function %s does not exist" msgstr "Funktion %s existiert nicht" @@ -5996,23 +6018,23 @@ msgstr "Sortierfolge »%s« existiert bereits" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert bereits" -#: catalog/pg_constraint.c:764 commands/tablecmds.c:7962 +#: catalog/pg_constraint.c:764 commands/tablecmds.c:7958 #, c-format msgid "cannot change NO INHERIT status of NOT NULL constraint \"%s\" on relation \"%s\"" msgstr "NO INHERIT-Status von NOT-NULL-Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: catalog/pg_constraint.c:766 commands/tablecmds.c:9594 +#: catalog/pg_constraint.c:766 commands/tablecmds.c:9585 #, c-format msgid "You might need to make the existing constraint inheritable using %s." msgstr "Sie müssen möglicherweise den bestehenden Constraint mit %s vererbbar machen." -#: catalog/pg_constraint.c:776 commands/tablecmds.c:8311 +#: catalog/pg_constraint.c:776 commands/tablecmds.c:8307 #, c-format msgid "incompatible NOT VALID constraint \"%s\" on relation \"%s\"" msgstr "inkompatibler NOT-VALID-Constraint »%s« für Relation »%s«" -#: catalog/pg_constraint.c:778 commands/tablecmds.c:8313 -#: commands/tablecmds.c:9606 +#: catalog/pg_constraint.c:778 commands/tablecmds.c:8309 +#: commands/tablecmds.c:9597 #, c-format msgid "You might need to validate it using %s." msgstr "Sie müssen ihn möglicherweise mit %s validieren." @@ -6062,31 +6084,41 @@ msgstr "Konversion »%s« existiert bereits" msgid "default conversion for %s to %s already exists" msgstr "Standardumwandlung von %s nach %s existiert bereits" -#: catalog/pg_depend.c:225 commands/extension.c:3818 +#: catalog/pg_depend.c:236 commands/extension.c:3818 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s ist schon Mitglied der Erweiterung »%s«" -#: catalog/pg_depend.c:232 catalog/pg_depend.c:283 commands/extension.c:3858 +#: catalog/pg_depend.c:243 catalog/pg_depend.c:294 commands/extension.c:3858 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s ist kein Mitglied der Erweiterung »%s«" -#: catalog/pg_depend.c:235 +#: catalog/pg_depend.c:246 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "Eine Erweiterung darf kein Objekt ersetzen, das ihr nicht gehört." -#: catalog/pg_depend.c:286 +#: catalog/pg_depend.c:297 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "Eine Erweiterung darf CREATE .. IF NOT EXISTS zum Überspringen der Erzeugung eines Objekts nur verwenden, wenn ihr das vorhandene Objekt schon gehört." -#: catalog/pg_depend.c:649 +#: catalog/pg_depend.c:667 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "kann Abhängigkeit von %s nicht entfernen, weil es ein Systemobjekt ist" +#: catalog/pg_depend.c:812 +#, c-format +msgid "referenced %s was concurrently dropped" +msgstr "referenziertes %s wurde gleichzeitig gelöscht" + +#: catalog/pg_depend.c:844 +#, c-format +msgid "referenced relation was concurrently dropped" +msgstr "referenzierte Relation wurde gleichzeitig gelöscht" + #: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 #, c-format msgid "invalid enum label \"%s\"" @@ -6133,7 +6165,7 @@ msgid "The partition is being detached concurrently or has an unfinished detach. msgstr "Die Partition wird nebenläufig abgetrennt oder hat eine unfertige Abtrennoperation." #: catalog/pg_inherits.c:595 commands/tablecmds.c:4926 -#: commands/tablecmds.c:17903 +#: commands/tablecmds.c:17902 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "Verwendet Sie ALTER TABLE ... DETACH PARTITION ... FINALIZE, um die unerledigte Abtrennoperation abzuschließen." @@ -6238,7 +6270,7 @@ msgstr "Negator-Operator %s ist bereits der Negator des Operators %u" msgid "parameter ACL \"%s\" does not exist" msgstr "Parameter-ACL »%s« existiert nicht" -#: catalog/pg_proc.c:158 parser/parse_func.c:2234 +#: catalog/pg_proc.c:158 parser/parse_func.c:2232 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" @@ -6508,7 +6540,7 @@ msgstr "interne Größe %d ist ungültig für Typen mit Wertübergabe" msgid "alignment \"%c\" is invalid for variable-length type" msgstr "Ausrichtung »%c« ist ungültig für Typen variabler Länge" -#: catalog/pg_type.c:325 commands/typecmds.c:4362 +#: catalog/pg_type.c:325 commands/typecmds.c:4369 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "Typen mit fester Größe müssen Storage-Typ PLAIN haben" @@ -6523,7 +6555,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:549 storage/buffer/bufmgr.c:7338 +#: catalog/storage.c:549 storage/buffer/bufmgr.c:7361 #, c-format msgid "invalid page in block %u of relation \"%s\"" msgstr "ungültige Seite in Block %u von Relation »%s«" @@ -6643,7 +6675,7 @@ msgstr "Sprache »%s« existiert bereits" msgid "publication \"%s\" already exists" msgstr "Publikation »%s« existiert bereits" -#: commands/alter.c:98 commands/subscriptioncmds.c:629 +#: commands/alter.c:98 commands/subscriptioncmds.c:655 #, c-format msgid "subscription \"%s\" already exists" msgstr "Subskription »%s« existiert bereits" @@ -6683,16 +6715,16 @@ msgstr "Textsuchekonfiguration »%s« existiert bereits in Schema »%s«" msgid "must be superuser to rename %s" msgstr "nur Superuser können %s umbenennen" -#: commands/alter.c:256 commands/subscriptioncmds.c:608 -#: commands/subscriptioncmds.c:1147 commands/subscriptioncmds.c:1231 -#: commands/subscriptioncmds.c:1991 +#: commands/alter.c:256 commands/subscriptioncmds.c:634 +#: commands/subscriptioncmds.c:1173 commands/subscriptioncmds.c:1257 +#: commands/subscriptioncmds.c:2019 #, c-format msgid "password_required=false is superuser-only" msgstr "password_required=false ist nur für Superuser" -#: commands/alter.c:257 commands/subscriptioncmds.c:609 -#: commands/subscriptioncmds.c:1148 commands/subscriptioncmds.c:1232 -#: commands/subscriptioncmds.c:1992 +#: commands/alter.c:257 commands/subscriptioncmds.c:635 +#: commands/subscriptioncmds.c:1174 commands/subscriptioncmds.c:1258 +#: commands/subscriptioncmds.c:2020 #, 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." @@ -6842,7 +6874,7 @@ msgstr "kann temporäre Tabellen anderer Sitzungen nicht clustern" msgid "there is no previously clustered index for table \"%s\"" msgstr "es gibt keinen bereits geclusterten Index für Tabelle »%s«" -#: commands/cluster.c:190 commands/tablecmds.c:16459 commands/tablecmds.c:18525 +#: commands/cluster.c:190 commands/tablecmds.c:16458 commands/tablecmds.c:18524 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "Index »%s« für Tabelle »%s« existiert nicht" @@ -6857,7 +6889,7 @@ msgstr "globaler Katalog kann nicht geclustert werden" msgid "cannot vacuum temporary tables of other sessions" msgstr "temporäre Tabellen anderer Sitzungen können nicht gevacuumt werden" -#: commands/cluster.c:507 commands/tablecmds.c:18535 +#: commands/cluster.c:507 commands/tablecmds.c:18534 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "»%s« ist kein Index für Tabelle »%s«" @@ -6922,14 +6954,14 @@ msgid "collation attribute \"%s\" not recognized" msgstr "Attribut »%s« für Sortierfolge unbekannt" #: commands/collationcmds.c:123 commands/collationcmds.c:129 -#: commands/define.c:375 commands/tablecmds.c:8404 +#: commands/define.c:375 commands/tablecmds.c:8400 #: replication/pgoutput/pgoutput.c:321 replication/pgoutput/pgoutput.c:344 #: replication/pgoutput/pgoutput.c:362 replication/pgoutput/pgoutput.c:372 #: replication/pgoutput/pgoutput.c:382 replication/pgoutput/pgoutput.c:392 -#: replication/pgoutput/pgoutput.c:404 replication/walsender.c:1137 -#: replication/walsender.c:1159 replication/walsender.c:1169 -#: replication/walsender.c:1178 replication/walsender.c:1420 -#: replication/walsender.c:1429 +#: replication/pgoutput/pgoutput.c:404 replication/walsender.c:1159 +#: replication/walsender.c:1181 replication/walsender.c:1191 +#: replication/walsender.c:1200 replication/walsender.c:1442 +#: replication/walsender.c:1451 #, c-format msgid "conflicting or redundant options" msgstr "widersprüchliche oder überflüssige Optionen" @@ -6997,11 +7029,11 @@ msgstr "Version der Standardsortierfolge kann nicht aufgefrischt werden" #. translator: %s is an SQL command #. translator: %s is an SQL ALTER command -#: commands/collationcmds.c:443 commands/subscriptioncmds.c:1445 -#: commands/tablecmds.c:8156 commands/tablecmds.c:8166 -#: commands/tablecmds.c:8168 commands/tablecmds.c:16161 -#: commands/tablecmds.c:19689 commands/tablecmds.c:19710 -#: commands/typecmds.c:3786 commands/typecmds.c:3871 commands/typecmds.c:4225 +#: commands/collationcmds.c:443 commands/subscriptioncmds.c:1471 +#: commands/tablecmds.c:8152 commands/tablecmds.c:8162 +#: commands/tablecmds.c:8164 commands/tablecmds.c:16160 +#: commands/tablecmds.c:19688 commands/tablecmds.c:19709 +#: commands/typecmds.c:3793 commands/typecmds.c:3878 commands/typecmds.c:4232 #, c-format msgid "Use %s instead." msgstr "Verwenden Sie stattdessen %s." @@ -7132,8 +7164,8 @@ msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können mit COPY in eine msgid "generated columns are not supported in COPY FROM WHERE conditions" msgstr "generierte Spalten werden in COPY-FROM-WHERE-Bedingungen nicht unterstützt" -#: commands/copy.c:184 commands/tablecmds.c:14430 commands/tablecmds.c:19836 -#: commands/tablecmds.c:19918 commands/trigger.c:660 +#: commands/copy.c:184 commands/tablecmds.c:14429 commands/tablecmds.c:19835 +#: commands/tablecmds.c:19917 commands/trigger.c:660 #: rewrite/rewriteHandler.c:985 rewrite/rewriteHandler.c:1020 #, c-format msgid "Column \"%s\" is a generated column." @@ -7301,10 +7333,10 @@ msgstr "Generierte Spalten können nicht in COPY verwendet werden." #: commands/copy.c:1045 commands/indexcmds.c:1961 commands/statscmds.c:260 #: commands/tablecmds.c:2603 commands/tablecmds.c:3111 -#: commands/tablecmds.c:3940 parser/parse_relation.c:3798 -#: parser/parse_relation.c:3808 parser/parse_relation.c:3826 -#: parser/parse_relation.c:3833 parser/parse_relation.c:3847 -#: utils/adt/tsvector_op.c:2857 +#: commands/tablecmds.c:3940 parser/parse_relation.c:3830 +#: parser/parse_relation.c:3840 parser/parse_relation.c:3858 +#: parser/parse_relation.c:3865 parser/parse_relation.c:3879 +#: utils/adt/tsvector_op.c:2830 #, c-format msgid "column \"%s\" does not exist" msgstr "Spalte »%s« existiert nicht" @@ -7967,7 +7999,7 @@ msgid "data directory with the specified OID %u already exists" msgstr "Datenverzeichnis mit der angegebenen OID %u existiert bereits" #: commands/dbcommands.c:1610 commands/dbcommands.c:1625 -#: utils/adt/pg_locale.c:1532 +#: utils/adt/pg_locale.c:1538 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "Kodierung »%s« stimmt nicht mit Locale »%s« überein" @@ -8140,7 +8172,7 @@ msgid "invalid argument for %s: \"%s\"" msgstr "ungültiges Argument für %s: »%s«" #: commands/dropcmds.c:96 commands/functioncmds.c:1400 -#: utils/adt/ruleutils.c:2956 +#: utils/adt/ruleutils.c:2958 #, c-format msgid "\"%s\" is an aggregate function" msgstr "»%s« ist eine Aggregatfunktion" @@ -8152,7 +8184,7 @@ msgstr "Verwenden Sie DROP AGGREGATE, um Aggregatfunktionen zu löschen." #: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:4024 #: commands/tablecmds.c:4185 commands/tablecmds.c:4237 -#: commands/tablecmds.c:18966 tcop/utility.c:1328 +#: commands/tablecmds.c:18965 tcop/utility.c:1328 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "Relation »%s« existiert nicht, wird übersprungen" @@ -8359,23 +8391,23 @@ msgstr "keine Berechtigung, um Eigentümer des Ereignistriggers »%s« zu änder msgid "The owner of an event trigger must be a superuser." msgstr "Der Eigentümer eines Ereignistriggers muss ein Superuser sein." -#: commands/event_trigger.c:1536 +#: commands/event_trigger.c:1544 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s kann nur in einer sql_drop-Ereignistriggerfunktion aufgerufen werden" -#: commands/event_trigger.c:1629 commands/event_trigger.c:1650 +#: commands/event_trigger.c:1637 commands/event_trigger.c:1658 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%s kann nur in einer table_rewrite-Ereignistriggerfunktion aufgerufen werden" -#: commands/event_trigger.c:2066 +#: commands/event_trigger.c:2074 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s kann nur in einer Ereignistriggerfunktion aufgerufen werden" #: commands/explain_state.c:133 commands/explain_state.c:158 -#: replication/walsender.c:1151 +#: replication/walsender.c:1173 #, c-format msgid "unrecognized value for %s option \"%s\": \"%s\"" msgstr "unbekannter Wert für %s-Option »%s«: »%s«" @@ -8674,7 +8706,7 @@ msgstr "ein Objekt dieses Typs kann nicht zu einer Erweiterung hinzugefügt werd msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "kann Schema »%s« nicht zu Erweiterung »%s« hinzufügen, weil das Schema die Erweiterung enthält" -#: commands/extension.c:3912 commands/typecmds.c:4041 utils/fmgr/funcapi.c:725 +#: commands/extension.c:3912 commands/typecmds.c:4048 utils/fmgr/funcapi.c:725 #, c-format msgid "could not find multirange type for data type %s" msgstr "konnte Multirange-Typ für Datentyp %s nicht finden" @@ -9247,7 +9279,7 @@ msgstr "%s-Constraints können nicht verwendet werden, wenn Partitionierungsschl #: parser/parse_cte.c:303 parser/parse_oper.c:221 #: utils/adt/array_userfuncs.c:1419 utils/adt/array_userfuncs.c:1562 #: utils/adt/arrayfuncs.c:3870 utils/adt/arrayfuncs.c:4425 -#: utils/adt/arrayfuncs.c:6446 utils/adt/rowtypes.c:1220 +#: utils/adt/arrayfuncs.c:6453 utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" msgstr "konnte keinen Ist-Gleich-Operator für Typ %s ermitteln" @@ -9348,7 +9380,7 @@ msgstr "inkludierte Spalte unterstützt die Optionen NULLS FIRST/LAST nicht" msgid "could not determine which collation to use for index expression" msgstr "konnte die für den Indexausdruck zu verwendende Sortierfolge nicht bestimmen" -#: commands/indexcmds.c:2099 commands/tablecmds.c:20006 commands/typecmds.c:812 +#: commands/indexcmds.c:2099 commands/tablecmds.c:20005 commands/typecmds.c:812 #: parser/parse_expr.c:2815 parser/parse_type.c:568 parser/parse_utilcmd.c:4073 #: utils/adt/misc.c:630 #, c-format @@ -9385,8 +9417,8 @@ msgstr "Zugriffsmethode »%s« unterstützt die Optionen ASC/DESC nicht" msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "Zugriffsmethode »%s« unterstützt die Optionen NULLS FIRST/LAST nicht" -#: commands/indexcmds.c:2279 commands/tablecmds.c:20031 -#: commands/tablecmds.c:20037 commands/typecmds.c:2349 +#: commands/indexcmds.c:2279 commands/tablecmds.c:20030 +#: commands/tablecmds.c:20036 commands/typecmds.c:2356 #, 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«" @@ -9402,7 +9434,7 @@ msgstr "Sie müssen für den Index eine Operatorklasse angeben oder eine Standar msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "Operatorklasse »%s« existiert nicht für Zugriffsmethode »%s«" -#: commands/indexcmds.c:2332 commands/typecmds.c:2337 +#: commands/indexcmds.c:2332 commands/typecmds.c:2344 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "Operatorklasse »%s« akzeptiert Datentyp %s nicht" @@ -9422,7 +9454,7 @@ msgstr "konnte keinen Überlappungsoperator für Typ %s ermitteln" msgid "could not identify a contained-by operator for type %s" msgstr "konnte keinen Contained-By-Operator für Typ %s ermitteln" -#: commands/indexcmds.c:2474 commands/tablecmds.c:10368 +#: commands/indexcmds.c:2474 commands/tablecmds.c:10358 #, c-format msgid "Could not translate compare type %d for operator family \"%s\" of access method \"%s\"." msgstr "Konnte Vergleichstyp %d für Operatorfamilie »%s« von Zugriffsmethode »%s« nicht übersetzen." @@ -9468,7 +9500,7 @@ msgstr "beim Reindizieren der partitionierten Tabelle »%s.%s«" msgid "while reindexing partitioned index \"%s.%s\"" msgstr "beim Reindizieren des partitionierten Index »%s.%s«" -#: commands/indexcmds.c:3532 commands/indexcmds.c:4424 +#: commands/indexcmds.c:3532 commands/indexcmds.c:4426 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "Tabelle »%s.%s« wurde neu indiziert" @@ -9498,12 +9530,12 @@ msgstr "diese Art Relation kann nicht nebenläufig reindiziert werden" msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "nicht geteilte Relation kann nicht nach Tablespace »%s« verschoben werden" -#: commands/indexcmds.c:4405 commands/indexcmds.c:4417 +#: commands/indexcmds.c:4407 commands/indexcmds.c:4419 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Index »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:4407 commands/indexcmds.c:4426 +#: commands/indexcmds.c:4409 commands/indexcmds.c:4428 #, c-format msgid "%s." msgstr "%s." @@ -9865,10 +9897,10 @@ msgstr "Operator-Attribut »%s« kann nicht geändert werden, wenn es schon gese #: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:152 #: commands/tablecmds.c:1810 commands/tablecmds.c:2410 #: commands/tablecmds.c:3834 commands/tablecmds.c:6803 -#: commands/tablecmds.c:10124 commands/tablecmds.c:19577 -#: commands/tablecmds.c:19612 commands/trigger.c:319 commands/trigger.c:1338 +#: commands/tablecmds.c:10114 commands/tablecmds.c:19576 +#: commands/tablecmds.c:19611 commands/trigger.c:319 commands/trigger.c:1338 #: commands/trigger.c:1448 rewrite/rewriteDefine.c:268 -#: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 +#: rewrite/rewriteDefine.c:764 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "keine Berechtigung: »%s« ist ein Systemkatalog" @@ -10107,7 +10139,7 @@ msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "In einer FOR-ALL-TABLES-Publikation können keine Tabellen hinzugefügt oder entfernt werden." #: commands/publicationcmds.c:1497 commands/publicationcmds.c:1536 -#: commands/publicationcmds.c:2073 utils/cache/lsyscache.c:3812 +#: commands/publicationcmds.c:2073 utils/cache/lsyscache.c:3936 #, c-format msgid "publication \"%s\" does not exist" msgstr "Publikation »%s« existiert nicht" @@ -10327,8 +10359,8 @@ msgstr "Sequenz muss im selben Schema wie die verknüpfte Tabelle sein" msgid "cannot change ownership of identity sequence" msgstr "kann Eigentümer einer Identitätssequenz nicht ändern" -#: commands/sequence.c:1671 commands/tablecmds.c:16148 -#: commands/tablecmds.c:18986 +#: commands/sequence.c:1671 commands/tablecmds.c:16147 +#: commands/tablecmds.c:18985 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Sequenz »%s« ist mit Tabelle »%s« verknüpft." @@ -10403,12 +10435,12 @@ msgstr "doppelter Spaltenname in Statistikdefinition" msgid "duplicate expression in statistics definition" msgstr "doppelter Ausdruck in Statistikdefinition" -#: commands/statscmds.c:667 commands/tablecmds.c:8949 +#: commands/statscmds.c:667 commands/tablecmds.c:8940 #, c-format msgid "statistics target %d is too low" msgstr "Statistikziel %d ist zu niedrig" -#: commands/statscmds.c:675 commands/tablecmds.c:8957 +#: commands/statscmds.c:675 commands/tablecmds.c:8948 #, c-format msgid "lowering statistics target to %d" msgstr "setze Statistikziel auf %d herab" @@ -10447,226 +10479,226 @@ msgstr "die Optionen %s und %s schließen einander aus" msgid "subscription with %s must also set %s" msgstr "Subskription mit %s muss auch %s setzen" -#: commands/subscriptioncmds.c:466 +#: commands/subscriptioncmds.c:492 #, c-format msgid "could not receive list of publications from the publisher: %s" msgstr "konnte Liste der Publikationen nicht vom Publikationsserver empfangen: %s" -#: commands/subscriptioncmds.c:498 +#: commands/subscriptioncmds.c:524 #, c-format msgid "publication %s does not exist on the publisher" msgid_plural "publications %s do not exist on the publisher" msgstr[0] "Publikation %s existiert auf dem Publikationsserver nicht" msgstr[1] "Publikationen %s existieren auf dem Publikationsserver nicht" -#: commands/subscriptioncmds.c:586 +#: commands/subscriptioncmds.c:612 #, c-format msgid "permission denied to create subscription" msgstr "keine Berechtigung, um Subskription zu erzeugen" -#: commands/subscriptioncmds.c:587 +#: commands/subscriptioncmds.c:613 #, c-format msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können Subskriptionen erzeugen." -#: commands/subscriptioncmds.c:718 commands/subscriptioncmds.c:852 -#: commands/subscriptioncmds.c:1594 +#: commands/subscriptioncmds.c:744 commands/subscriptioncmds.c:878 +#: commands/subscriptioncmds.c:1620 #, c-format msgid "subscription \"%s\" could not connect to the publisher: %s" msgstr "Subskription »%s« konnte nicht mit dem Publikationsserver verbinden: %s" -#: commands/subscriptioncmds.c:790 +#: commands/subscriptioncmds.c:816 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "Replikations-Slot »%s« wurde auf dem Publikationsserver erzeugt" -#: commands/subscriptioncmds.c:802 +#: commands/subscriptioncmds.c:828 #, c-format msgid "subscription was created, but is not connected" msgstr "Subskription wurde erzeugt, ist aber nicht verbunden" -#: commands/subscriptioncmds.c:803 +#: commands/subscriptioncmds.c:829 #, c-format msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." msgstr "Um die Replikation einzuleiten, müssen Sie den Replikations-Slot manuell erzeugen, die Subskription aktivieren und die Subskription auffrischen." -#: commands/subscriptioncmds.c:1070 +#: commands/subscriptioncmds.c:1096 #, c-format msgid "cannot set option \"%s\" for enabled subscription" msgstr "für eine aktivierte Subskription kann Option »%s« nicht gesetzt werden" -#: commands/subscriptioncmds.c:1084 +#: commands/subscriptioncmds.c:1110 #, c-format msgid "cannot set option \"%s\" for a subscription that does not have a slot name" msgstr "Option »%s« kann nicht für eine Subskription ohne Slot-Name gesetzt werden" -#: commands/subscriptioncmds.c:1127 commands/subscriptioncmds.c:1665 -#: commands/subscriptioncmds.c:2046 utils/cache/lsyscache.c:3862 +#: commands/subscriptioncmds.c:1153 commands/subscriptioncmds.c:1691 +#: commands/subscriptioncmds.c:2074 utils/cache/lsyscache.c:3986 #, c-format msgid "subscription \"%s\" does not exist" msgstr "Subskription »%s« existiert nicht" -#: commands/subscriptioncmds.c:1185 +#: commands/subscriptioncmds.c:1211 #, c-format msgid "cannot set %s for enabled subscription" msgstr "für eine aktivierte Subskription kann nicht %s gesetzt werden" -#: commands/subscriptioncmds.c:1270 +#: commands/subscriptioncmds.c:1296 #, c-format msgid "\"slot_name\" and \"two_phase\" cannot be altered at the same time" msgstr "»slot_name« und »two_phase« können nicht gleichzeitig geändert werden" -#: commands/subscriptioncmds.c:1286 +#: commands/subscriptioncmds.c:1312 #, c-format msgid "cannot alter \"two_phase\" when logical replication worker is still running" msgstr "»two_phase« kann nicht geändert werden, wenn ein Replikationsarbeitsprozess noch läuft" -#: commands/subscriptioncmds.c:1287 +#: commands/subscriptioncmds.c:1313 #, c-format msgid "Try again after some time." msgstr "Versuchen Sie es nach einer Weile erneut." -#: commands/subscriptioncmds.c:1300 +#: commands/subscriptioncmds.c:1326 #, c-format msgid "cannot disable \"two_phase\" when prepared transactions exist" msgstr "»two_phase« kann nicht ausgeschaltet werden, wenn vorbereitete Transaktionen existieren" -#: commands/subscriptioncmds.c:1301 +#: commands/subscriptioncmds.c:1327 #, c-format msgid "Resolve these transactions and try again." msgstr "Lösen Sie diese Transaktionen auf und versuchen Sie erneut." -#: commands/subscriptioncmds.c:1348 +#: commands/subscriptioncmds.c:1374 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "eine Subskription ohne Slot-Name kann nicht aktiviert werden" -#: commands/subscriptioncmds.c:1392 commands/subscriptioncmds.c:1443 +#: commands/subscriptioncmds.c:1418 commands/subscriptioncmds.c:1469 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION mit Refresh ist für deaktivierte Subskriptionen nicht erlaubt" -#: commands/subscriptioncmds.c:1393 +#: commands/subscriptioncmds.c:1419 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Verwenden Sie ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1402 commands/subscriptioncmds.c:1457 +#: commands/subscriptioncmds.c:1428 commands/subscriptioncmds.c:1483 #, c-format msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" msgstr "ALTER SUBSCRIPTION mit »refresh« und »copy_data« ist nicht erlaubt, wenn »two_phase« eingeschaltet ist" -#: commands/subscriptioncmds.c:1403 +#: commands/subscriptioncmds.c:1429 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "Verwenden Sie ALTER SUBSCRIPTION ... SET PUBLICATION mit refresh = false, oder mit copy_data = false, oder verwenden Sie DROP/CREATE SUBSCRIPTION." #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1459 +#: commands/subscriptioncmds.c:1485 #, c-format msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "Verwenden Sie %s mit refresh = false, oder mit copy_data = false, oder verwenden Sie DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1481 +#: commands/subscriptioncmds.c:1507 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH ist für eine deaktivierte Subskription nicht erlaubt" -#: commands/subscriptioncmds.c:1506 +#: commands/subscriptioncmds.c:1532 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" msgstr "ALTER SUBSCRIPTION ... REFRESH mit »copy_data« ist nicht erlaubt, wenn »two_phase« eingeschaltet ist" -#: commands/subscriptioncmds.c:1507 +#: commands/subscriptioncmds.c:1533 #, c-format msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "Verwenden Sie ALTER SUBSCRIPTION ... REFRESH mit copy_data = false, oder verwenden Sie DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1542 +#: commands/subscriptioncmds.c:1568 #, c-format msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" msgstr "zu überspringende WAL-Position (LSN %X/%X) muss größer als Origin-LSN %X/%X sein" -#: commands/subscriptioncmds.c:1669 +#: commands/subscriptioncmds.c:1695 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "Subskription »%s« existiert nicht, wird übersprungen" -#: commands/subscriptioncmds.c:1936 +#: commands/subscriptioncmds.c:1964 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "Replikations-Slot »%s« auf dem Publikationsserver wurde gelöscht" -#: commands/subscriptioncmds.c:1945 commands/subscriptioncmds.c:1953 +#: commands/subscriptioncmds.c:1973 commands/subscriptioncmds.c:1981 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "konnte Replikations-Slot »%s« auf dem Publikationsserver nicht löschen: %s" -#: commands/subscriptioncmds.c:2078 +#: commands/subscriptioncmds.c:2106 #, c-format msgid "subscription with OID %u does not exist" msgstr "Subskription mit OID %u existiert nicht" -#: commands/subscriptioncmds.c:2152 commands/subscriptioncmds.c:2276 +#: commands/subscriptioncmds.c:2185 commands/subscriptioncmds.c:2309 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "konnte Liste der replizierten Tabellen nicht vom Publikationsserver empfangen: %s" -#: commands/subscriptioncmds.c:2188 +#: commands/subscriptioncmds.c:2221 #, c-format msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" msgstr "Subskription »%s« verlangte copy_data mit origin = NONE, aber könnte Daten kopieren, die einen anderen Origin hatten" -#: commands/subscriptioncmds.c:2190 +#: commands/subscriptioncmds.c:2223 #, c-format msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." msgstr[0] "Die zu erzeugende Subskription hat eine Publikation (%s) abonniert, die Tabellen enthält, in die von anderen Subskriptionen geschrieben wird." msgstr[1] "Die zu erzeugende Subskription hat Publikationen (%s) abonniert, die Tabellen enthalten, in die von anderen Subskriptionen geschrieben wird." -#: commands/subscriptioncmds.c:2193 +#: commands/subscriptioncmds.c:2226 #, c-format msgid "Verify that initial data copied from the publisher tables did not come from other origins." msgstr "Überprüfen Sie, dass die von den publizierten Tabellen kopierten initialen Daten nicht von anderen Origins kamen." -#: commands/subscriptioncmds.c:2298 replication/logical/tablesync.c:933 +#: commands/subscriptioncmds.c:2331 replication/logical/tablesync.c:933 #: replication/pgoutput/pgoutput.c:1189 #, 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" -#: commands/subscriptioncmds.c:2348 +#: commands/subscriptioncmds.c:2381 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" msgstr "konnte beim Versuch den Replikations-Slot »%s« zu löschen nicht mit dem Publikationsserver verbinden: %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2351 +#: commands/subscriptioncmds.c:2384 #, c-format msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." msgstr "Verwenden Sie %s, um die Subskription zu deaktivieren, und dann %s, um sie vom Slot zu trennen." -#: commands/subscriptioncmds.c:2382 +#: commands/subscriptioncmds.c:2415 #, c-format msgid "publication name \"%s\" used more than once" msgstr "Publikationsname »%s« mehrmals angegeben" -#: commands/subscriptioncmds.c:2426 +#: commands/subscriptioncmds.c:2459 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "Publikation »%s« ist bereits in Subskription »%s«" -#: commands/subscriptioncmds.c:2440 +#: commands/subscriptioncmds.c:2473 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "Publikation »%s« ist nicht in Subskription »%s«" -#: commands/subscriptioncmds.c:2451 +#: commands/subscriptioncmds.c:2484 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "kann nicht alle Publikationen von einer Subskription löschen" -#: commands/subscriptioncmds.c:2508 +#: commands/subscriptioncmds.c:2541 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s erfordert einen Boole’schen Wert oder »parallel«" @@ -10727,7 +10759,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:282 commands/tablecmds.c:306 commands/tablecmds.c:21663 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 commands/tablecmds.c:21662 #: parser/parse_utilcmd.c:2432 #, c-format msgid "index \"%s\" does not exist" @@ -10751,8 +10783,8 @@ msgstr "»%s« ist kein Typ" msgid "Use DROP TYPE to remove a type." msgstr "Verwenden Sie DROP TYPE, um einen Typen zu löschen." -#: commands/tablecmds.c:294 commands/tablecmds.c:15987 -#: commands/tablecmds.c:18688 +#: commands/tablecmds.c:294 commands/tablecmds.c:15986 +#: commands/tablecmds.c:18687 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "Fremdtabelle »%s« existiert nicht" @@ -10781,7 +10813,7 @@ msgstr "partitionierte Tabellen können nicht ungeloggt sein" msgid "cannot create temporary table within security-restricted operation" msgstr "kann temporäre Tabelle nicht in einer sicherheitsbeschränkten Operation erzeugen" -#: commands/tablecmds.c:876 commands/tablecmds.c:17412 +#: commands/tablecmds.c:876 commands/tablecmds.c:17411 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "von der Relation »%s« würde mehrmals geerbt werden" @@ -10806,13 +10838,13 @@ msgstr "kann keine Fremdpartition der partitionierten Tabelle »%s« erzeugen" msgid "Table \"%s\" contains indexes that are unique." msgstr "Tabelle »%s« enthält Unique Indexe." -#: commands/tablecmds.c:1425 commands/tablecmds.c:14964 +#: commands/tablecmds.c:1425 commands/tablecmds.c:14963 #, c-format msgid "too many array dimensions" msgstr "zu viele Array-Dimensionen" #: commands/tablecmds.c:1430 parser/parse_clause.c:772 -#: parser/parse_relation.c:1929 +#: parser/parse_relation.c:1961 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "Spalte »%s« kann nicht als SETOF deklariert werden" @@ -10857,7 +10889,7 @@ msgstr "kann Fremdtabelle »%s« nicht leeren" msgid "cannot truncate temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht leeren" -#: commands/tablecmds.c:2685 commands/tablecmds.c:17309 +#: commands/tablecmds.c:2685 commands/tablecmds.c:17308 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "von partitionierter Tabelle »%s« kann nicht geerbt werden" @@ -10878,18 +10910,18 @@ msgstr "geerbte Relation »%s« ist keine Tabelle oder Fremdtabelle" msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "eine temporäre Relation kann nicht als Partition der permanenten Relation »%s« erzeugt werden" -#: commands/tablecmds.c:2719 commands/tablecmds.c:17288 +#: commands/tablecmds.c:2719 commands/tablecmds.c:17287 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "von temporärer Relation »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2729 commands/tablecmds.c:17296 +#: commands/tablecmds.c:2729 commands/tablecmds.c:17295 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "von temporärer Relation einer anderen Sitzung kann nicht geerbt werden" #: commands/tablecmds.c:2884 commands/tablecmds.c:2938 -#: commands/tablecmds.c:14647 parser/parse_utilcmd.c:1440 +#: commands/tablecmds.c:14646 parser/parse_utilcmd.c:1440 #: parser/parse_utilcmd.c:1484 parser/parse_utilcmd.c:1916 #: parser/parse_utilcmd.c:2024 #, c-format @@ -10927,13 +10959,13 @@ msgid "A child table column cannot be generated unless its parent column is." msgstr "Eine Spalte einer abgeleiteten Tabelle kann nur generiert sein, wenn die Spalte in der Elterntabelle es auch ist." #: commands/tablecmds.c:3082 commands/tablecmds.c:3376 -#: commands/tablecmds.c:17574 +#: commands/tablecmds.c:17573 #, c-format msgid "column \"%s\" inherits from generated column of different kind" msgstr "Spalte »%s« erbt von einer generierten Spalte einer anderen Art" #: commands/tablecmds.c:3084 commands/tablecmds.c:3378 -#: commands/tablecmds.c:17575 +#: commands/tablecmds.c:17574 #, c-format msgid "Parent column is %s, child column is %s." msgstr "Spalte in Elterntabelle ist %s, Spalte in abgeleiteter Tabelle ist %s." @@ -10986,11 +11018,11 @@ msgstr "für Spalte »%s« besteht ein Typkonflikt" #: commands/tablecmds.c:3278 commands/tablecmds.c:3312 #: commands/tablecmds.c:3328 commands/tablecmds.c:3444 #: commands/tablecmds.c:3472 commands/tablecmds.c:3488 -#: parser/parse_coerce.c:2190 parser/parse_coerce.c:2210 -#: parser/parse_coerce.c:2230 parser/parse_coerce.c:2251 -#: parser/parse_coerce.c:2306 parser/parse_coerce.c:2340 -#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 -#: parser/parse_coerce.c:2486 parser/parse_coerce.c:2553 +#: parser/parse_coerce.c:2189 parser/parse_coerce.c:2209 +#: parser/parse_coerce.c:2229 parser/parse_coerce.c:2250 +#: parser/parse_coerce.c:2305 parser/parse_coerce.c:2339 +#: parser/parse_coerce.c:2415 parser/parse_coerce.c:2446 +#: parser/parse_coerce.c:2485 parser/parse_coerce.c:2552 #: parser/parse_param.c:224 #, c-format msgid "%s versus %s" @@ -11002,7 +11034,7 @@ msgid "column \"%s\" has a collation conflict" msgstr "für Spalte »%s« besteht ein Sortierfolgenkonflikt" #: commands/tablecmds.c:3292 commands/tablecmds.c:3458 -#: commands/tablecmds.c:7287 parser/parse_expr.c:4792 +#: commands/tablecmds.c:7287 parser/parse_expr.c:4802 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "»%s« gegen »%s«" @@ -11205,12 +11237,12 @@ msgstr "zu einer getypten Tabelle kann keine Spalte hinzugefügt werden" msgid "cannot add column to a partition" msgstr "zu einer Partition kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:7279 commands/tablecmds.c:17530 +#: commands/tablecmds.c:7279 commands/tablecmds.c:17529 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:7285 commands/tablecmds.c:17536 +#: commands/tablecmds.c:7285 commands/tablecmds.c:17535 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Sortierfolge für Spalte »%s«" @@ -11240,19 +11272,19 @@ msgstr "Spalte »%s« von Relation »%s« existiert bereits, wird übersprungen" msgid "column \"%s\" of relation \"%s\" already exists" msgstr "Spalte »%s« von Relation »%s« existiert bereits" -#: commands/tablecmds.c:7779 commands/tablecmds.c:7946 -#: commands/tablecmds.c:8147 commands/tablecmds.c:8278 -#: commands/tablecmds.c:8432 commands/tablecmds.c:8526 -#: commands/tablecmds.c:8629 commands/tablecmds.c:8825 -#: commands/tablecmds.c:8991 commands/tablecmds.c:9082 -#: commands/tablecmds.c:9216 commands/tablecmds.c:14419 -#: commands/tablecmds.c:16010 commands/tablecmds.c:18777 +#: commands/tablecmds.c:7779 commands/tablecmds.c:7942 +#: commands/tablecmds.c:8143 commands/tablecmds.c:8274 +#: commands/tablecmds.c:8428 commands/tablecmds.c:8522 +#: commands/tablecmds.c:8625 commands/tablecmds.c:8816 +#: commands/tablecmds.c:8982 commands/tablecmds.c:9073 +#: commands/tablecmds.c:9207 commands/tablecmds.c:14418 +#: commands/tablecmds.c:16009 commands/tablecmds.c:18776 #, c-format msgid "cannot alter system column \"%s\"" msgstr "Systemspalte »%s« kann nicht geändert werden" -#: commands/tablecmds.c:7785 commands/tablecmds.c:8153 -#: commands/tablecmds.c:14180 +#: commands/tablecmds.c:7785 commands/tablecmds.c:8149 +#: commands/tablecmds.c:14179 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "Spalte »%s« von Relation »%s« ist eine Identitätsspalte" @@ -11262,1043 +11294,1048 @@ msgstr "Spalte »%s« von Relation »%s« ist eine Identitätsspalte" msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "Spalte »%s« ist in Elterntabelle als NOT NULL markiert" -#: commands/tablecmds.c:8024 commands/tablecmds.c:10023 +#: commands/tablecmds.c:8020 commands/tablecmds.c:10013 #, c-format msgid "constraint must be added to child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen hinzugefügt werden" -#: commands/tablecmds.c:8025 commands/tablecmds.c:8256 -#: commands/tablecmds.c:8388 commands/tablecmds.c:8505 -#: commands/tablecmds.c:9389 commands/tablecmds.c:12217 +#: commands/tablecmds.c:8021 commands/tablecmds.c:8252 +#: commands/tablecmds.c:8384 commands/tablecmds.c:8501 +#: commands/tablecmds.c:9380 commands/tablecmds.c:12207 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Lassen Sie das Schlüsselwort ONLY weg." -#: commands/tablecmds.c:8162 +#: commands/tablecmds.c:8158 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "Spalte »%s« von Relation »%s« ist eine generierte Spalte" -#: commands/tablecmds.c:8255 +#: commands/tablecmds.c:8251 #, c-format msgid "cannot add identity to a column of only the partitioned table" msgstr "Identität kann nicht einer Spalte nur in der partitionierten Tabelle hinzugefügt werden" -#: commands/tablecmds.c:8261 +#: commands/tablecmds.c:8257 #, c-format msgid "cannot add identity to a column of a partition" msgstr "zu einer Spalte einer Partition kann keine Identität hinzugefügt werden" -#: commands/tablecmds.c:8289 +#: commands/tablecmds.c:8285 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "Spalte »%s« von Relation »%s« muss als NOT NULL deklariert werden, bevor Sie Identitätsspalte werden kann" -#: commands/tablecmds.c:8320 +#: commands/tablecmds.c:8316 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "Spalte »%s« von Relation »%s« ist bereits eine Identitätsspalte" -#: commands/tablecmds.c:8326 +#: commands/tablecmds.c:8322 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "Spalte »%s« von Relation »%s« hat bereits einen Vorgabewert" -#: commands/tablecmds.c:8387 +#: commands/tablecmds.c:8383 #, c-format msgid "cannot change identity column of only the partitioned table" msgstr "Identitätsspalte kann nicht nur in der partitionierten Tabelle geändert werden" -#: commands/tablecmds.c:8393 +#: commands/tablecmds.c:8389 #, c-format msgid "cannot change identity column of a partition" msgstr "Identitätsspalte einer Partition kann nicht geändert werden" -#: commands/tablecmds.c:8438 commands/tablecmds.c:8534 +#: commands/tablecmds.c:8434 commands/tablecmds.c:8530 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "Spalte »%s« von Relation »%s« ist keine Identitätsspalte" -#: commands/tablecmds.c:8504 +#: commands/tablecmds.c:8500 #, c-format msgid "cannot drop identity from a column of only the partitioned table" msgstr "Identität kann nicht von einer Spalte nur in der partitionierten Tabelle gelöscht werden" -#: commands/tablecmds.c:8510 +#: commands/tablecmds.c:8506 #, c-format msgid "cannot drop identity from a column of a partition" msgstr "Identität kann nicht von einer Spalte einer Partition gelöscht werden" -#: commands/tablecmds.c:8539 +#: commands/tablecmds.c:8535 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "Spalte »%s« von Relation »%s« ist keine Identitätsspalte, wird übersprungen" -#: commands/tablecmds.c:8636 commands/tablecmds.c:8846 +#: commands/tablecmds.c:8632 commands/tablecmds.c:8837 #, c-format msgid "column \"%s\" of relation \"%s\" is not a generated column" msgstr "Spalte »%s« von Relation »%s« ist keine generierte Spalte" -#: commands/tablecmds.c:8647 +#: commands/tablecmds.c:8643 #, c-format msgid "ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns in tables with check constraints" msgstr "ALTER TABLE / SET EXPRESSION wird nicht unterstützt für virtuelle generierte Spalten in Tabellen mit Check-Constraints" -#: commands/tablecmds.c:8648 commands/tablecmds.c:8666 -#: commands/tablecmds.c:8838 +#: commands/tablecmds.c:8644 commands/tablecmds.c:8662 +#: commands/tablecmds.c:8829 #, c-format msgid "Column \"%s\" of relation \"%s\" is a virtual generated column." msgstr "Spalte »%s« von Relation »%s« ist eine virtuelle generierte Spalte." -#: commands/tablecmds.c:8665 +#: commands/tablecmds.c:8661 #, c-format msgid "ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns in tables that are part of a publication" msgstr "ALTER TABLE / SET EXPRESSION wird nicht unterstützt für virtuelle generierte Spalten in Tabellen, die Teil einer Publikation sind" -#: commands/tablecmds.c:8772 +#: commands/tablecmds.c:8763 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION muss auch auf abgeleitete Tabellen angewendet werden" -#: commands/tablecmds.c:8794 +#: commands/tablecmds.c:8785 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "Generierungsausdruck von vererbter Spalte kann nicht gelöscht werden" -#: commands/tablecmds.c:8837 +#: commands/tablecmds.c:8828 #, c-format msgid "ALTER TABLE / DROP EXPRESSION is not supported for virtual generated columns" msgstr "ALTER TABLE / DROP EXPRESSION wird für virtuelle generierte Spalten nicht unterstützt" -#: commands/tablecmds.c:8851 +#: commands/tablecmds.c:8842 #, c-format msgid "column \"%s\" of relation \"%s\" is not a generated column, skipping" msgstr "Spalte »%s« von Relation »%s« ist keine generierte Spalte, wird übersprungen" -#: commands/tablecmds.c:8929 +#: commands/tablecmds.c:8920 #, c-format msgid "cannot refer to non-index column by number" msgstr "auf eine Nicht-Index-Spalte kann nicht per Nummer verwiesen werden" -#: commands/tablecmds.c:8981 +#: commands/tablecmds.c:8972 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "Spalte Nummer %d von Relation »%s« existiert nicht" -#: commands/tablecmds.c:9001 +#: commands/tablecmds.c:8992 #, c-format msgid "cannot alter statistics on virtual generated column \"%s\"" msgstr "Statistiken von virtueller generierter Spalte »%s« können nicht geändert werden" -#: commands/tablecmds.c:9010 +#: commands/tablecmds.c:9001 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "Statistiken von eingeschlossener Spalte »%s« von Index »%s« können nicht geändert werden" -#: commands/tablecmds.c:9015 +#: commands/tablecmds.c:9006 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "kann Statistiken von Spalte »%s« von Index »%s«, welche kein Ausdruck ist, nicht ändern" -#: commands/tablecmds.c:9017 +#: commands/tablecmds.c:9008 #, c-format msgid "Alter statistics on table column instead." msgstr "Ändern Sie stattdessen die Statistiken für die Tabellenspalte." -#: commands/tablecmds.c:9263 +#: commands/tablecmds.c:9254 #, c-format msgid "cannot drop column from typed table" msgstr "aus einer getypten Tabelle können keine Spalten gelöscht werden" -#: commands/tablecmds.c:9327 +#: commands/tablecmds.c:9318 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Spalte »%s« von Relation »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:9340 +#: commands/tablecmds.c:9331 #, c-format msgid "cannot drop system column \"%s\"" msgstr "Systemspalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:9350 +#: commands/tablecmds.c:9341 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "geerbte Spalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:9363 +#: commands/tablecmds.c:9354 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "Spalte »%s« kann nicht gelöscht werden, weil sie Teil des Partitionierungsschlüssels von Relation »%s« ist" -#: commands/tablecmds.c:9388 +#: commands/tablecmds.c:9379 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "Spalte kann nicht nur aus der partitionierten Tabelle gelöscht werden, wenn Partitionen existieren" -#: commands/tablecmds.c:9553 +#: commands/tablecmds.c:9544 #, c-format msgid "column \"%s\" of table \"%s\" is not marked NOT NULL" msgstr "Spalte »%s« von Tabelle »%s« ist nicht als NOT NULL markiert" -#: commands/tablecmds.c:9589 commands/tablecmds.c:9601 +#: commands/tablecmds.c:9580 commands/tablecmds.c:9592 #, c-format msgid "cannot create primary key on column \"%s\"" msgstr "kann keinen Primärschlüssel über Spalte »%s« erzeugen" #. translator: fourth %s is a constraint characteristic such as NOT VALID -#: commands/tablecmds.c:9591 commands/tablecmds.c:9603 +#: commands/tablecmds.c:9582 commands/tablecmds.c:9594 #, c-format msgid "The constraint \"%s\" on column \"%s\" of table \"%s\", marked %s, is incompatible with a primary key." msgstr "Der Constraint »%s« für Spalte »%s« von Tabelle »%s«, markiert als %s, ist inkompatibel mit einem Primärschlüssel." -#: commands/tablecmds.c:9727 +#: commands/tablecmds.c:9718 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX wird für partitionierte Tabellen nicht unterstützt" -#: commands/tablecmds.c:9752 +#: commands/tablecmds.c:9743 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX benennt Index »%s« um in »%s«" -#: commands/tablecmds.c:10110 +#: commands/tablecmds.c:10100 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "ONLY nicht möglich für Fremdschlüssel für partitionierte Tabelle »%s« verweisend auf Relation »%s«" -#: commands/tablecmds.c:10118 commands/tablecmds.c:10745 +#: commands/tablecmds.c:10108 commands/tablecmds.c:10735 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "Relation »%s«, auf die verwiesen wird, ist keine Tabelle" -#: commands/tablecmds.c:10141 +#: commands/tablecmds.c:10131 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "Constraints für permanente Tabellen dürfen nur auf permanente Tabellen verweisen" -#: commands/tablecmds.c:10148 +#: commands/tablecmds.c:10138 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "Constraints für ungeloggte Tabellen dürfen nur auf permanente oder ungeloggte Tabellen verweisen" -#: commands/tablecmds.c:10154 +#: commands/tablecmds.c:10144 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "Constraints für temporäre Tabellen dürfen nur auf temporäre Tabellen verweisen" -#: commands/tablecmds.c:10158 +#: commands/tablecmds.c:10148 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "Constraints für temporäre Tabellen müssen temporäre Tabellen dieser Sitzung beinhalten" -#: commands/tablecmds.c:10173 commands/tablecmds.c:10201 +#: commands/tablecmds.c:10163 commands/tablecmds.c:10191 #, c-format msgid "foreign key uses PERIOD on the referenced table but not the referencing table" msgstr "Fremdschlüssel verwendet PERIOD für die Tabelle, auf die verwiesen wird, aber nicht für die verweisende Tabelle" -#: commands/tablecmds.c:10213 +#: commands/tablecmds.c:10203 #, c-format msgid "foreign key uses PERIOD on the referencing table but not the referenced table" msgstr "Fremdschlüssel verwendet PERIOD für die verweisende Tabelle, aber nicht für die Tabelle, auf die verwiesen wird" -#: commands/tablecmds.c:10227 +#: commands/tablecmds.c:10217 #, c-format msgid "foreign key must use PERIOD when referencing a primary key using WITHOUT OVERLAPS" msgstr "Fremdschlüssel muss PERIOD verwenden, wenn auf einen Primärschlüssel verwiesen wird, der WITHOUT OVERLAPS verwendet" -#: commands/tablecmds.c:10251 commands/tablecmds.c:10257 +#: commands/tablecmds.c:10241 commands/tablecmds.c:10247 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "ungültige %s-Aktion für Fremdschlüssel-Constraint, der eine generierte Spalte enthält" -#: commands/tablecmds.c:10272 +#: commands/tablecmds.c:10262 #, c-format msgid "foreign key constraints on virtual generated columns are not supported" msgstr "Fremdschlüssel-Constraints für virtuelle generierte Spalten werden nicht unterstützt" -#: commands/tablecmds.c:10286 commands/tablecmds.c:10295 +#: commands/tablecmds.c:10276 commands/tablecmds.c:10285 #, c-format msgid "unsupported %s action for foreign key constraint using PERIOD" msgstr "nicht unterstützte %s-Aktion für Fremdschlüssel-Constraint, der PERIOD verwendet" -#: commands/tablecmds.c:10310 +#: commands/tablecmds.c:10300 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "Anzahl der Quell- und Zielspalten im Fremdschlüssel stimmt nicht überein" -#: commands/tablecmds.c:10366 +#: commands/tablecmds.c:10356 #, c-format msgid "could not identify an overlaps operator for foreign key" msgstr "konnte keinen Überlappungsoperator für den Fremdschlüssel ermitteln" -#: commands/tablecmds.c:10367 +#: commands/tablecmds.c:10357 #, c-format msgid "could not identify an equality operator for foreign key" msgstr "konnte keinen Ist-Gleich-Operator für den Fremdschlüssel ermitteln" -#: commands/tablecmds.c:10432 commands/tablecmds.c:10466 +#: commands/tablecmds.c:10422 commands/tablecmds.c:10456 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "Fremdschlüssel-Constraint »%s« kann nicht implementiert werden" -#: commands/tablecmds.c:10434 +#: commands/tablecmds.c:10424 #, c-format msgid "Key columns \"%s\" of the referencing table and \"%s\" of the referenced table are of incompatible types: %s and %s." msgstr "Schlüsselspalten »%s« der referenzierenden Tabelle und »%s« der referenzierten Tabelle haben inkompatible Typen: %s und %s." -#: commands/tablecmds.c:10467 +#: commands/tablecmds.c:10457 #, c-format msgid "Key columns \"%s\" of the referencing table and \"%s\" of the referenced table have incompatible collations: \"%s\" and \"%s\". If either collation is nondeterministic, then both collations have to be the same." msgstr "Schlüsselspalten »%s« der referenzierenden Tabelle und »%s« der referenzierten Tabelle haben inkompatible Sortierfolgen: »%s« und »%s«. Wenn eine der Sortierfolgen nichtdeterministisch ist, dann müssen beide Sortierfolgen die selbe sein." -#: commands/tablecmds.c:10673 +#: commands/tablecmds.c:10663 #, c-format msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "Spalte »%s«, auf die in der ON-DELETE-SET-Aktion verwiesen wird, muss Teil des Fremdschlüssels sein" -#: commands/tablecmds.c:11057 commands/tablecmds.c:11490 +#: commands/tablecmds.c:11047 commands/tablecmds.c:11480 #: parser/parse_utilcmd.c:941 parser/parse_utilcmd.c:1086 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "Fremdschlüssel-Constraints auf Fremdtabellen werden nicht unterstützt" -#: commands/tablecmds.c:11473 +#: commands/tablecmds.c:11463 #, c-format msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" msgstr "kann Tabelle »%s« nicht als Partition anfügen, weil auf sie von Fremdschlüssel »%s« verwiesen wird" -#: commands/tablecmds.c:11754 +#: commands/tablecmds.c:11744 #, c-format msgid "constraint \"%s\" enforceability conflicts with constraint \"%s\" on relation \"%s\"" msgstr "ENFORCED-Einstellung von Constraint »%s« kollidiert mit Constraint »%s« für Relation »%s«" -#: commands/tablecmds.c:12216 +#: commands/tablecmds.c:12206 #, c-format msgid "constraint must be altered in child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen geändert werden" -#: commands/tablecmds.c:12245 commands/tablecmds.c:12944 -#: commands/tablecmds.c:14059 commands/tablecmds.c:14288 +#: commands/tablecmds.c:12235 commands/tablecmds.c:12940 +#: commands/tablecmds.c:14058 commands/tablecmds.c:14287 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "Constraint »%s« von Relation »%s« existiert nicht" -#: commands/tablecmds.c:12252 +#: commands/tablecmds.c:12242 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "Constraint »%s« von Relation »%s« ist kein Fremdschlüssel-Constraint" -#: commands/tablecmds.c:12257 +#: commands/tablecmds.c:12247 #, c-format msgid "cannot alter enforceability of constraint \"%s\" of relation \"%s\"" msgstr "ENFORCED-Einstellung des Constraints »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:12263 +#: commands/tablecmds.c:12253 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a not-null constraint" msgstr "Constraint »%s« von Relation »%s« ist kein Not-Null-Constraint" -#: commands/tablecmds.c:12271 +#: commands/tablecmds.c:12259 +#, c-format +msgid "not-null constraint \"%s\" on partitioned table \"%s\" cannot be NO INHERIT" +msgstr "Not-Null-Constraint »%s« für partitionierte Tabelle »%s« kann nicht NO INHERIT sein" + +#: commands/tablecmds.c:12267 #, c-format msgid "cannot alter inherited constraint \"%s\" on relation \"%s\"" msgstr "geerbter Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:12311 +#: commands/tablecmds.c:12307 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:12314 +#: commands/tablecmds.c:12310 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "Constraint »%s« ist von Constraint »%s« von Relation »%s« abgeleitet." -#: commands/tablecmds.c:12316 +#: commands/tablecmds.c:12312 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "Sie können stattdessen den Constraint, von dem er abgeleitet ist, ändern." -#: commands/tablecmds.c:12953 +#: commands/tablecmds.c:12949 #, c-format msgid "cannot validate constraint \"%s\" of relation \"%s\"" msgstr "Constraint »%s« von Relation »%s« kann nicht validiert werden" -#: commands/tablecmds.c:12955 +#: commands/tablecmds.c:12951 #, c-format msgid "This operation is not supported for this type of constraint." msgstr "Diese Operation wird für diese Art von Constraint nicht unterstützt." -#: commands/tablecmds.c:12960 +#: commands/tablecmds.c:12956 #, c-format msgid "cannot validate NOT ENFORCED constraint" msgstr "auf NOT ENFORCED gesetzter Constraint kann nicht validiert werden" -#: commands/tablecmds.c:13169 commands/tablecmds.c:13269 +#: commands/tablecmds.c:13168 commands/tablecmds.c:13268 #, c-format msgid "constraint must be validated on child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen validiert werden" -#: commands/tablecmds.c:13346 +#: commands/tablecmds.c:13345 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "Spalte »%s«, die im Fremdschlüssel verwendet wird, existiert nicht" -#: commands/tablecmds.c:13352 +#: commands/tablecmds.c:13351 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "Systemspalten können nicht in Fremdschlüsseln verwendet werden" -#: commands/tablecmds.c:13356 +#: commands/tablecmds.c:13355 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "Fremdschlüssel kann nicht mehr als %d Schlüssel haben" -#: commands/tablecmds.c:13424 +#: commands/tablecmds.c:13423 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "aufschiebbarer Primärschlüssel kann nicht für Tabelle »%s«, auf die verwiesen wird, verwendet werden" -#: commands/tablecmds.c:13441 +#: commands/tablecmds.c:13440 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "in Tabelle »%s«, auf die verwiesen wird, gibt es keinen Primärschlüssel" -#: commands/tablecmds.c:13514 +#: commands/tablecmds.c:13513 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "die Liste der Spalten, auf die ein Fremdschlüssel verweist, darf keine doppelten Einträge enthalten" -#: commands/tablecmds.c:13617 +#: commands/tablecmds.c:13616 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "aufschiebbarer Unique-Constraint kann nicht für Tabelle »%s«, auf die verwiesen wird, verwendet werden" -#: commands/tablecmds.c:13622 +#: commands/tablecmds.c:13621 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "in Tabelle »%s«, auf die verwiesen wird, gibt es keinen Unique-Constraint, der auf die angegebenen Schlüssel passt" -#: commands/tablecmds.c:14063 +#: commands/tablecmds.c:14062 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Constraint »%s« von Relation »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:14108 +#: commands/tablecmds.c:14107 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "geerbter Constraint »%s« von Relation »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:14160 +#: commands/tablecmds.c:14159 #, c-format msgid "column \"%s\" is in a primary key" msgstr "Spalte »%s« ist in einem Primärschlüssel" -#: commands/tablecmds.c:14168 +#: commands/tablecmds.c:14167 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "Spalte »%s« ist in einem Index, der als Replik-Identität verwendet wird" -#: commands/tablecmds.c:14401 +#: commands/tablecmds.c:14400 #, c-format msgid "cannot alter column type of typed table" msgstr "Spaltentyp einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:14429 +#: commands/tablecmds.c:14428 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "USING kann nicht angegeben werden, wenn der Typ einer generierten Spalte geändert wird" -#: commands/tablecmds.c:14441 +#: commands/tablecmds.c:14440 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht ändern" -#: commands/tablecmds.c:14450 +#: commands/tablecmds.c:14449 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "Spalte »%s« kann nicht geändert werden, weil sie Teil des Partitionierungsschlüssels von Relation »%s« ist" -#: commands/tablecmds.c:14505 +#: commands/tablecmds.c:14504 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "Ergebnis der USING-Klausel für Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:14508 +#: commands/tablecmds.c:14507 #, c-format msgid "You might need to add an explicit cast." msgstr "Sie müssen möglicherweise eine ausdrückliche Typumwandlung hinzufügen." -#: commands/tablecmds.c:14512 +#: commands/tablecmds.c:14511 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:14516 +#: commands/tablecmds.c:14515 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Sie müssen möglicherweise »USING %s::%s« angeben." -#: commands/tablecmds.c:14619 +#: commands/tablecmds.c:14618 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "geerbte Spalte »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:14648 +#: commands/tablecmds.c:14647 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING-Ausdruck enthält einen Verweis auf die ganze Zeile der Tabelle." -#: commands/tablecmds.c:14659 +#: commands/tablecmds.c:14658 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "Typ der vererbten Spalte »%s« muss ebenso in den abgeleiteten Tabellen geändert werden" -#: commands/tablecmds.c:14784 +#: commands/tablecmds.c:14783 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "Typ der Spalte »%s« kann nicht zweimal geändert werden" -#: commands/tablecmds.c:14822 +#: commands/tablecmds.c:14821 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "Generierungsausdruck der Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:14827 +#: commands/tablecmds.c:14826 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "Vorgabewert der Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:15131 +#: commands/tablecmds.c:15130 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "Typ einer Spalte, die von einer Funktion oder Prozedur verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:15132 commands/tablecmds.c:15147 -#: commands/tablecmds.c:15167 commands/tablecmds.c:15186 -#: commands/tablecmds.c:15245 +#: commands/tablecmds.c:15131 commands/tablecmds.c:15146 +#: commands/tablecmds.c:15166 commands/tablecmds.c:15185 +#: commands/tablecmds.c:15244 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s hängt von Spalte »%s« ab" -#: commands/tablecmds.c:15146 +#: commands/tablecmds.c:15145 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "Typ einer Spalte, die von einer Sicht oder Regel verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:15166 +#: commands/tablecmds.c:15165 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "Typ einer Spalte, die in einer Trigger-Definition verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:15185 +#: commands/tablecmds.c:15184 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "Typ einer Spalte, die in einer Policy-Definition verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:15216 +#: commands/tablecmds.c:15215 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "Typ einer Spalte, die von einer generierten Spalte verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:15217 +#: commands/tablecmds.c:15216 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Spalte »%s« wird von generierter Spalte »%s« verwendet." -#: commands/tablecmds.c:15244 +#: commands/tablecmds.c:15243 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "Typ einer Spalte, die in der WHERE-Klausel einer Publikation verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:16118 commands/tablecmds.c:16130 +#: commands/tablecmds.c:16117 commands/tablecmds.c:16129 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "kann Eigentümer des Index »%s« nicht ändern" -#: commands/tablecmds.c:16120 commands/tablecmds.c:16132 +#: commands/tablecmds.c:16119 commands/tablecmds.c:16131 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Ändern Sie stattdessen den Eigentümer der Tabelle des Index." -#: commands/tablecmds.c:16146 +#: commands/tablecmds.c:16145 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "kann Eigentümer der Sequenz »%s« nicht ändern" -#: commands/tablecmds.c:16171 +#: commands/tablecmds.c:16170 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "kann Eigentümer der Relation »%s« nicht ändern" -#: commands/tablecmds.c:16638 +#: commands/tablecmds.c:16637 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "mehrere SET TABLESPACE Unterbefehle sind ungültig" -#: commands/tablecmds.c:16717 +#: commands/tablecmds.c:16716 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "für Relation »%s« können keine Optionen gesetzt werden" -#: commands/tablecmds.c:16751 commands/view.c:440 +#: commands/tablecmds.c:16750 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION wird nur für automatisch aktualisierbare Sichten unterstützt" -#: commands/tablecmds.c:17004 +#: commands/tablecmds.c:17003 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "nur Tabellen, Indexe und materialisierte Sichten existieren in Tablespaces" -#: commands/tablecmds.c:17016 +#: commands/tablecmds.c:17015 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "Relationen können nicht in den oder aus dem Tablespace »pg_global« verschoben werden" -#: commands/tablecmds.c:17108 +#: commands/tablecmds.c:17107 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "Abbruch weil Sperre für Relation »%s.%s« nicht verfügbar ist" -#: commands/tablecmds.c:17124 +#: commands/tablecmds.c:17123 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "keine passenden Relationen in Tablespace »%s« gefunden" -#: commands/tablecmds.c:17246 +#: commands/tablecmds.c:17245 #, c-format msgid "cannot change inheritance of typed table" msgstr "Vererbung einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:17251 commands/tablecmds.c:17835 +#: commands/tablecmds.c:17250 commands/tablecmds.c:17834 #, c-format msgid "cannot change inheritance of a partition" msgstr "Vererbung einer Partition kann nicht geändert werden" -#: commands/tablecmds.c:17256 +#: commands/tablecmds.c:17255 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "Vererbung einer partitionierten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:17303 +#: commands/tablecmds.c:17302 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "an temporäre Relation einer anderen Sitzung kann nicht vererbt werden" -#: commands/tablecmds.c:17316 +#: commands/tablecmds.c:17315 #, c-format msgid "cannot inherit from a partition" msgstr "von einer Partition kann nicht geerbt werden" -#: commands/tablecmds.c:17338 commands/tablecmds.c:20359 +#: commands/tablecmds.c:17337 commands/tablecmds.c:20358 #, c-format msgid "circular inheritance not allowed" msgstr "zirkuläre Vererbung ist nicht erlaubt" -#: commands/tablecmds.c:17339 commands/tablecmds.c:20360 +#: commands/tablecmds.c:17338 commands/tablecmds.c:20359 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "»%s« ist schon von »%s« abgeleitet." -#: commands/tablecmds.c:17352 +#: commands/tablecmds.c:17351 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "Trigger »%s« verhindert, dass Tabelle »%s« ein Vererbungskind werden kann" -#: commands/tablecmds.c:17354 +#: commands/tablecmds.c:17353 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "ROW-Trigger mit Übergangstabellen werden in Vererbungshierarchien nicht unterstützt." -#: commands/tablecmds.c:17555 commands/tablecmds.c:17804 +#: commands/tablecmds.c:17554 commands/tablecmds.c:17803 #, c-format msgid "column \"%s\" in child table \"%s\" must be marked NOT NULL" msgstr "Spalte »%s« in abgeleiteter Tabelle »%s« muss als NOT NULL markiert sein" -#: commands/tablecmds.c:17565 +#: commands/tablecmds.c:17564 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "Spalte »%s« in abgeleiteter Tabelle muss eine generierte Spalte sein" -#: commands/tablecmds.c:17569 +#: commands/tablecmds.c:17568 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "Spalte »%s« in abgeleiteter Tabelle darf keine generierte Spalte sein" -#: commands/tablecmds.c:17615 +#: commands/tablecmds.c:17614 #, c-format msgid "child table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:17732 +#: commands/tablecmds.c:17731 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Definition für Check-Constraint »%s«" -#: commands/tablecmds.c:17741 +#: commands/tablecmds.c:17740 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "Constraint »%s« kollidiert mit nicht vererbtem Constraint für abgeleitete Tabelle »%s«" -#: commands/tablecmds.c:17752 +#: commands/tablecmds.c:17751 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "Constraint »%s« kollidiert mit NOT-VALID-Constraint für abgeleitete Tabelle »%s«" -#: commands/tablecmds.c:17763 +#: commands/tablecmds.c:17762 #, c-format msgid "constraint \"%s\" conflicts with NOT ENFORCED constraint on child table \"%s\"" msgstr "Constraint »%s« kollidiert mit NOT-ENFORCED-Constraint für abgeleitete Tabelle »%s«" -#: commands/tablecmds.c:17812 +#: commands/tablecmds.c:17811 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "Constraint »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:17899 +#: commands/tablecmds.c:17898 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "Partition »%s« hat schon eine unerledigte Abtrennoperation in der partitionierten Tabelle »%s.%s«" -#: commands/tablecmds.c:17928 commands/tablecmds.c:17976 +#: commands/tablecmds.c:17927 commands/tablecmds.c:17975 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "Relation »%s« ist keine Partition von Relation »%s«" -#: commands/tablecmds.c:17982 +#: commands/tablecmds.c:17981 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "Relation »%s« ist keine Basisrelation von Relation »%s«" -#: commands/tablecmds.c:18253 +#: commands/tablecmds.c:18252 #, c-format msgid "typed tables cannot inherit" msgstr "getypte Tabellen können nicht erben" -#: commands/tablecmds.c:18283 +#: commands/tablecmds.c:18282 #, c-format msgid "table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in Tabelle" -#: commands/tablecmds.c:18294 +#: commands/tablecmds.c:18293 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "Tabelle hat Spalte »%s«, aber Typ benötigt »%s«" -#: commands/tablecmds.c:18303 +#: commands/tablecmds.c:18302 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:18317 +#: commands/tablecmds.c:18316 #, c-format msgid "table has extra column \"%s\"" msgstr "Tabelle hat zusätzliche Spalte »%s«" -#: commands/tablecmds.c:18369 +#: commands/tablecmds.c:18368 #, c-format msgid "\"%s\" is not a typed table" msgstr "»%s« ist keine getypte Tabelle" -#: commands/tablecmds.c:18549 +#: commands/tablecmds.c:18548 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "nicht eindeutiger Index »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:18555 +#: commands/tablecmds.c:18554 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil er nicht IMMEDIATE ist" -#: commands/tablecmds.c:18561 +#: commands/tablecmds.c:18560 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "Ausdrucksindex »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:18567 +#: commands/tablecmds.c:18566 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "partieller Index »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:18584 +#: commands/tablecmds.c:18583 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil Spalte %d eine Systemspalte ist" -#: commands/tablecmds.c:18591 +#: commands/tablecmds.c:18590 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil Spalte »%s« NULL-Werte akzeptiert" -#: commands/tablecmds.c:18840 +#: commands/tablecmds.c:18839 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "kann den geloggten Status der Tabelle »%s« nicht ändern, weil sie temporär ist" -#: commands/tablecmds.c:18864 +#: commands/tablecmds.c:18863 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "kann Tabelle »%s« nicht in ungeloggt ändern, weil sie Teil einer Publikation ist" -#: commands/tablecmds.c:18866 +#: commands/tablecmds.c:18865 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ungeloggte Relationen können nicht repliziert werden." -#: commands/tablecmds.c:18911 +#: commands/tablecmds.c:18910 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "konnte Tabelle »%s« nicht in geloggt ändern, weil sie auf die ungeloggte Tabelle »%s« verweist" -#: commands/tablecmds.c:18921 +#: commands/tablecmds.c:18920 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "konnte Tabelle »%s« nicht in ungeloggt ändern, weil sie auf die geloggte Tabelle »%s« verweist" -#: commands/tablecmds.c:18985 +#: commands/tablecmds.c:18984 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "einer Tabelle zugeordnete Sequenz kann nicht in ein anderes Schema verschoben werden" -#: commands/tablecmds.c:19093 +#: commands/tablecmds.c:19092 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "Relation »%s« existiert bereits in Schema »%s«" -#: commands/tablecmds.c:19518 +#: commands/tablecmds.c:19517 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "»%s« ist keine Tabelle oder materialisierte Sicht" -#: commands/tablecmds.c:19671 +#: commands/tablecmds.c:19670 #, c-format msgid "\"%s\" is not a composite type" msgstr "»%s« ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:19701 +#: commands/tablecmds.c:19700 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "kann Schema des Index »%s« nicht ändern" -#: commands/tablecmds.c:19703 commands/tablecmds.c:19717 +#: commands/tablecmds.c:19702 commands/tablecmds.c:19716 #, c-format msgid "Change the schema of the table instead." msgstr "Ändern Sie stattdessen das Schema der Tabelle." -#: commands/tablecmds.c:19707 +#: commands/tablecmds.c:19706 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "kann Schema des zusammengesetzten Typs »%s« nicht ändern" -#: commands/tablecmds.c:19715 +#: commands/tablecmds.c:19714 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "kann Schema der TOAST-Tabelle »%s« nicht ändern" -#: commands/tablecmds.c:19747 +#: commands/tablecmds.c:19746 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "Partitionierungsstrategie »list« kann nicht mit mehr als einer Spalte verwendet werden" -#: commands/tablecmds.c:19813 +#: commands/tablecmds.c:19812 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "Spalte »%s«, die im Partitionierungsschlüssel verwendet wird, existiert nicht" -#: commands/tablecmds.c:19821 +#: commands/tablecmds.c:19820 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "Systemspalte »%s« kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:19835 commands/tablecmds.c:19917 +#: commands/tablecmds.c:19834 commands/tablecmds.c:19916 #, c-format msgid "cannot use generated column in partition key" msgstr "generierte Spalte kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:19904 +#: commands/tablecmds.c:19903 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "Partitionierungsschlüsselausdruck kann nicht auf Systemspalten verweisen" -#: commands/tablecmds.c:19968 +#: commands/tablecmds.c:19967 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "Funktionen im Partitionierungsschlüsselausdruck müssen als IMMUTABLE markiert sein" -#: commands/tablecmds.c:19977 +#: commands/tablecmds.c:19976 #, c-format msgid "cannot use constant expression as partition key" msgstr "Partitionierungsschlüssel kann kein konstanter Ausdruck sein" -#: commands/tablecmds.c:19998 +#: commands/tablecmds.c:19997 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "konnte die für den Partitionierungsausdruck zu verwendende Sortierfolge nicht bestimmen" -#: commands/tablecmds.c:20033 +#: commands/tablecmds.c:20032 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Sie müssen eine hash-Operatorklasse angeben oder eine hash-Standardoperatorklasse für den Datentyp definieren." -#: commands/tablecmds.c:20039 +#: commands/tablecmds.c:20038 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Sie müssen eine btree-Operatorklasse angeben oder eine btree-Standardoperatorklasse für den Datentyp definieren." -#: commands/tablecmds.c:20299 +#: commands/tablecmds.c:20298 #, c-format msgid "\"%s\" is already a partition" msgstr "»%s« ist bereits eine Partition" -#: commands/tablecmds.c:20305 +#: commands/tablecmds.c:20304 #, c-format msgid "cannot attach a typed table as partition" msgstr "eine getypte Tabelle kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:20321 +#: commands/tablecmds.c:20320 #, c-format msgid "cannot attach inheritance child as partition" msgstr "ein Vererbungskind kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:20335 +#: commands/tablecmds.c:20334 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "eine Tabelle mit abgeleiteten Tabellen kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:20369 +#: commands/tablecmds.c:20368 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "eine temporäre Relation kann nicht als Partition an permanente Relation »%s« angefügt werden" -#: commands/tablecmds.c:20377 +#: commands/tablecmds.c:20376 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "eine permanente Relation kann nicht als Partition an temporäre Relation »%s« angefügt werden" -#: commands/tablecmds.c:20385 +#: commands/tablecmds.c:20384 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "kann nicht als Partition an temporäre Relation einer anderen Sitzung anfügen" -#: commands/tablecmds.c:20392 +#: commands/tablecmds.c:20391 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "temporäre Relation einer anderen Sitzung kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:20412 +#: commands/tablecmds.c:20411 #, c-format msgid "table \"%s\" being attached contains an identity column \"%s\"" msgstr "anzufügende Tabelle »%s« enthält eine Identitätsspalte »%s«" -#: commands/tablecmds.c:20414 +#: commands/tablecmds.c:20413 #, c-format msgid "The new partition may not contain an identity column." msgstr "Die neue Partition darf keine Identitätsspalte enthalten." -#: commands/tablecmds.c:20422 +#: commands/tablecmds.c:20421 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "Tabelle »%s« enthält Spalte »%s«, die nicht in der Elterntabelle »%s« gefunden wurde" -#: commands/tablecmds.c:20425 +#: commands/tablecmds.c:20424 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Die neue Partition darf nur Spalten enthalten, die auch die Elterntabelle hat." -#: commands/tablecmds.c:20437 +#: commands/tablecmds.c:20436 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "Trigger »%s« verhindert, dass Tabelle »%s« eine Partition werden kann" -#: commands/tablecmds.c:20439 +#: commands/tablecmds.c:20438 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "ROW-Trigger mit Übergangstabellen werden für Partitionen nicht unterstützt." -#: commands/tablecmds.c:20621 +#: commands/tablecmds.c:20620 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht als Partition an partitionierte Tabelle »%s« anfügen" -#: commands/tablecmds.c:20624 +#: commands/tablecmds.c:20623 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Partitionierte Tabelle »%s« enthält Unique-Indexe." -#: commands/tablecmds.c:20948 +#: commands/tablecmds.c:20947 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "nebenläufiges Abtrennen einer Partition ist nicht möglich, wenn eine Standardpartition existiert" -#: commands/tablecmds.c:21060 +#: commands/tablecmds.c:21059 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "partitionierte Tabelle »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:21066 +#: commands/tablecmds.c:21065 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "Partition »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:21700 commands/tablecmds.c:21720 -#: commands/tablecmds.c:21741 commands/tablecmds.c:21760 -#: commands/tablecmds.c:21817 +#: commands/tablecmds.c:21699 commands/tablecmds.c:21719 +#: commands/tablecmds.c:21740 commands/tablecmds.c:21759 +#: commands/tablecmds.c:21816 #, 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:21703 +#: commands/tablecmds.c:21702 #, 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:21723 +#: commands/tablecmds.c:21722 #, 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:21744 +#: commands/tablecmds.c:21743 #, c-format msgid "The index definitions do not match." msgstr "Die Indexdefinitionen stimmen nicht überein." -#: commands/tablecmds.c:21763 +#: commands/tablecmds.c:21762 #, 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:21820 +#: commands/tablecmds.c:21819 #, 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:21943 +#: commands/tablecmds.c:21942 #, c-format msgid "invalid primary key definition" msgstr "ungültige Primärschlüsseldefinition" -#: commands/tablecmds.c:21944 +#: commands/tablecmds.c:21943 #, c-format msgid "Column \"%s\" of relation \"%s\" is not marked NOT NULL." msgstr "Spalte »%s« von Relation »%s« ist nicht als NOT NULL markiert." -#: commands/tablecmds.c:22079 +#: commands/tablecmds.c:22078 #, c-format msgid "column data type %s does not support compression" msgstr "Spaltendatentyp %s unterstützt keine Komprimierung" -#: commands/tablecmds.c:22086 +#: commands/tablecmds.c:22085 #, c-format msgid "invalid compression method \"%s\"" msgstr "ungültige Komprimierungsmethode »%s«" -#: commands/tablecmds.c:22112 +#: commands/tablecmds.c:22111 #, c-format msgid "invalid storage type \"%s\"" msgstr "ungültiger Storage-Typ »%s«" -#: commands/tablecmds.c:22122 +#: commands/tablecmds.c:22121 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "Spaltendatentyp %s kann nur Storage-Typ PLAIN" @@ -12672,24 +12709,24 @@ msgid "cannot collect transition tuples from child foreign tables" msgstr "aus abgeleiteten Fremdtabellen können keine Übergangstupel gesammelt werden" #: commands/trigger.c:3402 executor/nodeModifyTable.c:1687 -#: executor/nodeModifyTable.c:1761 executor/nodeModifyTable.c:2569 -#: executor/nodeModifyTable.c:2659 executor/nodeModifyTable.c:3322 -#: executor/nodeModifyTable.c:3519 +#: executor/nodeModifyTable.c:1761 executor/nodeModifyTable.c:2588 +#: executor/nodeModifyTable.c:2678 executor/nodeModifyTable.c:3341 +#: executor/nodeModifyTable.c:3538 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Verwenden Sie einen AFTER-Trigger anstelle eines BEFORE-Triggers, um Änderungen an andere Zeilen zu propagieren." #: commands/trigger.c:3444 executor/nodeLockRows.c:228 #: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:389 -#: executor/nodeModifyTable.c:1703 executor/nodeModifyTable.c:2585 -#: executor/nodeModifyTable.c:2810 executor/nodeModifyTable.c:3360 +#: executor/nodeModifyTable.c:1703 executor/nodeModifyTable.c:2604 +#: executor/nodeModifyTable.c:2829 executor/nodeModifyTable.c:3379 #, c-format msgid "could not serialize access due to concurrent update" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitiger Aktualisierung" #: commands/trigger.c:3452 executor/nodeModifyTable.c:1793 -#: executor/nodeModifyTable.c:2676 executor/nodeModifyTable.c:2826 -#: executor/nodeModifyTable.c:3340 +#: executor/nodeModifyTable.c:2695 executor/nodeModifyTable.c:2845 +#: executor/nodeModifyTable.c:3359 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitigem Löschen" @@ -12814,7 +12851,7 @@ msgstr "nur Superuser können Basistypen anlegen" msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "Erzeugen Sie den Typ als Shell-Typ, legen Sie dann die I/O-Funktionen an und führen Sie dann das volle CREATE TYPE aus." -#: commands/typecmds.c:331 commands/typecmds.c:1494 commands/typecmds.c:4479 +#: commands/typecmds.c:331 commands/typecmds.c:1501 commands/typecmds.c:4486 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "Typ-Attribut »%s« nicht erkannt" @@ -12834,7 +12871,7 @@ msgstr "Arrayelementtyp kann nicht %s sein" msgid "alignment \"%s\" not recognized" msgstr "Ausrichtung »%s« nicht erkannt" -#: commands/typecmds.c:454 commands/typecmds.c:4353 +#: commands/typecmds.c:454 commands/typecmds.c:4360 #, c-format msgid "storage \"%s\" not recognized" msgstr "Storage-Typ »%s« nicht erkannt" @@ -12924,248 +12961,248 @@ msgstr "Angabe von GENERATED wird für Domänen nicht unterstützt" msgid "specifying constraint enforceability not supported for domains" msgstr "Angabe von ENFORCED/NOT ENFORCED wird für Domänen nicht unterstützt" -#: commands/typecmds.c:1361 utils/cache/typcache.c:2757 +#: commands/typecmds.c:1361 utils/cache/typcache.c:2750 #, c-format msgid "%s is not an enum" msgstr "»%s« ist kein Enum" -#: commands/typecmds.c:1502 +#: commands/typecmds.c:1509 #, c-format msgid "type attribute \"subtype\" is required" msgstr "Typ-Attribut »subtype« muss angegeben werden" -#: commands/typecmds.c:1507 +#: commands/typecmds.c:1514 #, c-format msgid "range subtype cannot be %s" msgstr "Bereichtsuntertyp kann nicht %s sein" -#: commands/typecmds.c:1526 +#: commands/typecmds.c:1533 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "Sortierfolge für Bereichstyp angegeben, aber Untertyp unterstützt keine Sortierfolgen" -#: commands/typecmds.c:1536 +#: commands/typecmds.c:1543 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "Canonical-Funktion kann nicht angegeben werden ohne einen vorher angelegten Shell-Typ" -#: commands/typecmds.c:1537 +#: commands/typecmds.c:1544 #, c-format msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "Erzeugen Sie den Typ als Shell-Typ, legen Sie dann die Canonicalization-Funktion an und führen Sie dann das volle CREATE TYPE aus." -#: commands/typecmds.c:2013 +#: commands/typecmds.c:2020 #, c-format msgid "type input function %s has multiple matches" msgstr "Typeingabefunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:2031 +#: commands/typecmds.c:2038 #, c-format msgid "type input function %s must return type %s" msgstr "Typeingabefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2047 +#: commands/typecmds.c:2054 #, c-format msgid "type input function %s should not be volatile" msgstr "Typeingabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2075 +#: commands/typecmds.c:2082 #, c-format msgid "type output function %s must return type %s" msgstr "Typausgabefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2082 +#: commands/typecmds.c:2089 #, c-format msgid "type output function %s should not be volatile" msgstr "Typausgabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2111 +#: commands/typecmds.c:2118 #, c-format msgid "type receive function %s has multiple matches" msgstr "Typempfangsfunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:2129 +#: commands/typecmds.c:2136 #, c-format msgid "type receive function %s must return type %s" msgstr "Typempfangsfunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2136 +#: commands/typecmds.c:2143 #, c-format msgid "type receive function %s should not be volatile" msgstr "Typempfangsfunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2164 +#: commands/typecmds.c:2171 #, c-format msgid "type send function %s must return type %s" msgstr "Typsendefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2171 +#: commands/typecmds.c:2178 #, c-format msgid "type send function %s should not be volatile" msgstr "Typsendefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2198 +#: commands/typecmds.c:2205 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2205 +#: commands/typecmds.c:2212 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "Typmodifikatoreingabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2232 +#: commands/typecmds.c:2239 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2239 +#: commands/typecmds.c:2246 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "Typmodifikatorausgabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2266 +#: commands/typecmds.c:2273 #, c-format msgid "type analyze function %s must return type %s" msgstr "Typanalysefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2295 +#: commands/typecmds.c:2302 #, c-format msgid "type subscripting function %s must return type %s" msgstr "Typ-Subscript-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2305 +#: commands/typecmds.c:2312 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "benutzerdefinierte Typen können Subscript-Funktion %s nicht verwenden" -#: commands/typecmds.c:2351 +#: commands/typecmds.c:2358 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "Sie müssen für den Bereichstyp eine Operatorklasse angeben oder eine Standardoperatorklasse für den Untertyp definieren." -#: commands/typecmds.c:2382 +#: commands/typecmds.c:2389 #, c-format msgid "range canonical function %s must return range type" msgstr "Bereichstyp-Canonical-Funktion %s muss Bereichstyp zurückgeben" -#: commands/typecmds.c:2388 +#: commands/typecmds.c:2395 #, c-format msgid "range canonical function %s must be immutable" msgstr "Bereichstyp-Canonical-Funktion %s muss »immutable« sein" -#: commands/typecmds.c:2424 +#: commands/typecmds.c:2431 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "Bereichstyp-Untertyp-Diff-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2431 +#: commands/typecmds.c:2438 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "Bereichstyp-Untertyp-Diff-Funktion %s muss »immutable« sein" -#: commands/typecmds.c:2458 +#: commands/typecmds.c:2465 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "Array-OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/typecmds.c:2491 +#: commands/typecmds.c:2498 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "Multirange-OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/typecmds.c:2524 +#: commands/typecmds.c:2531 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "Multirange-Array-OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/typecmds.c:2906 commands/typecmds.c:3088 +#: commands/typecmds.c:2913 commands/typecmds.c:3095 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "Constraint »%s« von Domäne »%s« existiert nicht" -#: commands/typecmds.c:2910 +#: commands/typecmds.c:2917 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "Constraint »%s« von Domäne »%s« existiert nicht, wird übersprungen" -#: commands/typecmds.c:3095 +#: commands/typecmds.c:3102 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "Constraint »%s« von Domäne »%s« ist kein Check-Constraint" -#: commands/typecmds.c:3175 +#: commands/typecmds.c:3182 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "Spalte »%s« von Tabelle »%s« enthält NULL-Werte" -#: commands/typecmds.c:3264 +#: commands/typecmds.c:3271 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "Spalte »%s« von Tabelle »%s« enthält Werte, die den neuen Constraint verletzen" -#: commands/typecmds.c:3493 commands/typecmds.c:3771 commands/typecmds.c:3856 -#: commands/typecmds.c:4072 +#: commands/typecmds.c:3500 commands/typecmds.c:3778 commands/typecmds.c:3863 +#: commands/typecmds.c:4079 #, c-format msgid "%s is not a domain" msgstr "%s ist keine Domäne" -#: commands/typecmds.c:3527 commands/typecmds.c:3683 +#: commands/typecmds.c:3534 commands/typecmds.c:3690 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "Constraint »%s« für Domäne »%s« existiert bereits" -#: commands/typecmds.c:3578 +#: commands/typecmds.c:3585 #, c-format msgid "cannot use table references in domain check constraint" msgstr "Tabellenverweise können in Domänen-Check-Constraints nicht verwendet werden" -#: commands/typecmds.c:3783 commands/typecmds.c:3868 commands/typecmds.c:4222 +#: commands/typecmds.c:3790 commands/typecmds.c:3875 commands/typecmds.c:4229 #, c-format msgid "%s is a table's row type" msgstr "%s ist der Zeilentyp einer Tabelle" -#: commands/typecmds.c:3793 commands/typecmds.c:3878 commands/typecmds.c:4120 +#: commands/typecmds.c:3800 commands/typecmds.c:3885 commands/typecmds.c:4127 #, c-format msgid "cannot alter array type %s" msgstr "Array-Typ %s kann nicht verändert werden" -#: commands/typecmds.c:3795 commands/typecmds.c:3880 commands/typecmds.c:4122 +#: commands/typecmds.c:3802 commands/typecmds.c:3887 commands/typecmds.c:4129 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Sie können den Typ %s ändern, wodurch der Array-Typ ebenfalls geändert wird." -#: commands/typecmds.c:3891 +#: commands/typecmds.c:3898 #, c-format msgid "cannot alter multirange type %s" msgstr "Multirange-Typ %s kann nicht verändert werden" -#: commands/typecmds.c:3894 +#: commands/typecmds.c:3901 #, c-format msgid "You can alter type %s, which will alter the multirange type as well." msgstr "Sie können den Typ %s ändern, wodurch der Multirange-Typ ebenfalls geändert wird." -#: commands/typecmds.c:4201 +#: commands/typecmds.c:4208 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "Typ %s existiert bereits in Schema »%s«" -#: commands/typecmds.c:4381 +#: commands/typecmds.c:4388 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "Storage-Typ eines Typs kann nicht in PLAIN geändert werden" -#: commands/typecmds.c:4474 +#: commands/typecmds.c:4481 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "Typ-Attribut »%s« kann nicht geändert werden" -#: commands/typecmds.c:4492 +#: commands/typecmds.c:4499 #, c-format msgid "must be superuser to alter a type" msgstr "nur Superuser können Typen ändern" -#: commands/typecmds.c:4513 commands/typecmds.c:4522 +#: commands/typecmds.c:4520 commands/typecmds.c:4529 #, c-format msgid "%s is not a base type" msgstr "%s ist kein Basistyp" @@ -13590,7 +13627,7 @@ msgstr "VACUUM ONLY für partitionierte Tabelle »%s« hat keine Auswirkung" msgid "cutoff for removing and freezing tuples is far in the past" msgstr "Obergrenze für das Entfernen und Einfrieren von Tuples ist weit in der Vergangenheit" -#: commands/vacuum.c:1184 commands/vacuum.c:1189 +#: commands/vacuum.c:1184 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -13604,6 +13641,15 @@ msgstr "" msgid "cutoff for freezing multixacts is far in the past" msgstr "Obergrenze für das Einfrieren von Multixacts ist weit in der Vergangenheit" +#: commands/vacuum.c:1189 +#, c-format +msgid "" +"Close open transactions soon to avoid wraparound problems.\n" +"You might also need to commit or roll back old prepared transactions." +msgstr "" +"Schließen Sie bald alle offenen Transaktionen, um Überlaufprobleme zu vermeiden.\n" +"Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen." + #: commands/vacuum.c:1950 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" @@ -13951,8 +13997,8 @@ msgid "Table has type %s, but query expects %s." msgstr "Tabelle hat Typ %s, aber Anfrage erwartet %s." #: executor/execExprInterp.c:2511 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1841 -#: utils/cache/typcache.c:2000 utils/cache/typcache.c:2147 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1834 +#: utils/cache/typcache.c:1993 utils/cache/typcache.c:2140 #: utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" @@ -13974,8 +14020,8 @@ msgid "Array with element type %s cannot be included in ARRAY construct with ele msgstr "Arrayelement mit Typ %s kann nicht in ARRAY-Konstrukt mit Elementtyp %s verwendet werden." #: executor/execExprInterp.c:3509 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3515 utils/adt/arrayfuncs.c:5611 -#: utils/adt/arrayfuncs.c:6130 utils/adt/arraysubs.c:151 +#: utils/adt/arrayfuncs.c:3515 utils/adt/arrayfuncs.c:5620 +#: utils/adt/arrayfuncs.c:6137 utils/adt/arraysubs.c:151 #: utils/adt/arraysubs.c:489 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" @@ -13994,7 +14040,7 @@ msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dim #: utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 #: utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 #: utils/adt/arrayfuncs.c:3545 utils/adt/arrayfuncs.c:5383 -#: utils/adt/arrayfuncs.c:6222 utils/adt/arrayfuncs.c:6566 +#: utils/adt/arrayfuncs.c:6229 utils/adt/arrayfuncs.c:6573 #: utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 #: utils/adt/arrayutils.c:99 #, c-format @@ -14466,7 +14512,7 @@ msgstr "Custom-Scan »%s« unterstützt MarkPos nicht" msgid "could not rewind hash-join temporary file" msgstr "konnte Position in temporärer Datei für Hash-Verbund nicht auf Anfang setzen" -#: executor/nodeIndexonlyscan.c:240 +#: executor/nodeIndexonlyscan.c:222 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "verlustbehaftete Abstandsfunktionen werden in Index-Only-Scans nicht unterstützt" @@ -14532,28 +14578,28 @@ msgid "Consider defining the foreign key on table \"%s\"." msgstr "Definieren Sie den Fremdschlüssel eventuell für Tabelle »%s«." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2788 executor/nodeModifyTable.c:3328 -#: executor/nodeModifyTable.c:3525 +#: executor/nodeModifyTable.c:2807 executor/nodeModifyTable.c:3347 +#: executor/nodeModifyTable.c:3544 #, c-format msgid "%s command cannot affect row a second time" msgstr "Befehl in %s kann eine Zeile nicht ein zweites Mal ändern" -#: executor/nodeModifyTable.c:2790 +#: executor/nodeModifyTable.c:2809 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Stellen Sie sicher, dass keine im selben Befehl fürs Einfügen vorgesehene Zeilen doppelte Werte haben, die einen Constraint verletzen würden." -#: executor/nodeModifyTable.c:3321 executor/nodeModifyTable.c:3518 +#: executor/nodeModifyTable.c:3340 executor/nodeModifyTable.c:3537 #, c-format msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" msgstr "das zu aktualisierende oder zu löschende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" -#: executor/nodeModifyTable.c:3330 executor/nodeModifyTable.c:3527 +#: executor/nodeModifyTable.c:3349 executor/nodeModifyTable.c:3546 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "Stellen Sie sicher, dass nicht mehr als eine Quellzeile auf jede Zielzeile passt." -#: executor/nodeModifyTable.c:3404 +#: executor/nodeModifyTable.c:3423 #, c-format msgid "tuple to be merged was already moved to another partition due to concurrent update" msgstr "das zu mergende Tupel wurde schon durch ein gleichzeitiges Update in eine andere Partition verschoben" @@ -15216,7 +15262,7 @@ msgstr "ungültige hexadezimale Zeichensequenz" msgid "unexpected end after backslash" msgstr "unerwartetes Ende nach Backslash" -#: jsonpath_scan.l:201 repl_scanner.l:217 scan.l:742 +#: jsonpath_scan.l:201 repl_scanner.l:221 scan.l:742 msgid "unterminated quoted string" msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" @@ -15377,7 +15423,7 @@ msgstr "Nachricht enthielt kein abschließendes Endezeichen." #: libpq/auth-oauth.c:499 #, c-format msgid "OAuth is not properly configured for this user" -msgstr "OAuth ist für diesen Benutzer nicht richtig konfiguriert." +msgstr "OAuth ist für diesen Benutzer nicht richtig konfiguriert" #: libpq/auth-oauth.c:500 #, c-format @@ -16553,12 +16599,12 @@ msgstr "Lesen Sie in der PostgreSQL-Dokumentation, wie man zu einem anderen Pass msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "Benutzer »%s« hat ein Passwort, das nicht mit MD5-Authentifizierung verwendet werden kann." -#: libpq/crypt.c:237 libpq/crypt.c:279 libpq/crypt.c:299 +#: libpq/crypt.c:238 libpq/crypt.c:280 libpq/crypt.c:301 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Passwort stimmt nicht überein für Benutzer »%s«." -#: libpq/crypt.c:318 +#: libpq/crypt.c:320 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Passwort von Benutzer »%s« hat unbekanntes Format." @@ -17400,8 +17446,8 @@ msgstr "ExtensibleNodeMethods »%s« wurde nicht registriert" msgid "relation \"%s\" does not have a composite type" msgstr "Relation »%s« hat keinen zusammengesetzten Typ" -#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2602 -#: parser/parse_coerce.c:2740 parser/parse_coerce.c:2787 +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2601 +#: parser/parse_coerce.c:2739 parser/parse_coerce.c:2786 #: parser/parse_expr.c:2130 parser/parse_func.c:710 parser/parse_oper.c:869 #: utils/adt/array_userfuncs.c:1959 utils/fmgr/funcapi.c:669 #, c-format @@ -17430,50 +17476,50 @@ msgid "cannot execute MERGE on relation \"%s\"" msgstr "MERGE kann für Relation »%s« nicht ausgeführt werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1755 +#: optimizer/plan/initsplan.c:1806 #, c-format 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:1700 parser/analyze.c:1823 parser/analyze.c:2082 +#: optimizer/plan/planner.c:1645 parser/analyze.c:1823 parser/analyze.c:2082 #: parser/analyze.c:3412 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s ist nicht in UNION/INTERSECT/EXCEPT erlaubt" -#: optimizer/plan/planner.c:2446 optimizer/plan/planner.c:4332 +#: optimizer/plan/planner.c:2391 optimizer/plan/planner.c:4277 #, c-format msgid "could not implement GROUP BY" msgstr "konnte GROUP BY nicht implementieren" -#: optimizer/plan/planner.c:2447 optimizer/plan/planner.c:4333 -#: optimizer/plan/planner.c:5014 optimizer/prep/prepunion.c:1073 +#: optimizer/plan/planner.c:2392 optimizer/plan/planner.c:4278 +#: optimizer/plan/planner.c:4959 optimizer/prep/prepunion.c:1073 #, 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:5013 +#: optimizer/plan/planner.c:4958 #, c-format msgid "could not implement DISTINCT" msgstr "konnte DISTINCT nicht implementieren" -#: optimizer/plan/planner.c:6510 +#: optimizer/plan/planner.c:6455 #, c-format msgid "could not implement window PARTITION BY" msgstr "konnte PARTITION BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:6511 +#: optimizer/plan/planner.c:6456 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fensterpartitionierungsspalten müssen sortierbare Datentypen haben." -#: optimizer/plan/planner.c:6515 +#: optimizer/plan/planner.c:6460 #, c-format msgid "could not implement window ORDER BY" msgstr "konnte ORDER BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:6516 +#: optimizer/plan/planner.c:6461 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fenstersortierspalten müssen sortierbare Datentypen haben." @@ -17504,7 +17550,7 @@ msgstr "Attribut »%s« von Relation »%s« stimmt nicht mit dem Typ der Elternt msgid "attribute \"%s\" of relation \"%s\" does not match parent's collation" msgstr "Attribut »%s« von Relation »%s« stimmt nicht mit der Sortierfolge der Elterntabelle überein" -#: optimizer/util/clauses.c:4965 +#: optimizer/util/clauses.c:4992 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL-Funktion »%s« beim Inlining" @@ -18114,7 +18160,7 @@ msgstr "Argumente von GROUPING müssen Gruppierausdrücke der zugehörigen Anfra msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "Relation »%s« kann nicht das Ziel einer datenverändernden Anweisung sein" -#: parser/parse_clause.c:567 parser/parse_clause.c:595 parser/parse_func.c:2553 +#: parser/parse_clause.c:567 parser/parse_clause.c:595 parser/parse_func.c:2551 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "Funktionen mit Ergebnismenge müssen auf oberster Ebene von FROM erscheinen" @@ -18380,159 +18426,159 @@ msgstr "RANGE mit Offset PRECEDING/FOLLOWING hat mehrere Interpretationen für S msgid "Cast the offset value to the exact intended type." msgstr "Wandeln Sie den Offset-Wert in den genauen beabsichtigten Typ um." -#: parser/parse_coerce.c:1048 parser/parse_coerce.c:1086 -#: parser/parse_coerce.c:1104 parser/parse_coerce.c:1119 +#: parser/parse_coerce.c:1047 parser/parse_coerce.c:1085 +#: parser/parse_coerce.c:1103 parser/parse_coerce.c:1118 #: parser/parse_expr.c:2164 parser/parse_expr.c:2784 parser/parse_expr.c:3435 -#: parser/parse_expr.c:3664 parser/parse_target.c:1001 +#: parser/parse_expr.c:3664 parser/parse_expr.c:4100 parser/parse_target.c:1001 #, c-format msgid "cannot cast type %s to %s" msgstr "kann Typ %s nicht in Typ %s umwandeln" -#: parser/parse_coerce.c:1089 +#: parser/parse_coerce.c:1088 #, c-format msgid "Input has too few columns." msgstr "Eingabe hat zu wenige Spalten." -#: parser/parse_coerce.c:1107 +#: parser/parse_coerce.c:1106 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "Kann in Spalte %3$d Typ %1$s nicht in Typ %2$s umwandeln." -#: parser/parse_coerce.c:1122 +#: parser/parse_coerce.c:1121 #, c-format msgid "Input has too many columns." msgstr "Eingabe hat zu viele Spalten." #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1177 parser/parse_coerce.c:1225 +#: parser/parse_coerce.c:1176 parser/parse_coerce.c:1224 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "Argument von %s muss Typ %s haben, nicht Typ %s" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1188 parser/parse_coerce.c:1237 +#: parser/parse_coerce.c:1187 parser/parse_coerce.c:1236 #, c-format 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:1418 +#: parser/parse_coerce.c:1417 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%s-Typen %s und %s passen nicht zusammen" -#: parser/parse_coerce.c:1534 +#: parser/parse_coerce.c:1533 #, 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:1586 +#: parser/parse_coerce.c:1585 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s konnte Typ %s nicht in %s umwandeln" -#: parser/parse_coerce.c:2189 parser/parse_coerce.c:2209 -#: parser/parse_coerce.c:2229 parser/parse_coerce.c:2250 -#: parser/parse_coerce.c:2305 parser/parse_coerce.c:2339 +#: parser/parse_coerce.c:2188 parser/parse_coerce.c:2208 +#: parser/parse_coerce.c:2228 parser/parse_coerce.c:2249 +#: parser/parse_coerce.c:2304 parser/parse_coerce.c:2338 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "als »%s« deklarierte Argumente sind nicht alle gleich" -#: parser/parse_coerce.c:2284 parser/parse_coerce.c:2397 +#: parser/parse_coerce.c:2283 parser/parse_coerce.c:2396 #: 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:2317 parser/parse_coerce.c:2467 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2466 #: 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:2351 parser/parse_coerce.c:2431 -#: parser/parse_coerce.c:2564 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 +#: parser/parse_coerce.c:2350 parser/parse_coerce.c:2430 +#: parser/parse_coerce.c:2563 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:2388 +#: parser/parse_coerce.c:2387 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "kann Elementtyp des Arguments mit Typ »anyarray« nicht bestimmen" -#: parser/parse_coerce.c:2414 parser/parse_coerce.c:2445 -#: parser/parse_coerce.c:2484 parser/parse_coerce.c:2550 +#: parser/parse_coerce.c:2413 parser/parse_coerce.c:2444 +#: parser/parse_coerce.c:2483 parser/parse_coerce.c:2549 #, 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:2509 +#: parser/parse_coerce.c:2508 #, 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:2523 +#: parser/parse_coerce.c:2522 #, 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:2533 +#: parser/parse_coerce.c:2532 #, 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:2594 +#: parser/parse_coerce.c:2593 #, 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:2612 parser/parse_coerce.c:2633 -#: parser/parse_coerce.c:2683 parser/parse_coerce.c:2688 -#: parser/parse_coerce.c:2752 parser/parse_coerce.c:2764 +#: parser/parse_coerce.c:2611 parser/parse_coerce.c:2632 +#: parser/parse_coerce.c:2682 parser/parse_coerce.c:2687 +#: parser/parse_coerce.c:2751 parser/parse_coerce.c:2763 #, 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:2622 +#: parser/parse_coerce.c:2621 #, 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:2643 +#: parser/parse_coerce.c:2642 #, 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:2657 +#: parser/parse_coerce.c:2656 #, 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:2892 +#: parser/parse_coerce.c:2891 #, 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:2909 +#: parser/parse_coerce.c:2908 #, 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:2921 +#: parser/parse_coerce.c:2920 #, 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:2933 +#: parser/parse_coerce.c:2932 #, 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:2963 +#: parser/parse_coerce.c:2962 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." @@ -18728,9 +18774,9 @@ msgstr "rekursiver Verweis auf Anfrage »%s« darf nicht mehrmals erscheinen" msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT ist in diesem Zusammenhang nicht erlaubt" -#: parser/parse_expr.c:405 parser/parse_relation.c:3797 -#: parser/parse_relation.c:3807 parser/parse_relation.c:3825 -#: parser/parse_relation.c:3832 parser/parse_relation.c:3846 +#: parser/parse_expr.c:405 parser/parse_relation.c:3829 +#: parser/parse_relation.c:3839 parser/parse_relation.c:3857 +#: parser/parse_relation.c:3864 parser/parse_relation.c:3878 #, c-format msgid "column %s.%s does not exist" msgstr "Spalte %s.%s existiert nicht" @@ -18763,8 +18809,8 @@ msgstr "Spaltenverweise können nicht in DEFAULT-Ausdrücken verwendet werden" msgid "cannot use column reference in partition bound expression" msgstr "Spaltenverweise können nicht in Partitionsbegrenzungsausdrücken verwendet werden" -#: parser/parse_expr.c:845 parser/parse_relation.c:848 -#: parser/parse_relation.c:930 parser/parse_target.c:1241 +#: parser/parse_expr.c:845 parser/parse_relation.c:880 +#: parser/parse_relation.c:962 parser/parse_target.c:1241 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "Spaltenverweis »%s« ist nicht eindeutig" @@ -18803,7 +18849,7 @@ msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() ex msgstr "die Quelle für ein UPDATE-Element mit mehreren Spalten muss ein Sub-SELECT oder ein ROW()-Ausdruck sein" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1770 parser/parse_expr.c:2263 parser/parse_func.c:2679 +#: parser/parse_expr.c:1770 parser/parse_expr.c:2263 parser/parse_func.c:2677 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "Funktionen mit Ergebnismenge sind in %s nicht erlaubt" @@ -19000,49 +19046,49 @@ msgstr "Rückgabe von Pseudotypen wird in SQL/JSON-Funktionen nicht unterstützt msgid "aggregate ORDER BY is not implemented for window functions" msgstr "ORDER BY in Aggregatfunktion ist für Fensterfunktionen nicht implementiert" -#: parser/parse_expr.c:4102 +#: parser/parse_expr.c:4112 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" msgstr "JSON-FORMAT-ENCODING-Klausel kann nur für Eingabetyp bytea verwendet werden" -#: parser/parse_expr.c:4122 +#: parser/parse_expr.c:4132 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "Typ %s kann nicht im IS-JSON-Prädikat verwendet werden" -#: parser/parse_expr.c:4148 parser/parse_expr.c:4269 +#: parser/parse_expr.c:4158 parser/parse_expr.c:4279 #, c-format msgid "cannot use type %s in RETURNING clause of %s" msgstr "Typ %s kann nicht in der RETURNING-Klausel von %s verwendet werden" -#: parser/parse_expr.c:4150 +#: parser/parse_expr.c:4160 #, c-format msgid "Try returning json or jsonb." msgstr "Versuchen Sie json oder jsonb zurückzugeben." -#: parser/parse_expr.c:4198 +#: parser/parse_expr.c:4208 #, c-format msgid "cannot use non-string types with WITH UNIQUE KEYS clause" msgstr "Klausel WITH UNIQUE KEYS kann nicht mit Typen verwendet werden, die keine Zeichenketten sind" -#: parser/parse_expr.c:4272 +#: parser/parse_expr.c:4282 #, c-format msgid "Try returning a string type or bytea." msgstr "Versuchen Sie einen Zeichenkettentyp oder bytea zurückzugeben." -#: parser/parse_expr.c:4340 +#: parser/parse_expr.c:4350 #, c-format msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" msgstr "FORMAT JSON kann nicht in der RETURNING-Klausel von %s() angegeben werden" -#: parser/parse_expr.c:4353 +#: parser/parse_expr.c:4363 #, c-format msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" msgstr "SQL/JSON-QUOTES-Verhalten darf nicht angegeben werden, wenn WITH WRAPPER verwendet wird" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4367 parser/parse_expr.c:4396 parser/parse_expr.c:4427 -#: parser/parse_expr.c:4453 parser/parse_expr.c:4479 +#: parser/parse_expr.c:4377 parser/parse_expr.c:4406 parser/parse_expr.c:4437 +#: parser/parse_expr.c:4463 parser/parse_expr.c:4489 #: parser/parse_jsontable.c:92 #, c-format msgid "invalid %s behavior" @@ -19050,7 +19096,7 @@ msgstr "ungültiges »%s«-Verhalten" #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), #. second %s is a SQL/JSON function name (e.g. JSON_QUERY) -#: parser/parse_expr.c:4370 parser/parse_expr.c:4399 +#: parser/parse_expr.c:4380 parser/parse_expr.c:4409 #, c-format msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s." msgstr "Nur ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT oder DEFAULT-Ausdruck sind erlaubt in %s für %s." @@ -19058,73 +19104,73 @@ msgstr "Nur ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT oder DEFAULT-Ausdruck sind er #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) #. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4377 parser/parse_expr.c:4406 parser/parse_expr.c:4435 -#: parser/parse_expr.c:4463 parser/parse_expr.c:4489 +#: parser/parse_expr.c:4387 parser/parse_expr.c:4416 parser/parse_expr.c:4445 +#: parser/parse_expr.c:4473 parser/parse_expr.c:4499 #, c-format msgid "invalid %s behavior for column \"%s\"" msgstr "ungültiges »%s«-Verhalten für Spalte »%s«" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4380 parser/parse_expr.c:4409 +#: parser/parse_expr.c:4390 parser/parse_expr.c:4419 #, c-format msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns." msgstr "Nur ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT oder DEFAULT-Ausdruck sind erlaubt in %s für formatierte Spalten." -#: parser/parse_expr.c:4428 +#: parser/parse_expr.c:4438 #, c-format msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." msgstr "Nur ERROR, TRUE, FALSE oder UNKNOWN sind erlaubt in %s für %s." #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4438 +#: parser/parse_expr.c:4448 #, c-format msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." msgstr "Nur ERROR, TRUE, FALSE oder UNKNOWN sind erlaubt in %s für EXISTS-Spalten." #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), #. second %s is a SQL/JSON function name (e.g. JSON_QUERY) -#: parser/parse_expr.c:4456 parser/parse_expr.c:4482 +#: parser/parse_expr.c:4466 parser/parse_expr.c:4492 #, c-format msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." msgstr "Nur ERROR, NULL oder DEFAULT-Ausdruck sind erlaubt in %s für %s." #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4466 parser/parse_expr.c:4492 +#: parser/parse_expr.c:4476 parser/parse_expr.c:4502 #, c-format msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." msgstr "Nur ERROR, NULL oder DEFAULT-Ausdruck sind erlaubt in %s für skalare Spalten." -#: parser/parse_expr.c:4526 +#: parser/parse_expr.c:4536 #, c-format msgid "JSON path expression must be of type %s, not of type %s" msgstr "JSON-Pfadausdruck muss Typ %s haben, nicht Typ %s" -#: parser/parse_expr.c:4766 +#: parser/parse_expr.c:4776 #, c-format msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" msgstr "für DEFAULT kann nur eine Konstante, Nicht-Aggregat-Funktion oder ein Operatorausdruck angegeben werden" -#: parser/parse_expr.c:4771 +#: parser/parse_expr.c:4781 #, c-format msgid "DEFAULT expression must not contain column references" msgstr "DEFAULT-Ausdruck darf keine Spaltenverweise enthalten" -#: parser/parse_expr.c:4776 +#: parser/parse_expr.c:4786 #, c-format msgid "DEFAULT expression must not return a set" msgstr "DEFAULT-Ausdruck darf keine Ergebnismenge zurückgeben" -#: parser/parse_expr.c:4791 +#: parser/parse_expr.c:4801 #, c-format msgid "collation of DEFAULT expression conflicts with RETURNING clause" msgstr "Sortierfolge des DEFAULT-Ausdrucks kollidiert mit der RETURNING-Klausel" -#: parser/parse_expr.c:4870 parser/parse_expr.c:4879 +#: parser/parse_expr.c:4889 parser/parse_expr.c:4898 #, c-format msgid "cannot cast behavior expression of type %s to %s" msgstr "kann Verhaltensausdruck nicht von Typ %s in %s umwandeln" -#: parser/parse_expr.c:4873 +#: parser/parse_expr.c:4892 #, c-format msgid "You will need to explicitly cast the expression to type %s." msgstr "Sie werden den Ausdruck ausdrücklich in Typ %s umwandeln müssen." @@ -19139,7 +19185,7 @@ msgstr "Argumentname »%s« mehrmals angegeben" msgid "positional argument cannot follow named argument" msgstr "Positionsargument kann nicht hinter benanntem Argument stehen" -#: parser/parse_func.c:287 parser/parse_func.c:2368 +#: parser/parse_func.c:287 parser/parse_func.c:2366 #, c-format msgid "%s is not a procedure" msgstr "%s ist keine Prozedur" @@ -19258,7 +19304,7 @@ msgstr "Konnte keine beste Kandidatfunktion auswählen. Sie müssen möglicherwe msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "Keine Aggregatfunktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Mõglicherweise steht ORDER BY an der falschen Stelle; ORDER BY muss hinter allen normalen Argumenten der Aggregatfunktion stehen." -#: parser/parse_func.c:622 parser/parse_func.c:2411 +#: parser/parse_func.c:622 parser/parse_func.c:2409 #, c-format msgid "procedure %s does not exist" msgstr "Prozedur %s existiert nicht" @@ -19313,153 +19359,153 @@ msgstr "Aufrufe von Fensterfunktionen können keine Aufrufe von Funktionen mit E msgid "window functions cannot return sets" msgstr "Fensterfunktionen können keine Ergebnismengen zurückgeben" -#: parser/parse_func.c:2167 parser/parse_func.c:2440 +#: parser/parse_func.c:2165 parser/parse_func.c:2438 #, c-format msgid "could not find a function named \"%s\"" msgstr "konnte keine Funktion namens »%s« finden" -#: parser/parse_func.c:2181 parser/parse_func.c:2458 +#: parser/parse_func.c:2179 parser/parse_func.c:2456 #, c-format msgid "function name \"%s\" is not unique" msgstr "Funktionsname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2183 parser/parse_func.c:2461 +#: parser/parse_func.c:2181 parser/parse_func.c:2459 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Funktion eindeutig auszuwählen." -#: parser/parse_func.c:2227 +#: parser/parse_func.c:2225 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "Prozeduren können nicht mehr als %d Argument haben" msgstr[1] "Prozeduren können nicht mehr als %d Argumente haben" -#: parser/parse_func.c:2358 +#: parser/parse_func.c:2356 #, c-format msgid "%s is not a function" msgstr "%s ist keine Funktion" -#: parser/parse_func.c:2378 +#: parser/parse_func.c:2376 #, c-format msgid "function %s is not an aggregate" msgstr "Funktion %s ist keine Aggregatfunktion" -#: parser/parse_func.c:2406 +#: parser/parse_func.c:2404 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "konnte keine Prozedur namens »%s« finden" -#: parser/parse_func.c:2420 +#: parser/parse_func.c:2418 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "konnte keine Aggregatfunktion namens »%s« finden" -#: parser/parse_func.c:2425 +#: parser/parse_func.c:2423 #, c-format msgid "aggregate %s(*) does not exist" msgstr "Aggregatfunktion %s(*) existiert nicht" -#: parser/parse_func.c:2430 +#: parser/parse_func.c:2428 #, c-format msgid "aggregate %s does not exist" msgstr "Aggregatfunktion %s existiert nicht" -#: parser/parse_func.c:2466 +#: parser/parse_func.c:2464 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "Prozedurname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2469 +#: parser/parse_func.c:2467 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Prozedur eindeutig auszuwählen." -#: parser/parse_func.c:2474 +#: parser/parse_func.c:2472 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "Aggregatfunktionsname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2477 +#: parser/parse_func.c:2475 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Aggregatfunktion eindeutig auszuwählen." -#: parser/parse_func.c:2482 +#: parser/parse_func.c:2480 #, c-format msgid "routine name \"%s\" is not unique" msgstr "Routinenname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2485 +#: parser/parse_func.c:2483 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Routine eindeutig auszuwählen." -#: parser/parse_func.c:2540 +#: parser/parse_func.c:2538 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "Funktionen mit Ergebnismenge sind in JOIN-Bedingungen nicht erlaubt" -#: parser/parse_func.c:2561 +#: parser/parse_func.c:2559 msgid "set-returning functions are not allowed in policy expressions" msgstr "Funktionen mit Ergebnismenge sind in Policy-Ausdrücken nicht erlaubt" -#: parser/parse_func.c:2577 +#: parser/parse_func.c:2575 msgid "set-returning functions are not allowed in window definitions" msgstr "Funktionen mit Ergebnismenge sind in Fensterdefinitionen nicht erlaubt" -#: parser/parse_func.c:2615 +#: parser/parse_func.c:2613 msgid "set-returning functions are not allowed in MERGE WHEN conditions" msgstr "Funktionen mit Ergebnismenge sind in MERGE-WHEN-Bedingungen nicht erlaubt" -#: parser/parse_func.c:2619 +#: parser/parse_func.c:2617 msgid "set-returning functions are not allowed in check constraints" msgstr "Funktionen mit Ergebnismenge sind in Check-Constraints nicht erlaubt" -#: parser/parse_func.c:2623 +#: parser/parse_func.c:2621 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "Funktionen mit Ergebnismenge sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_func.c:2626 +#: parser/parse_func.c:2624 msgid "set-returning functions are not allowed in index expressions" msgstr "Funktionen mit Ergebnismenge sind in Indexausdrücken nicht erlaubt" -#: parser/parse_func.c:2629 +#: parser/parse_func.c:2627 msgid "set-returning functions are not allowed in index predicates" msgstr "Funktionen mit Ergebnismenge sind in Indexprädikaten nicht erlaubt" -#: parser/parse_func.c:2632 +#: parser/parse_func.c:2630 msgid "set-returning functions are not allowed in statistics expressions" msgstr "Funktionen mit Ergebnismenge sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_func.c:2635 +#: parser/parse_func.c:2633 msgid "set-returning functions are not allowed in transform expressions" msgstr "Funktionen mit Ergebnismenge sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_func.c:2638 +#: parser/parse_func.c:2636 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "Funktionen mit Ergebnismenge sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_func.c:2641 +#: parser/parse_func.c:2639 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "Funktionen mit Ergebnismenge sind in der WHEN-Bedingung eines Triggers nicht erlaubt" -#: parser/parse_func.c:2644 +#: parser/parse_func.c:2642 msgid "set-returning functions are not allowed in partition bound" msgstr "Funktionen mit Ergebnismenge sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_func.c:2647 +#: parser/parse_func.c:2645 msgid "set-returning functions are not allowed in partition key expressions" msgstr "Funktionen mit Ergebnismenge sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_func.c:2650 +#: parser/parse_func.c:2648 msgid "set-returning functions are not allowed in CALL arguments" msgstr "Funktionen mit Ergebnismenge sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_func.c:2653 +#: parser/parse_func.c:2651 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "Funktionen mit Ergebnismenge sind in COPY-FROM-WHERE-Bedingungen nicht erlaubt" -#: parser/parse_func.c:2656 +#: parser/parse_func.c:2654 msgid "set-returning functions are not allowed in column generation expressions" msgstr "Funktionen mit Ergebnismenge sind in Spaltengenerierungsausdrücken nicht erlaubt" @@ -19568,13 +19614,13 @@ msgstr "Tabellenbezug »%s« ist nicht eindeutig" msgid "table reference %u is ambiguous" msgstr "Tabellenbezug %u ist nicht eindeutig" -#: parser/parse_relation.c:502 parser/parse_relation.c:3739 -#: parser/parse_relation.c:3748 +#: parser/parse_relation.c:502 parser/parse_relation.c:3771 +#: parser/parse_relation.c:3780 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "ungültiger Verweis auf FROM-Klausel-Eintrag für Tabelle »%s«" -#: parser/parse_relation.c:506 parser/parse_relation.c:3750 +#: parser/parse_relation.c:506 parser/parse_relation.c:3782 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Es gibt einen Eintrag für Tabelle »%s«, aber auf ihn kann aus diesem Teil der Anfrage nicht verwiesen werden." @@ -19584,143 +19630,143 @@ msgstr "Es gibt einen Eintrag für Tabelle »%s«, aber auf ihn kann aus diesem msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "Der JOIN-Typ für LATERAL muss INNER oder LEFT sein." -#: parser/parse_relation.c:711 +#: parser/parse_relation.c:743 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "Verweis auf Systemspalte »%s« im Check-Constraint ist ungültig" -#: parser/parse_relation.c:724 +#: parser/parse_relation.c:756 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "Systemspalte »%s« kann nicht in Spaltengenerierungsausdruck verwendet werden" -#: parser/parse_relation.c:735 +#: parser/parse_relation.c:767 #, c-format msgid "cannot use system column \"%s\" in MERGE WHEN condition" msgstr "Systemspalte »%s« kann nicht in MERGE-WHEN-Bedingung verwendet werden" -#: parser/parse_relation.c:1251 parser/parse_relation.c:1708 -#: parser/parse_relation.c:2402 +#: parser/parse_relation.c:1283 parser/parse_relation.c:1740 +#: parser/parse_relation.c:2434 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "Tabelle »%s« hat %d Spalten, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:1462 +#: parser/parse_relation.c:1494 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "Es gibt ein WITH-Element namens »%s«, aber darauf kann aus diesem Teil der Anfrage kein Bezug genommen werden." -#: parser/parse_relation.c:1464 +#: parser/parse_relation.c:1496 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "Verwenden Sie WITH RECURSIVE oder sortieren Sie die WITH-Ausdrücke um, um Vorwärtsreferenzen zu entfernen." -#: parser/parse_relation.c:1850 +#: parser/parse_relation.c:1882 #, c-format msgid "a column definition list is redundant for a function with OUT parameters" msgstr "eine Spaltendefinitionsliste ist überflüssig bei einer Funktion mit OUT-Parametern" -#: parser/parse_relation.c:1856 +#: parser/parse_relation.c:1888 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" msgstr "eine Spaltendefinitionsliste ist überflüssig bei einer Funktion, die einen benannten zusammengesetzten Typ zurückgibt" -#: parser/parse_relation.c:1863 +#: parser/parse_relation.c:1895 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "eine Spaltendefinitionsliste ist nur erlaubt bei Funktionen, die »record« zurückgeben" -#: parser/parse_relation.c:1874 +#: parser/parse_relation.c:1906 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "eine Spaltendefinitionsliste ist erforderlich bei Funktionen, die »record« zurückgeben" -#: parser/parse_relation.c:1911 +#: parser/parse_relation.c:1943 #, c-format msgid "column definition lists can have at most %d entries" msgstr "Spaltendefinitionslisten können höchstens %d Einträge haben" -#: parser/parse_relation.c:1971 +#: parser/parse_relation.c:2003 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "Funktion »%s« in FROM hat nicht unterstützten Rückgabetyp %s" -#: parser/parse_relation.c:1998 parser/parse_relation.c:2083 +#: parser/parse_relation.c:2030 parser/parse_relation.c:2115 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "Funktionen in FROM können höchstens %d Spalten zurückgeben" -#: parser/parse_relation.c:2113 +#: parser/parse_relation.c:2145 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "Funktion %s hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:2194 +#: parser/parse_relation.c:2226 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUES-Liste »%s« hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:2259 +#: parser/parse_relation.c:2291 #, c-format msgid "joins can have at most %d columns" msgstr "Verbunde können höchstens %d Spalten haben" -#: parser/parse_relation.c:2284 +#: parser/parse_relation.c:2316 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "Verbundausdruck »%s« hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:2375 +#: parser/parse_relation.c:2407 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH-Anfrage »%s« hat keine RETURNING-Klausel" -#: parser/parse_relation.c:3741 +#: parser/parse_relation.c:3773 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Vielleicht wurde beabsichtigt, auf den Tabellenalias »%s« zu verweisen." -#: parser/parse_relation.c:3753 +#: parser/parse_relation.c:3785 #, c-format msgid "To reference that table, you must mark this subquery with LATERAL." msgstr "Um auf diese Tabelle zu verweisen, müssen Sie diese Unteranfrage mit LATERAL markieren." -#: parser/parse_relation.c:3759 +#: parser/parse_relation.c:3791 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "fehlender Eintrag in FROM-Klausel für Tabelle »%s«" -#: parser/parse_relation.c:3799 +#: parser/parse_relation.c:3831 #, c-format msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." msgstr "Es gibt Spalten namens »%s«, aber sie sind in Tabellen, auf die aus diesem Teil der Anfrage nicht verwiesen werden kann." -#: parser/parse_relation.c:3801 +#: parser/parse_relation.c:3833 #, c-format msgid "Try using a table-qualified name." msgstr "Versuchen Sie, einen tabellenqualifizierten Namen zu verwenden." -#: parser/parse_relation.c:3809 +#: parser/parse_relation.c:3841 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Es gibt eine Spalte namens »%s« in Tabelle »%s«, aber auf sie kann aus diesem Teil der Anfrage nicht verwiesen werden." -#: parser/parse_relation.c:3812 +#: parser/parse_relation.c:3844 #, c-format msgid "To reference that column, you must mark this subquery with LATERAL." msgstr "Um auf diese Spalte zu verweisen, müssen Sie diese Unteranfrage mit LATERAL markieren." -#: parser/parse_relation.c:3814 +#: parser/parse_relation.c:3846 #, c-format msgid "To reference that column, you must use a table-qualified name." msgstr "Um auf diese Spalte zu verweisen, müssen Sie einen tabellenqualifizierten Namen verwenden." -#: parser/parse_relation.c:3834 +#: parser/parse_relation.c:3866 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Vielleicht wurde beabsichtigt, auf die Spalte »%s.%s« zu verweisen." -#: parser/parse_relation.c:3848 +#: parser/parse_relation.c:3880 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Vielleicht wurde beabsichtigt, auf die Spalte »%s.%s« oder die Spalte »%s.%s« zu verweisen." @@ -20244,7 +20290,7 @@ msgstr "Rest für Hashpartition muss eine ganze Zahl größer als oder gleich nu msgid "\"%s\" is not a hash partitioned table" msgstr "»%s« ist keine Hash-partitionierte Tabelle" -#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4958 +#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4970 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "Anzahl der Partitionierungsspalten (%d) stimmt nicht mit der Anzahl der angegebenen Partitionierungsschlüssel (%d) überein" @@ -20254,7 +20300,7 @@ msgstr "Anzahl der Partitionierungsspalten (%d) stimmt nicht mit der Anzahl der msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "Spalte %d des Partitionierungsschlüssels hat Typ %s, aber der angegebene Wert hat Typ %s" -#: partitioning/partbounds.c:4895 +#: partitioning/partbounds.c:4901 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "Spalte %d des Partitionierungsschlüssels hat Typ »%s«, aber der angegebene Wert hat Typ »%s«" @@ -21160,39 +21206,39 @@ msgstr "konnte Logdatei »%s« nicht öffnen: %m" msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "automatische Rotation abgeschaltet (SIGHUP zum Wiederanschalten verwenden)" -#: postmaster/walsummarizer.c:744 +#: postmaster/walsummarizer.c:784 #, c-format msgid "WAL summarization is not progressing" msgstr "WAL-Zusammenfassung kommt nicht voran" -#: postmaster/walsummarizer.c:745 +#: postmaster/walsummarizer.c:785 #, c-format msgid "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory." msgstr "Zusammenfassung bis %X/%X wird benötigt, aber sie hängt fest bei %X/%X auf Festplatte und %X/%X im Speicher." -#: postmaster/walsummarizer.c:759 +#: postmaster/walsummarizer.c:799 #, c-format msgid "still waiting for WAL summarization through %X/%X after %ld second" msgid_plural "still waiting for WAL summarization through %X/%X after %ld seconds" msgstr[0] "warte immer noch auf WAL-Zusammenfassung bis %X/%X nach %ld Sekunde" msgstr[1] "warte immer noch auf WAL-Zusammenfassung bis %X/%X nach %ld Sekunden" -#: postmaster/walsummarizer.c:764 +#: postmaster/walsummarizer.c:804 #, c-format msgid "Summarization has reached %X/%X on disk and %X/%X in memory." msgstr "Zusammenfassung hat %X/%X auf Festplatte und %X/%X im Speicher erreicht." -#: postmaster/walsummarizer.c:1004 +#: postmaster/walsummarizer.c:1103 #, c-format msgid "could not find a valid record after %X/%X" msgstr "konnte keinen gültigen Datensatz nach %X/%X finden" -#: postmaster/walsummarizer.c:1049 +#: postmaster/walsummarizer.c:1148 #, c-format msgid "could not read WAL from timeline %u at %X/%X: %s" msgstr "konnte WAL aus Zeitleiste %u bei %X/%X nicht lesen: %s" -#: postmaster/walsummarizer.c:1055 +#: postmaster/walsummarizer.c:1154 #, c-format msgid "could not read WAL from timeline %u at %X/%X" msgstr "konnte WAL aus Zeitleiste %u bei %X/%X nicht lesen" @@ -21238,7 +21284,7 @@ msgid "could not clear search path: %s" msgstr "konnte Suchpfad nicht auf leer setzen: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:308 -#: replication/libpqwalreceiver/libpqwalreceiver.c:508 +#: replication/libpqwalreceiver/libpqwalreceiver.c:522 #, c-format msgid "invalid connection string syntax: %s" msgstr "ungültige Syntax für Verbindungszeichenkette: %s" @@ -21259,7 +21305,8 @@ msgid "could not receive database system identifier and timeline ID from the pri msgstr "konnte Datenbanksystemidentifikator und Zeitleisten-ID nicht vom Primärserver empfangen: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:455 -#: replication/libpqwalreceiver/libpqwalreceiver.c:762 +#: replication/libpqwalreceiver/libpqwalreceiver.c:795 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1045 #, c-format msgid "invalid response from primary server" msgstr "ungültige Antwort vom Primärserver" @@ -21269,91 +21316,99 @@ msgstr "ungültige Antwort vom Primärserver" msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "Konnte System nicht identifizieren: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet." -#: replication/libpqwalreceiver/libpqwalreceiver.c:597 -#: replication/libpqwalreceiver/libpqwalreceiver.c:604 -#: replication/libpqwalreceiver/libpqwalreceiver.c:636 +#: replication/libpqwalreceiver/libpqwalreceiver.c:470 +#, c-format +msgid "could not parse WAL location \"%s\"" +msgstr "konnte WAL-Position »%s« nicht parsen" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:669 #, c-format msgid "could not start WAL streaming: %s" msgstr "konnte WAL-Streaming nicht starten: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:660 +#: replication/libpqwalreceiver/libpqwalreceiver.c:693 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "konnte End-of-Streaming-Nachricht nicht an Primärserver senden: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:684 +#: replication/libpqwalreceiver/libpqwalreceiver.c:717 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "unerwartete Ergebnismenge nach End-of-Streaming" -#: replication/libpqwalreceiver/libpqwalreceiver.c:700 +#: replication/libpqwalreceiver/libpqwalreceiver.c:733 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "Fehler beim Beenden des COPY-Datenstroms: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:711 +#: replication/libpqwalreceiver/libpqwalreceiver.c:744 #, c-format msgid "error reading result of streaming command: %s" msgstr "Fehler beim Lesen des Ergebnisses von Streaming-Befehl: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:721 -#: replication/libpqwalreceiver/libpqwalreceiver.c:857 +#: replication/libpqwalreceiver/libpqwalreceiver.c:754 +#: replication/libpqwalreceiver/libpqwalreceiver.c:890 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "unerwartetes Ergebnis nach CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:750 +#: replication/libpqwalreceiver/libpqwalreceiver.c:783 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "konnte Zeitleisten-History-Datei nicht vom Primärserver empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:763 +#: replication/libpqwalreceiver/libpqwalreceiver.c:796 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "1 Tupel mit 2 Feldern erwartet, %d Tupel mit %d Feldern erhalten." -#: replication/libpqwalreceiver/libpqwalreceiver.c:818 -#: replication/libpqwalreceiver/libpqwalreceiver.c:873 -#: replication/libpqwalreceiver/libpqwalreceiver.c:880 +#: replication/libpqwalreceiver/libpqwalreceiver.c:851 +#: replication/libpqwalreceiver/libpqwalreceiver.c:906 +#: replication/libpqwalreceiver/libpqwalreceiver.c:913 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "konnte keine Daten vom WAL-Stream empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:900 +#: replication/libpqwalreceiver/libpqwalreceiver.c:933 #, c-format msgid "could not send data to WAL stream: %s" msgstr "konnte keine Daten an den WAL-Stream senden: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1037 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1046 +#, c-format +msgid "Could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields." +msgstr "Konnte Replikations-Slot »%s« nicht erzeugen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1098 #, c-format msgid "could not alter replication slot \"%s\": %s" msgstr "konnte Replikations-Slot »%s« nicht ändern: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1089 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1132 #, c-format msgid "invalid query response" msgstr "ungültige Antwort auf Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1090 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1133 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d Felder erwartet, %d Feldern erhalten." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1160 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1203 #, c-format msgid "the query interface requires a database connection" msgstr "Ausführen von Anfragen benötigt eine Datenbankverbindung" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1194 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1237 msgid "empty query" msgstr "leere Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1200 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1243 msgid "unexpected pipeline mode" msgstr "unerwarteter Pipeline-Modus" @@ -21518,7 +21573,7 @@ msgstr "alle Slots für Arbeitsprozesse für logische Replikation belegt" #. translator: %s is a GUC variable name #: replication/logical/launcher.c:438 replication/logical/launcher.c:524 -#: replication/slot.c:1670 replication/slot.c:1690 storage/lmgr/lock.c:1042 +#: replication/slot.c:1672 replication/slot.c:1692 storage/lmgr/lock.c:1042 #: storage/lmgr/lock.c:1080 storage/lmgr/lock.c:2969 storage/lmgr/lock.c:4374 #: storage/lmgr/lock.c:4439 storage/lmgr/lock.c:4789 #: storage/lmgr/predicate.c:2479 storage/lmgr/predicate.c:2494 @@ -21572,8 +21627,8 @@ msgstr "logischer Replikations-Slot kann nicht in einer Transaktion erzeugt werd msgid "cannot use replication slot \"%s\" for logical decoding" msgstr "physischer Replikations-Slot »%s« kann nicht für logisches Dekodieren verwendet werden" -#: replication/logical/logical.c:546 replication/slot.c:858 -#: replication/slot.c:903 +#: replication/logical/logical.c:546 replication/slot.c:860 +#: replication/slot.c:905 #, c-format msgid "This replication slot is being synchronized from the primary server." msgstr "Dieser Replikations-Slot wird vom Primärserver synchronisiert." @@ -21781,34 +21836,34 @@ msgstr "Zielrelation für logische Replikation »%s.%s« verwendet Systemspalten msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "Zielrelation für logische Replikation »%s.%s« existiert nicht" -#: replication/logical/reorderbuffer.c:4252 +#: replication/logical/reorderbuffer.c:4276 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "konnte nicht in Datendatei für XID %u schreiben: %m" -#: replication/logical/reorderbuffer.c:4598 -#: replication/logical/reorderbuffer.c:4623 +#: replication/logical/reorderbuffer.c:4622 +#: replication/logical/reorderbuffer.c:4647 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "konnte nicht aus Reorder-Buffer-Spill-Datei lesen: %m" -#: replication/logical/reorderbuffer.c:4602 -#: replication/logical/reorderbuffer.c:4627 +#: replication/logical/reorderbuffer.c:4626 +#: replication/logical/reorderbuffer.c:4651 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "konnte nicht aus Reorder-Buffer-Spill-Datei lesen: %d statt %u Bytes gelesen" -#: replication/logical/reorderbuffer.c:4876 +#: replication/logical/reorderbuffer.c:4900 #, c-format msgid "could not remove file \"%s\" during removal of %s/%s/xid*: %m" msgstr "konnte Datei »%s« nicht löschen, beim Löschen von %s/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:5373 +#: replication/logical/reorderbuffer.c:5397 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "konnte nicht aus Datei »%s« lesen: %d statt %d Bytes gelesen" -#: replication/logical/slotsync.c:225 replication/logical/slotsync.c:620 +#: replication/logical/slotsync.c:225 replication/logical/slotsync.c:623 #, c-format msgid "could not synchronize replication slot \"%s\"" msgstr "konnte Replikations-Slot »%s« nicht synchronisieren" @@ -21818,53 +21873,53 @@ msgstr "konnte Replikations-Slot »%s« nicht synchronisieren" msgid "Synchronization could lead to data loss, because the remote slot needs WAL at LSN %X/%X and catalog xmin %u, but the standby has LSN %X/%X and catalog xmin %u." msgstr "Synchronisation könnte zu Datenverlust führen, weil der Remote-Slot WAL bei LSN %X/%X und Katalog-xmin %u benötigt, aber der Standby LSN %X/%X und Katalog-xmin %u hat." -#: replication/logical/slotsync.c:499 +#: replication/logical/slotsync.c:498 #, c-format msgid "dropped replication slot \"%s\" of database with OID %u" msgstr "Replikations-Slot »%s« von Datenbank mit OID %u wurde gelöscht" -#: replication/logical/slotsync.c:621 +#: replication/logical/slotsync.c:624 #, c-format msgid "Synchronization could lead to data loss, because the standby could not build a consistent snapshot to decode WALs at LSN %X/%X." msgstr "Synchronisation könnte zu Datenverlust führen, weil der Standby keinen konsistenten Snapshot zum Dekodieren von WAL bei LSN %X/%X bauen konnte." -#: replication/logical/slotsync.c:630 +#: replication/logical/slotsync.c:633 #, c-format msgid "newly created replication slot \"%s\" is sync-ready now" msgstr "neu erzeugter Replikations-Slot »%s« ist jetzt bereit für die Synchronisierung" -#: replication/logical/slotsync.c:669 +#: replication/logical/slotsync.c:672 #, c-format msgid "skipping slot synchronization because the received slot sync LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X" msgstr "Slot-Synchronisierung wird übersprungen, weil die empfangene Slot-Sync-LSN %X/%X für Slot »%s« der Position %X/%X des Standbys voraus ist" -#: replication/logical/slotsync.c:691 +#: replication/logical/slotsync.c:694 #, c-format msgid "exiting from slot synchronization because same name slot \"%s\" already exists on the standby" msgstr "verlasse Slot-Synchronisierung, weil der gleiche Slot »%s« schon auf dem Standby existiert" -#: replication/logical/slotsync.c:862 +#: replication/logical/slotsync.c:865 #, c-format msgid "could not fetch failover logical slots info from the primary server: %s" msgstr "konnte Informationen über logische Failover-Slots nicht vom Primärserver holen: %s" -#: replication/logical/slotsync.c:1011 +#: replication/logical/slotsync.c:1014 #, c-format msgid "could not fetch primary slot name \"%s\" info from the primary server: %s" msgstr "konnte Informationen über primary_slot_name »%s« nicht vom Primärserver holen: %s" -#: replication/logical/slotsync.c:1013 +#: replication/logical/slotsync.c:1016 #, c-format msgid "Check if \"primary_slot_name\" is configured correctly." msgstr "Prüfen Sie, ob »primary_slot_name« korrekt konfiguriert ist." -#: replication/logical/slotsync.c:1033 +#: replication/logical/slotsync.c:1036 #, c-format msgid "cannot synchronize replication slots from a standby server" msgstr "Replikations-Slots können nicht von einem Standby-Server synchronisiert werden" #. translator: second %s is a GUC variable name -#: replication/logical/slotsync.c:1042 +#: replication/logical/slotsync.c:1045 #, c-format msgid "replication slot \"%s\" specified by \"%s\" does not exist on primary server" msgstr "Replikations-Slot »%s«, der in »%s« angegeben ist, existiert auf dem Publikationsserver nicht" @@ -21872,75 +21927,75 @@ msgstr "Replikations-Slot »%s«, der in »%s« angegeben ist, existiert auf dem #. translator: first %s is a connection option; second %s is a GUC #. variable name #. -#: replication/logical/slotsync.c:1075 +#: replication/logical/slotsync.c:1078 #, c-format msgid "replication slot synchronization requires \"%s\" to be specified in \"%s\"" msgstr "Replikations-Slot-Synchronisierung erfordert, dass »%s« in »%s« angegeben wird" -#: replication/logical/slotsync.c:1094 +#: replication/logical/slotsync.c:1097 #, c-format msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" msgstr "Replikations-Slot-Synchronisierung erfordert »wal_level« >= »logical«" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1109 replication/logical/slotsync.c:1137 +#: replication/logical/slotsync.c:1112 replication/logical/slotsync.c:1140 #, c-format msgid "replication slot synchronization requires \"%s\" to be set" msgstr "Replikations-Slot-Synchronisierung erfordert, dass »%s« definiert ist" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1123 +#: replication/logical/slotsync.c:1126 #, c-format msgid "replication slot synchronization requires \"%s\" to be enabled" msgstr "Replikations-Slot-Synchronisierung erfordert, dass »%s« eingeschaltet ist" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1180 +#: replication/logical/slotsync.c:1183 #, c-format msgid "replication slot synchronization worker will stop because \"%s\" is disabled" msgstr "Arbeitsprozess für Replikations-Slot-Synchronisierung wird anhalten, weil »%s« deaktiviert ist" -#: replication/logical/slotsync.c:1198 +#: replication/logical/slotsync.c:1201 #, c-format msgid "replication slot synchronization worker will restart because of a parameter change" msgstr "Arbeitsprozess für Replikations-Slot-Synchronisierung wird neu starten wegen einer Parameteränderung" -#: replication/logical/slotsync.c:1223 +#: replication/logical/slotsync.c:1226 #, c-format msgid "replication slot synchronization will stop because of a parameter change" msgstr "Arbeitsprozess für Replikations-Slot-Synchronisierung wird anhalten wegen einer Parameteränderung" -#: replication/logical/slotsync.c:1259 +#: replication/logical/slotsync.c:1262 #, c-format msgid "replication slot synchronization worker will stop because promotion is triggered" msgstr "Arbeitsprozess für Replikations-Slot-Synchronisierung wird anhalten, weil Beförderung ausgelöst wurde" -#: replication/logical/slotsync.c:1273 +#: replication/logical/slotsync.c:1276 #, c-format msgid "replication slot synchronization will stop because promotion is triggered" msgstr "Replikations-Slot-Synchronisierung wird anhalten, weil Beförderung ausgelöst wurde" -#: replication/logical/slotsync.c:1393 +#: replication/logical/slotsync.c:1396 #, c-format msgid "replication slot synchronization worker will not start because promotion was triggered" msgstr "Arbeitsprozess für Replikations-Slot-Synchronisierung wird nicht starten, weil Beförderung ausgelöst wurde" -#: replication/logical/slotsync.c:1405 +#: replication/logical/slotsync.c:1408 #, c-format msgid "replication slot synchronization will not start because promotion was triggered" msgstr "Replikations-Slot-Synchronisierung wird nicht starten, weil Beförderung ausgelöst wurde" -#: replication/logical/slotsync.c:1414 +#: replication/logical/slotsync.c:1417 #, c-format msgid "cannot synchronize replication slots concurrently" msgstr "Replikations-Slots können nicht nebenläufig synchronisiert werden" -#: replication/logical/slotsync.c:1526 +#: replication/logical/slotsync.c:1529 #, c-format msgid "slot sync worker started" msgstr "Slot-Sync-Arbeitsprozess gestartet" -#: replication/logical/slotsync.c:1588 replication/slotfuncs.c:928 +#: replication/logical/slotsync.c:1591 replication/slotfuncs.c:928 #, c-format msgid "synchronization worker \"%s\" could not connect to the primary server: %s" msgstr "Synchronisierungs-Arbeitsprozess »%s« konnte nicht mit dem Primärserver verbinden: %s" @@ -22048,22 +22103,22 @@ msgstr "konnte WHERE-Klausel-Informationen für Tabelle »%s.%s« nicht vom Publ msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "konnte Kopieren des Anfangsinhalts für Tabelle »%s.%s« nicht starten: %s" -#: replication/logical/tablesync.c:1380 +#: replication/logical/tablesync.c:1381 #, c-format msgid "table synchronization worker for subscription \"%s\" could not connect to the publisher: %s" msgstr "Arbeitsprozess für Tabellensynchronisation für Subskription »%s« konnte nicht mit dem Publikationsserver verbinden: %s" -#: replication/logical/tablesync.c:1480 +#: replication/logical/tablesync.c:1481 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht gestartet werden: %s" -#: replication/logical/tablesync.c:1540 replication/logical/worker.c:2378 +#: replication/logical/tablesync.c:1541 replication/logical/worker.c:2388 #, c-format msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" msgstr "Benutzer »%s« kann nicht in eine Relation mit Sicherheit auf Zeilenebene replizieren: »%s«" -#: replication/logical/tablesync.c:1553 +#: replication/logical/tablesync.c:1554 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht beenden werden: %s" @@ -22078,152 +22133,158 @@ msgstr "Parallel-Apply-Worker für logische Replikation für Subskription »%s« msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." msgstr "Gestreamte Replikationstransaktionen können erst mit parallelen Apply-Worker-Prozessen verarbeitet werden, wenn alle Tabellen synchronisiert worden sind." -#: replication/logical/worker.c:846 replication/logical/worker.c:961 +#: replication/logical/worker.c:813 replication/logical/worker.c:930 +#: replication/logical/worker.c:2634 +#, c-format +msgid "logical replication column %d not found in tuple: only %d column(s) received" +msgstr "Spalte %d für logische Replikation nicht im Tupel gefunden: nur %d Spalte(n) empfangen" + +#: replication/logical/worker.c:852 replication/logical/worker.c:971 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "falsches Binärdatenformat in Spalte %d in logischer Replikation" -#: replication/logical/worker.c:2525 +#: replication/logical/worker.c:2535 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "Publikationsserver hat nicht die Replikidentitätsspalten gesendet, die von Replikationszielrelation »%s.%s« erwartet wurden" -#: replication/logical/worker.c:2532 +#: replication/logical/worker.c:2542 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "Zielrelation für logische Replikation »%s.%s« hat weder REPLICA-IDENTITY-Index noch Primärschlüssel und die publizierte Relation hat kein REPLICA IDENTITY FULL" -#: replication/logical/worker.c:3467 +#: replication/logical/worker.c:3482 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "ungültiger Nachrichtentyp für logische Replikation »??? (%d)«" -#: replication/logical/worker.c:3639 +#: replication/logical/worker.c:3654 #, c-format msgid "data stream from publisher has ended" msgstr "Datenstrom vom Publikationsserver endete" -#: replication/logical/worker.c:3793 +#: replication/logical/worker.c:3808 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "Arbeitsprozess für logische Replikation wird abgebrochen wegen Zeitüberschreitung" -#: replication/logical/worker.c:3990 +#: replication/logical/worker.c:4005 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird anhalten, weil die Subskription entfernt wurde" -#: replication/logical/worker.c:4004 +#: replication/logical/worker.c:4019 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird anhalten, weil die Subskription deaktiviert wurde" -#: replication/logical/worker.c:4035 +#: replication/logical/worker.c:4050 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" msgstr "Parallel-Apply-Worker für logische Replikation für Subskription »%s« wird anhalten wegen einer Parameteränderung" -#: replication/logical/worker.c:4039 +#: replication/logical/worker.c:4054 #, c-format msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird neu starten wegen einer Parameteränderung" -#: replication/logical/worker.c:4053 +#: replication/logical/worker.c:4068 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked" msgstr "Parallel-Apply-Worker für logische Replikation für Subskription »%s« wird anhalten, weil die Superuser-Privilegien des Eigentümers der Subskription entzogen wurden" -#: replication/logical/worker.c:4057 +#: replication/logical/worker.c:4072 #, c-format msgid "logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked" msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird neu starten, weil die Superuser-Privilegien des Eigentümers der Subskription entzogen wurden" -#: replication/logical/worker.c:4567 +#: replication/logical/worker.c:4582 #, c-format msgid "subscription has no replication slot set" msgstr "für die Subskription ist kein Replikations-Slot gesetzt" -#: replication/logical/worker.c:4592 +#: replication/logical/worker.c:4607 #, c-format msgid "apply worker for subscription \"%s\" could not connect to the publisher: %s" msgstr "Apply-Worker für Subskription »%s« konnte nicht mit dem Publikationsserver verbinden: %s" -#: replication/logical/worker.c:4696 +#: replication/logical/worker.c:4711 #, c-format msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" msgstr "Arbeitsprozess für logische Replikation für Subskription %u« wird nicht starten, weil die Subskription während des Starts entfernt wurde" -#: replication/logical/worker.c:4712 +#: replication/logical/worker.c:4727 #, c-format msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird nicht starten, weil die Subskription während des Starts deaktiviert wurde" -#: replication/logical/worker.c:4736 +#: replication/logical/worker.c:4751 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "Arbeitsprozess für logische Replikation für Tabellensynchronisation für Subskription »%s«, Tabelle »%s« hat gestartet" -#: replication/logical/worker.c:4741 +#: replication/logical/worker.c:4756 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "Apply-Worker für logische Replikation für Subskription »%s« hat gestartet" -#: replication/logical/worker.c:4875 +#: replication/logical/worker.c:4886 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "Subskription »%s« wurde wegen eines Fehlers deaktiviert" -#: replication/logical/worker.c:4923 +#: replication/logical/worker.c:4934 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "logische Replikation beginnt Überspringen von Transaktion bei %X/%X" -#: replication/logical/worker.c:4937 +#: replication/logical/worker.c:4948 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "logische Replikation beendet Überspringen von Transaktion bei %X/%X" -#: replication/logical/worker.c:5025 +#: replication/logical/worker.c:5036 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "Skip-LSN von Subskription »%s« gelöscht" -#: replication/logical/worker.c:5026 +#: replication/logical/worker.c:5037 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." msgstr "Die WAL-Endposition (LSN) %X/%X der Remote-Transaktion stimmte nicht mit der Skip-LSN %X/%X überein." -#: replication/logical/worker.c:5054 +#: replication/logical/worker.c:5065 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s«" -#: replication/logical/worker.c:5058 +#: replication/logical/worker.c:5069 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« in Transaktion %u" -#: replication/logical/worker.c:5063 +#: replication/logical/worker.c:5074 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« in Transaktion %u, beendet bei %X/%X" -#: replication/logical/worker.c:5074 +#: replication/logical/worker.c:5085 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« in Transaktion %u" -#: replication/logical/worker.c:5081 +#: replication/logical/worker.c:5092 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« in Transaktion %u, beendet bei %X/%X" -#: replication/logical/worker.c:5092 +#: replication/logical/worker.c:5103 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« Spalte »%s« in Transaktion %u" -#: replication/logical/worker.c:5100 +#: replication/logical/worker.c:5111 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« Spalte »%s« in Transaktion %u, beendet bei %X/%X" @@ -22327,7 +22388,7 @@ msgstr "Replikations-Slot-Namen dürfen nur Kleinbuchstaben, Zahlen und Unterstr msgid "cannot enable failover for a replication slot created on the standby" msgstr "Failover kann nicht für einen auf dem Standby erzeugten Replikations-Slot eingeschaltet werden" -#: replication/slot.c:389 replication/slot.c:925 +#: replication/slot.c:389 replication/slot.c:927 #, c-format msgid "cannot enable failover for a temporary replication slot" msgstr "Failover kann nicht für einen temporären Replikations-Slot eingeschaltet werden" @@ -22353,7 +22414,7 @@ msgstr "Geben Sie einen frei oder erhöhen Sie »max_replication_slots«." msgid "replication slot \"%s\" does not exist" msgstr "Replikations-Slot »%s« existiert nicht" -#: replication/slot.c:664 replication/slot.c:1499 +#: replication/slot.c:664 replication/slot.c:1501 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "Replikations-Slot »%s« ist aktiv für PID %d" @@ -22378,199 +22439,199 @@ msgstr "logischer Replikations-Slot »%s« wurde akquiriert" msgid "acquired physical replication slot \"%s\"" msgstr "physischer Replikations-Slot »%s« wurde akquiriert" -#: replication/slot.c:789 +#: replication/slot.c:791 #, c-format msgid "released logical replication slot \"%s\"" msgstr "logischer Replikations-Slot »%s« wurde freigegeben" -#: replication/slot.c:791 +#: replication/slot.c:793 #, c-format msgid "released physical replication slot \"%s\"" msgstr "physischer Replikations-Slot »%s« wurde freigegeben" -#: replication/slot.c:857 +#: replication/slot.c:859 #, c-format msgid "cannot drop replication slot \"%s\"" msgstr "kann Replikations-Slot »%s« nicht löschen" -#: replication/slot.c:890 +#: replication/slot.c:892 #, c-format msgid "cannot use %s with a physical replication slot" msgstr "%s kann nicht mit einem physischem Replikations-Slot verwendet werden" -#: replication/slot.c:902 +#: replication/slot.c:904 #, c-format msgid "cannot alter replication slot \"%s\"" msgstr "Replikations-Slot »%s« kann nicht geändert werden" -#: replication/slot.c:912 +#: replication/slot.c:914 #, c-format msgid "cannot enable failover for a replication slot on the standby" msgstr "Failover kann nicht für einen Replikations-Slot auf dem Standby eingeschaltet werden" -#: replication/slot.c:1060 replication/slot.c:2228 replication/slot.c:2621 +#: replication/slot.c:1062 replication/slot.c:2230 replication/slot.c:2623 #, c-format msgid "could not remove directory \"%s\"" msgstr "konnte Verzeichnis »%s« nicht löschen" -#: replication/slot.c:1534 +#: replication/slot.c:1536 #, c-format msgid "replication slots can only be used if \"max_replication_slots\" > 0" msgstr "Replikations-Slots können nur verwendet werden, wenn »max_replication_slots« > 0" -#: replication/slot.c:1539 +#: replication/slot.c:1541 #, c-format msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" msgstr "Replikations-Slots können nur verwendet werden, wenn »wal_level« >= replica" -#: replication/slot.c:1551 +#: replication/slot.c:1553 #, c-format msgid "permission denied to use replication slots" msgstr "keine Berechtigung, um Replikations-Slots zu verwenden" -#: replication/slot.c:1552 +#: replication/slot.c:1554 #, c-format msgid "Only roles with the %s attribute may use replication slots." msgstr "Nur Rollen mit dem %s-Attribut können Replikations-Slots verwenden." -#: replication/slot.c:1664 +#: replication/slot.c:1666 #, c-format msgid "The slot's restart_lsn %X/%X exceeds the limit by % byte." msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by % bytes." msgstr[0] "Die restart_lsn des Slots %X/%X überschreitet das Maximum um % Byte." msgstr[1] "Die restart_lsn des Slots %X/%X überschreitet das Maximum um % Bytes." -#: replication/slot.c:1675 +#: replication/slot.c:1677 #, c-format msgid "The slot conflicted with xid horizon %u." msgstr "Der Slot kollidierte mit dem xid-Horizont %u." -#: replication/slot.c:1680 +#: replication/slot.c:1682 msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." msgstr "Logische Dekodierung auf dem Standby-Server erfordert »wal_level« >= »logical« auf dem Primärserver." #. translator: %s is a GUC variable name -#: replication/slot.c:1686 +#: replication/slot.c:1688 #, c-format msgid "The slot's idle time of %lds exceeds the configured \"%s\" duration of %ds." msgstr "Die Leerlaufzeit des Slots von %lds überschreitet die durch »%s« konfigurierte Dauer von %ds." -#: replication/slot.c:1700 +#: replication/slot.c:1702 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "Prozess %d wird beendet, um Replikations-Slot »%s« freizugeben" -#: replication/slot.c:1702 +#: replication/slot.c:1704 #, c-format msgid "invalidating obsolete replication slot \"%s\"" msgstr "obsoleter Replikations-Slot »%s« wird ungültig gemacht" -#: replication/slot.c:2559 +#: replication/slot.c:2561 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "Replikations-Slot-Datei »%s« hat falsche magische Zahl: %u statt %u" -#: replication/slot.c:2566 +#: replication/slot.c:2568 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "Replikations-Slot-Datei »%s« hat nicht unterstützte Version %u" -#: replication/slot.c:2573 +#: replication/slot.c:2575 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "Replikations-Slot-Datei »%s« hat falsche Länge %u" -#: replication/slot.c:2609 +#: replication/slot.c:2611 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "Prüfsummenfehler bei Replikations-Slot-Datei »%s«: ist %u, sollte %u sein" -#: replication/slot.c:2645 +#: replication/slot.c:2647 #, c-format msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" msgstr "logischer Replikations-Slot »%s« existiert, aber »wal_level« < »logical«" -#: replication/slot.c:2647 +#: replication/slot.c:2649 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "Ändern Sie »wal_level« in »logical« oder höher." -#: replication/slot.c:2659 +#: replication/slot.c:2661 #, c-format msgid "logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = \"off\"" msgstr "logischer Replikations-Slot »%s« existiert auf dem Standby, aber »hot_standby« = »off«" -#: replication/slot.c:2661 +#: replication/slot.c:2663 #, c-format msgid "Change \"hot_standby\" to be \"on\"." msgstr "Ändern Sie »hot_standby« auf »on«." -#: replication/slot.c:2666 +#: replication/slot.c:2668 #, c-format msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "physischer Replikations-Slot »%s« existiert, aber »wal_level« < »replica«" -#: replication/slot.c:2668 +#: replication/slot.c:2670 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "Ändern Sie »wal_level« in »replica« oder höher." -#: replication/slot.c:2715 +#: replication/slot.c:2717 #, c-format msgid "too many replication slots active before shutdown" msgstr "zu viele aktive Replikations-Slots vor dem Herunterfahren" -#: replication/slot.c:2716 +#: replication/slot.c:2718 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "Erhöhen Sie »max_replication_slots« und versuchen Sie es erneut." -#: replication/slot.c:2953 +#: replication/slot.c:2955 #, c-format msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" msgstr "Replikations-Slot »%s«, der in Parameter »%s« angegeben ist, existiert nicht" -#: replication/slot.c:2955 replication/slot.c:2989 replication/slot.c:3004 +#: replication/slot.c:2957 replication/slot.c:2991 replication/slot.c:3006 #, c-format msgid "Logical replication is waiting on the standby associated with replication slot \"%s\"." msgstr "Logische Replikation wartet auf den Standby, der zum Replikations-Slot »%s« gehört." -#: replication/slot.c:2957 +#: replication/slot.c:2959 #, c-format msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." msgstr "Erzeugen Sie den Replikations-Slot »%s« oder berichtigen Sie den Parameter »%s«." -#: replication/slot.c:2967 +#: replication/slot.c:2969 #, c-format msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" msgstr "logischer Replikations-Slot »%s« kann nicht in Parameter »%s« angegeben werden" -#: replication/slot.c:2969 +#: replication/slot.c:2971 #, c-format msgid "Logical replication is waiting for correction on replication slot \"%s\"." msgstr "Logische Replikation wartet auf Korrektur bei Replikations-Slot »%s«." -#: replication/slot.c:2971 +#: replication/slot.c:2973 #, c-format msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." msgstr "Entfernen Sie den Replikations-Slot »%s« aus dem Parameter »%s«." -#: replication/slot.c:2987 +#: replication/slot.c:2989 #, c-format msgid "physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated" msgstr "der physische Replikations-Slot »%s«, der in Parameter »%s« angegeben wurde, wurde ungültig gemacht" -#: replication/slot.c:2991 +#: replication/slot.c:2993 #, c-format msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." msgstr "Löschen Sie den Replikations-Slot »%s« und erzeugen Sie ihn neu, oder berichtigen Sie den Parameter »%s«." -#: replication/slot.c:3002 +#: replication/slot.c:3004 #, c-format msgid "replication slot \"%s\" specified in parameter \"%s\" does not have active_pid" msgstr "der Replikations-Slot »%s«, der in Parameter »%s« angegeben wurde, hat keine active_pid" -#: replication/slot.c:3006 +#: replication/slot.c:3008 #, c-format msgid "Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\"." msgstr "Starten Sie den zum Replikations-Slot »%s« gehörenden Standby oder berichtigen Sie den Parameter »%s«." @@ -22686,72 +22747,82 @@ msgstr "Parser für »%s« fehlgeschlagen." msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "Anzahl synchroner Standbys (%d) muss größer als null sein" -#: replication/walreceiver.c:276 +#: replication/walreceiver.c:285 #, c-format msgid "streaming replication receiver \"%s\" could not connect to the primary server: %s" msgstr "Streaming-Replication-Receiver »%s« konnte nicht mit dem Primärserver verbinden: %s" -#: replication/walreceiver.c:324 +#: replication/walreceiver.c:335 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "Datenbanksystemidentifikator unterscheidet sich zwischen Primär- und Standby-Server" -#: replication/walreceiver.c:325 +#: replication/walreceiver.c:336 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Identifikator des Primärservers ist %s, Identifikator des Standby ist %s." -#: replication/walreceiver.c:336 +#: replication/walreceiver.c:347 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "höchste Zeitleiste %u des primären Servers liegt hinter Wiederherstellungszeitleiste %u zurück" -#: replication/walreceiver.c:389 +#: replication/walreceiver.c:390 +#, c-format +msgid "walreceiver requested start point %X/%08X on timeline %u is ahead of the upstream server's flush position %X/%08X, waiting" +msgstr "vom Walreceiver angeforderter Startpunkt %X/%08X auf Zeitleiste %u ist der Flush-Position %X/%08X des Upstream-Servers voraus, warte" + +#: replication/walreceiver.c:405 +#, c-format +msgid "terminating walreceiver due to timeout while waiting for upstream to catch up" +msgstr "WAL-Receiver-Prozess wird abgebrochen wegen Zeitüberschreitung beim Warten, dass der Upstream-Server aufholt" + +#: replication/walreceiver.c:466 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "WAL-Streaming vom Primärserver gestartet bei %X/%X auf Zeitleiste %u" -#: replication/walreceiver.c:393 +#: replication/walreceiver.c:470 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "WAL-Streaming neu gestartet bei %X/%X auf Zeitleiste %u" -#: replication/walreceiver.c:428 +#: replication/walreceiver.c:505 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "kann WAL-Streaming nicht fortsetzen, Wiederherstellung ist bereits beendet" -#: replication/walreceiver.c:472 +#: replication/walreceiver.c:549 #, c-format msgid "replication terminated by primary server" msgstr "Replikation wurde durch Primärserver beendet" -#: replication/walreceiver.c:473 +#: replication/walreceiver.c:550 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "WAL-Ende erreicht auf Zeitleiste %u bei %X/%X." -#: replication/walreceiver.c:573 +#: replication/walreceiver.c:650 #, c-format msgid "terminating walreceiver due to timeout" msgstr "WAL-Receiver-Prozess wird abgebrochen wegen Zeitüberschreitung" -#: replication/walreceiver.c:605 +#: replication/walreceiver.c:682 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "Primärserver enthält kein WAL mehr auf angeforderter Zeitleiste %u" -#: replication/walreceiver.c:621 replication/walreceiver.c:1063 +#: replication/walreceiver.c:698 replication/walreceiver.c:1140 #, c-format msgid "could not close WAL segment %s: %m" msgstr "konnte WAL-Segment %s nicht schließen: %m" -#: replication/walreceiver.c:740 +#: replication/walreceiver.c:817 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "hole Zeitleisten-History-Datei für Zeitleiste %u vom Primärserver" -#: replication/walreceiver.c:951 +#: replication/walreceiver.c:1025 #, c-format msgid "could not write to WAL segment %s at offset %d, length %lu: %m" msgstr "konnte nicht in WAL-Segment %s bei Position %d, Länge %lu schreiben: %m" @@ -22792,94 +22863,94 @@ msgid "requested starting point %X/%X is ahead of the WAL flush position of this msgstr "angeforderter Startpunkt %X/%X ist vor der WAL-Flush-Position dieses Servers %X/%X" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1257 +#: replication/walsender.c:1279 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s darf nicht in einer Transaktion aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1267 +#: replication/walsender.c:1289 #, c-format msgid "%s must be called inside a transaction" msgstr "%s muss in einer Transaktion aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1273 +#: replication/walsender.c:1295 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s muss in einer Transaktion im Isolationsmodus REPEATABLE READ aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1278 +#: replication/walsender.c:1300 #, c-format msgid "%s must be called in a read-only transaction" msgstr "%s muss in einer Read-Only-Transaktion aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1284 +#: replication/walsender.c:1306 #, c-format msgid "%s must be called before any query" msgstr "%s muss vor allen Anfragen aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1290 +#: replication/walsender.c:1312 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s darf nicht in einer Subtransaktion aufgerufen werden" -#: replication/walsender.c:1467 +#: replication/walsender.c:1489 #, c-format msgid "terminating walsender process after promotion" msgstr "WAL-Sender-Prozess wird nach Beförderung abgebrochen" -#: replication/walsender.c:2016 +#: replication/walsender.c:2038 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "während der WAL-Sender im Stoppmodus ist können keine neuen Befehle ausgeführt werden" -#: replication/walsender.c:2070 +#: replication/walsender.c:2092 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "im WAL-Sender für physische Replikation können keine SQL-Befehle ausgeführt werden" -#: replication/walsender.c:2101 +#: replication/walsender.c:2123 #, c-format msgid "received replication command: %s" msgstr "Replikationsbefehl empfangen: %s" -#: replication/walsender.c:2109 tcop/fastpath.c:208 tcop/postgres.c:1138 +#: replication/walsender.c:2131 tcop/fastpath.c:208 tcop/postgres.c:1138 #: tcop/postgres.c:1495 tcop/postgres.c:1747 tcop/postgres.c:2252 #: tcop/postgres.c:2689 tcop/postgres.c:2766 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "aktuelle Transaktion wurde abgebrochen, Befehle werden bis zum Ende der Transaktion ignoriert" -#: replication/walsender.c:2269 replication/walsender.c:2304 +#: replication/walsender.c:2291 replication/walsender.c:2326 #, c-format msgid "unexpected EOF on standby connection" msgstr "unerwartetes EOF auf Standby-Verbindung" -#: replication/walsender.c:2292 +#: replication/walsender.c:2314 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ungültiger Standby-Message-Typ »%c«" -#: replication/walsender.c:2381 +#: replication/walsender.c:2403 #, c-format msgid "unexpected message type \"%c\"" msgstr "unerwarteter Message-Typ »%c«" -#: replication/walsender.c:2798 +#: replication/walsender.c:2820 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "WAL-Sender-Prozess wird abgebrochen wegen Zeitüberschreitung bei der Replikation" -#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:820 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "Regel »%s« für Relation »%s« existiert bereits" -#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:758 #, c-format msgid "relation \"%s\" cannot have rules" msgstr "Relation »%s« kann keine Regeln haben" @@ -22944,108 +23015,108 @@ msgstr "Ereignisqualifikationen sind nicht implementiert für SELECT-Regeln" msgid "\"%s\" is already a view" msgstr "»%s« ist bereits eine Sicht" -#: rewrite/rewriteDefine.c:408 +#: rewrite/rewriteDefine.c:395 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "Sicht-Regel für »%s« muss »%s« heißen" -#: rewrite/rewriteDefine.c:435 +#: rewrite/rewriteDefine.c:420 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "Regel kann nicht mehrere RETURNING-Listen enthalten" -#: rewrite/rewriteDefine.c:440 +#: rewrite/rewriteDefine.c:425 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "RETURNING-Listen werden in Regeln mit Bedingung nicht unterstützt" -#: rewrite/rewriteDefine.c:444 +#: rewrite/rewriteDefine.c:429 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "RETURNING-Listen werden nur in INSTEAD-Regeln unterstützt" -#: rewrite/rewriteDefine.c:458 +#: rewrite/rewriteDefine.c:443 rewrite/rewriteDefine.c:839 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "Nicht-Sicht-Regel für »%s« darf nicht »%s« heißen" -#: rewrite/rewriteDefine.c:532 +#: rewrite/rewriteDefine.c:517 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "Targetliste von SELECT-Regel hat zu viele Einträge" -#: rewrite/rewriteDefine.c:533 +#: rewrite/rewriteDefine.c:518 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNING-Liste hat zu viele Einträge" -#: rewrite/rewriteDefine.c:560 +#: rewrite/rewriteDefine.c:545 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "kann Relation mit gelöschten Spalten nicht in Sicht umwandeln" -#: rewrite/rewriteDefine.c:561 +#: rewrite/rewriteDefine.c:546 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "für eine Relation mit gelöschten Spalten kann keine RETURNING-Liste erzeugt werden" -#: rewrite/rewriteDefine.c:567 +#: rewrite/rewriteDefine.c:552 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "Spaltenname in Targeteintrag %d von SELECT-Regel unterscheidet sich von Spalte »%s«" -#: rewrite/rewriteDefine.c:569 +#: rewrite/rewriteDefine.c:554 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECT-Targeteintrag heißt »%s«." -#: rewrite/rewriteDefine.c:578 +#: rewrite/rewriteDefine.c:563 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "Typ von Targeteintrag %d von SELECT-Regel unterscheidet sich von Spalte »%s«" -#: rewrite/rewriteDefine.c:580 +#: rewrite/rewriteDefine.c:565 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "Eintrag %d in RETURNING-Liste hat anderen Typ als Spalte »%s«" -#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 +#: rewrite/rewriteDefine.c:568 rewrite/rewriteDefine.c:592 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "SELECT-Targeteintrag hat Typ %s, aber Spalte hat Typ %s." -#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 +#: rewrite/rewriteDefine.c:571 rewrite/rewriteDefine.c:596 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Eintrag in RETURNING-Liste hat Typ %s, aber Spalte hat Typ %s." -#: rewrite/rewriteDefine.c:602 +#: rewrite/rewriteDefine.c:587 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "Größe von Targeteintrag %d von SELECT-Regel unterscheidet sich von Spalte »%s«" -#: rewrite/rewriteDefine.c:604 +#: rewrite/rewriteDefine.c:589 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "Eintrag %d in RETURNING-Liste hat andere Größe als Spalte »%s«" -#: rewrite/rewriteDefine.c:621 +#: rewrite/rewriteDefine.c:606 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "Targetliste von SELECT-Regeln hat zu wenige Einträge" -#: rewrite/rewriteDefine.c:622 +#: rewrite/rewriteDefine.c:607 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNING-Liste hat zu wenige Einträge" -#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 +#: rewrite/rewriteDefine.c:696 rewrite/rewriteDefine.c:811 #: rewrite/rewriteSupport.c:108 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "Regel »%s« für Relation »%s« existiert nicht" -#: rewrite/rewriteDefine.c:845 +#: rewrite/rewriteDefine.c:830 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "Umbenennen einer ON-SELECT-Regel ist nicht erlaubt" @@ -23479,8 +23550,8 @@ msgstr "unbekannter Snowball-Parameter: »%s«" msgid "missing Language parameter" msgstr "Parameter »Language« fehlt" -#: statistics/attribute_stats.c:192 statistics/attribute_stats.c:937 -#: statistics/relation_stats.c:98 +#: statistics/attribute_stats.c:192 statistics/attribute_stats.c:963 +#: statistics/relation_stats.c:100 #, c-format msgid "Statistics cannot be modified during recovery." msgstr "Statistiken können nicht während der Wiederherstellung geändert werden." @@ -23521,17 +23592,27 @@ msgstr "konnte Kleiner-Als-Operator für Spalte »%s« nicht bestimmen" msgid "column \"%s\" is not a range type" msgstr "Spalte »%s« ist kein Range-Typ" -#: statistics/attribute_stats.c:738 +#: statistics/attribute_stats.c:396 +#, c-format +msgid "could not parse \"%s\": incorrect number of elements (same as \"%s\" required)" +msgstr "konnte »%s« nicht parsen: falsche Anzahl Elemente (gleiche wie »%s« erforderlich)" + +#: statistics/attribute_stats.c:755 +#, c-format +msgid "\"%s\" must be a one-dimensional array" +msgstr "»%s« muss ein eindimensionales Array sein" + +#: statistics/attribute_stats.c:764 #, c-format msgid "\"%s\" array must not contain null values" msgstr "»%s«-Array darf keine NULL-Werte enthalten" -#: statistics/attribute_stats.c:781 +#: statistics/attribute_stats.c:807 #, c-format msgid "maximum number of statistics slots exceeded: %d" msgstr "maximale Anzahl Statistik-Slots überschritten: %d" -#: statistics/attribute_stats.c:949 +#: statistics/attribute_stats.c:975 #, c-format msgid "cannot clear statistics on system column \"%s\"" msgstr "Statistiken für Systemspalte »%s« können nicht geleert werden" @@ -23546,7 +23627,12 @@ msgstr "Statistikobjekt »%s.%s« konnte für Relation »%s.%s« nicht berechnet msgid "function returning record called in context that cannot accept type record" msgstr "Funktion, die einen Record zurückgibt, in einem Zusammenhang aufgerufen, der Typ record nicht verarbeiten kann" -#: statistics/relation_stats.c:117 +#: statistics/relation_stats.c:119 +#, c-format +msgid "argument \"%s\" must be a finite value" +msgstr "Argument »%s« muss ein endlicher Wert sein" + +#: statistics/relation_stats.c:126 #, c-format msgid "argument \"%s\" must not be less than -1.0" msgstr "Argument »%s« darf nicht kleiner als -1.0 sein" @@ -23654,104 +23740,106 @@ msgstr "komplettiere I/O für Prozess %d" msgid "I/O worker executing I/O on behalf of process %d" msgstr "I/O-Worker, der I/O für Prozess %d ausführt" -#: storage/buffer/bufmgr.c:662 storage/buffer/bufmgr.c:818 +#: storage/aio/read_stream.c:566 storage/buffer/bufmgr.c:662 +#: storage/buffer/bufmgr.c:1204 storage/buffer/bufmgr.c:1284 +#: storage/buffer/bufmgr.c:2600 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "auf temporäre Tabellen anderer Sitzungen kann nicht zugegriffen werden" -#: storage/buffer/bufmgr.c:2703 storage/buffer/localbuf.c:393 +#: storage/buffer/bufmgr.c:2726 storage/buffer/localbuf.c:401 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "kann Relation %s nicht auf über %u Blöcke erweitern" -#: storage/buffer/bufmgr.c:2774 +#: storage/buffer/bufmgr.c:2797 #, c-format msgid "unexpected data beyond EOF in block %u of relation \"%s\"" msgstr "unerwartete Daten hinter Dateiende in Block %u von Relation »%s«" -#: storage/buffer/bufmgr.c:2777 +#: storage/buffer/bufmgr.c:2800 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Das scheint mit fehlerhaften Kernels vorzukommen; Sie sollten eine Systemaktualisierung in Betracht ziehen." -#: storage/buffer/bufmgr.c:6178 +#: storage/buffer/bufmgr.c:6201 #, c-format msgid "could not write block %u of %s" msgstr "konnte Block %u von %s nicht schreiben" -#: storage/buffer/bufmgr.c:6182 +#: storage/buffer/bufmgr.c:6205 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Mehrere Fehlschläge --- Schreibfehler ist möglicherweise dauerhaft." -#: storage/buffer/bufmgr.c:6199 storage/buffer/bufmgr.c:6214 +#: storage/buffer/bufmgr.c:6222 storage/buffer/bufmgr.c:6237 #, c-format msgid "writing block %u of relation \"%s\"" msgstr "schreibe Block %u von Relation »%s«" -#: storage/buffer/bufmgr.c:7317 +#: storage/buffer/bufmgr.c:7340 #, c-format msgid "zeroing %u page(s) and ignoring %u checksum failure(s) among blocks %u..%u of relation \"%s\"" msgstr "%u Seite(n) werden mit Nullen gefüllt und %u Prüfsummenfehler werden ignoriert in den Blöcken %u..%u von Relation »%s«" -#: storage/buffer/bufmgr.c:7320 storage/buffer/bufmgr.c:7348 +#: storage/buffer/bufmgr.c:7343 storage/buffer/bufmgr.c:7371 #, c-format msgid "Block %u held the first zeroed page." msgstr "Block %u enthielt die erste mit Nullen gefüllte Seite." -#: storage/buffer/bufmgr.c:7322 +#: storage/buffer/bufmgr.c:7345 #, c-format msgid "See server log for details about the other %d invalid block." msgid_plural "See server log for details about the other %d invalid blocks." msgstr[0] "Details zu dem anderen %d ungültigen Block finden Sie im Serverlog." msgstr[1] "Details zu den anderen %d ungültigen Blöcken finden Sie im Serverlog." -#: storage/buffer/bufmgr.c:7339 +#: storage/buffer/bufmgr.c:7362 #, c-format msgid "%u invalid pages among blocks %u..%u of relation \"%s\"" msgstr "%u ungültige Seiten in den Blöcken %u..%u von Relation »%s«" -#: storage/buffer/bufmgr.c:7340 +#: storage/buffer/bufmgr.c:7363 #, c-format msgid "Block %u held the first invalid page." msgstr "Block %u enthielt die erste ungültige Seite." -#: storage/buffer/bufmgr.c:7341 +#: storage/buffer/bufmgr.c:7364 #, c-format msgid "See server log for the other %u invalid block(s)." msgstr "Die anderen %u ungültigen Blöcke finden Sie im Serverlog." -#: storage/buffer/bufmgr.c:7346 +#: storage/buffer/bufmgr.c:7369 #, c-format msgid "invalid page in block %u of relation \"%s\"; zeroing out page" msgstr "ungültige Seite in Block %u von Relation »%s«; fülle Seite mit Nullen" -#: storage/buffer/bufmgr.c:7347 +#: storage/buffer/bufmgr.c:7370 #, c-format msgid "zeroing out %u invalid pages among blocks %u..%u of relation \"%s\"" msgstr "%u ungültige Seiten werden mit Nullen gefüllt in den Blöcken %u..%u von Relation »%s«" -#: storage/buffer/bufmgr.c:7349 +#: storage/buffer/bufmgr.c:7372 #, c-format msgid "See server log for the other %u zeroed block(s)." msgstr "Die anderen %u mit Nullen gefüllten Blöcke finden Sie im Serverlog." -#: storage/buffer/bufmgr.c:7354 +#: storage/buffer/bufmgr.c:7377 #, c-format msgid "ignoring checksum failure in block %u of relation \"%s\"" msgstr "Prüfsummenfehler wird ignoriert in Block %u von Relation »%s«" -#: storage/buffer/bufmgr.c:7355 +#: storage/buffer/bufmgr.c:7378 #, c-format msgid "ignoring %u checksum failures among blocks %u..%u of relation \"%s\"" msgstr "%u Prüfsummenfehler werden ignoriert in den Blöcken %u..%u von Relation »%s«" -#: storage/buffer/bufmgr.c:7356 +#: storage/buffer/bufmgr.c:7379 #, c-format msgid "Block %u held the first ignored page." msgstr "Block %u enthielt die erste ignorierte Seite." -#: storage/buffer/bufmgr.c:7357 +#: storage/buffer/bufmgr.c:7380 #, c-format msgid "See server log for the other %u ignored block(s)." msgstr "Die anderen %u ignorierten Blöcke finden Sie im Serverlog." @@ -23761,12 +23849,12 @@ msgstr "Die anderen %u ignorierten Blöcke finden Sie im Serverlog." msgid "no empty local buffer available" msgstr "kein leerer lokaler Puffer verfügbar" -#: storage/buffer/localbuf.c:736 +#: storage/buffer/localbuf.c:744 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "während einer parallelen Operation kann nicht auf temporäre Tabellen zugegriffen werden" -#: storage/buffer/localbuf.c:876 +#: storage/buffer/localbuf.c:884 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." msgstr "»temp_buffers« kann nicht geändert werden, nachdem in der Sitzung auf temporäre Tabellen zugriffen wurde." @@ -23922,12 +24010,12 @@ msgstr "synchronisiere Datenverzeichnis (fsync), abgelaufene Zeit: %ld.%02d s, a msgid "\"%s\" is not supported on this platform." msgstr "»%s« wird auf dieser Plattform nicht unterstützt." -#: storage/file/fd.c:4030 tcop/backend_startup.c:1080 +#: storage/file/fd.c:4030 tcop/backend_startup.c:1099 #, c-format msgid "Invalid list syntax in parameter \"%s\"." msgstr "Ungültige Listensyntax für Parameter »%s«." -#: storage/file/fd.c:4050 tcop/backend_startup.c:1054 +#: storage/file/fd.c:4050 tcop/backend_startup.c:1073 #, c-format msgid "Invalid option \"%s\"." msgstr "Ungültige Option »%s«." @@ -24075,22 +24163,22 @@ msgstr "Nur Rollen mit dem %s-Attribut können Prozesse von Rollen mit dem %s-At msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." msgstr "Nur Rollen mit den Privilegien der Rolle deren Prozess beendet werden soll oder den Privilegien der Rolle »%s« können diesen Prozess beenden." -#: storage/ipc/procsignal.c:452 +#: storage/ipc/procsignal.c:460 #, c-format msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "warte immer noch darauf, dass Backend mit PID %d ProcSignalBarrier annimmt" -#: storage/ipc/procsignal.c:737 +#: storage/ipc/procsignal.c:745 #, c-format msgid "invalid cancel request with PID 0" msgstr "ungültige Stornierungsanfrage mit PID 0" -#: storage/ipc/procsignal.c:792 +#: storage/ipc/procsignal.c:800 #, c-format msgid "wrong key in cancel request for process %d" msgstr "falscher Schlüssel in Stornierungsanfrage für Prozess %d" -#: storage/ipc/procsignal.c:801 +#: storage/ipc/procsignal.c:809 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d in Stornierungsanfrage stimmte mit keinem Prozess überein" @@ -24135,17 +24223,12 @@ msgstr "ShmemIndex-Eintraggröße ist falsch für Datenstruktur »%s«: erwartet msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "nicht genug Shared-Memory für Datenstruktur »%s« (%zu Bytes angefordert)" -#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 -#, c-format -msgid "requested shared memory size overflows size_t" -msgstr "angeforderte Shared-Memory-Größe übersteigt Kapazität von size_t" - #: storage/ipc/signalfuncs.c:74 #, c-format msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d ist kein PostgreSQL-Backend-Prozess" -#: storage/ipc/signalfuncs.c:123 storage/lmgr/proc.c:1546 +#: storage/ipc/signalfuncs.c:123 storage/lmgr/proc.c:1579 #: utils/adt/mcxtfuncs.c:302 #, c-format msgid "could not send signal to process %d: %m" @@ -24487,27 +24570,27 @@ msgstr "Die Transaktion könnte erfolgreich sein, wenn sie erneut versucht würd msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" msgstr "Anzahl angeforderter Standby-Verbindungen überschreitet »max_wal_senders« (aktuell %d)" -#: storage/lmgr/proc.c:1591 +#: storage/lmgr/proc.c:1624 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "Prozess %d vermied Verklemmung wegen %s-Sperre auf %s durch Umordnen der Queue nach %ld,%03d ms" -#: storage/lmgr/proc.c:1606 +#: storage/lmgr/proc.c:1639 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "Prozess %d hat Verklemmung festgestellt beim Warten auf %s-Sperre auf %s nach %ld,%03d ms" -#: storage/lmgr/proc.c:1615 +#: storage/lmgr/proc.c:1648 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "Prozess %d wartet immer noch auf %s-Sperre auf %s nach %ld,%03d ms" -#: storage/lmgr/proc.c:1622 +#: storage/lmgr/proc.c:1655 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "Prozess %d erlangte %s-Sperre auf %s nach %ld,%03d ms" -#: storage/lmgr/proc.c:1639 +#: storage/lmgr/proc.c:1672 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "Prozess %d konnte %s-Sperre auf %s nach %ld,%03d ms nicht erlangen" @@ -24690,92 +24773,92 @@ msgstr "direkte SSL-Verbindung angenommen" msgid "direct SSL connection rejected" msgstr "direkte SSL-Verbindung abgelehnt" -#: tcop/backend_startup.c:528 tcop/backend_startup.c:556 +#: tcop/backend_startup.c:529 tcop/backend_startup.c:557 #, c-format msgid "incomplete startup packet" msgstr "unvollständiges Startpaket" -#: tcop/backend_startup.c:540 +#: tcop/backend_startup.c:541 #, c-format msgid "invalid length of startup packet" msgstr "ungültige Länge des Startpakets" -#: tcop/backend_startup.c:597 +#: tcop/backend_startup.c:598 #, c-format msgid "SSLRequest accepted" msgstr "SSLRequest akzeptiert" -#: tcop/backend_startup.c:600 +#: tcop/backend_startup.c:601 #, c-format msgid "SSLRequest rejected" msgstr "SSLRequest abgelehnt" -#: tcop/backend_startup.c:609 +#: tcop/backend_startup.c:610 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "konnte SSL-Verhandlungsantwort nicht senden: %m" -#: tcop/backend_startup.c:627 +#: tcop/backend_startup.c:628 #, c-format msgid "received unencrypted data after SSL request" msgstr "unverschlüsselte Daten nach SSL-Anforderung empfangen" -#: tcop/backend_startup.c:628 tcop/backend_startup.c:682 +#: tcop/backend_startup.c:629 tcop/backend_startup.c:692 #, 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." -#: tcop/backend_startup.c:651 +#: tcop/backend_startup.c:661 #, c-format msgid "GSSENCRequest accepted" msgstr "GSSENCRequest akzeptiert" -#: tcop/backend_startup.c:654 +#: tcop/backend_startup.c:664 #, c-format msgid "GSSENCRequest rejected" msgstr "GSSENCRequest abgelehnt" -#: tcop/backend_startup.c:663 +#: tcop/backend_startup.c:673 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "konnte GSSAPI-Verhandlungsantwort nicht senden: %m" -#: tcop/backend_startup.c:681 +#: tcop/backend_startup.c:691 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsanforderung empfangen" -#: tcop/backend_startup.c:709 +#: tcop/backend_startup.c:728 #, 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" -#: tcop/backend_startup.c:772 +#: tcop/backend_startup.c:791 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Gültige Werte sind: »false«, 0, »true«, 1, »database«." -#: tcop/backend_startup.c:813 +#: tcop/backend_startup.c:832 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "ungültiges Layout des Startpakets: Abschluss als letztes Byte erwartet" -#: tcop/backend_startup.c:830 +#: tcop/backend_startup.c:849 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "kein PostgreSQL-Benutzername im Startpaket angegeben" -#: tcop/backend_startup.c:884 +#: tcop/backend_startup.c:903 #, c-format msgid "invalid length of cancel request packet" msgstr "ungültige Länge des Pakets zur Stornierungsanfrage" -#: tcop/backend_startup.c:892 +#: tcop/backend_startup.c:911 #, c-format msgid "invalid length of cancel key in cancel request packet" msgstr "ungültige Länge des Stornierungsschlüssels im Paket zur Stornierungsanfrage" -#: tcop/backend_startup.c:1022 +#: tcop/backend_startup.c:1041 #, c-format msgid "Cannot specify log_connections option \"%s\" in a list with other options." msgstr "log_connections-Option »%s« kann nicht in einer Liste mit anderen Optionen angegeben werden." @@ -25235,17 +25318,17 @@ msgstr "mehrere »Accept«-Parameter" msgid "unrecognized simple dictionary parameter: \"%s\"" msgstr "unbekannter Parameter für das einfache Wörterbuch: »%s«" -#: tsearch/dict_synonym.c:120 +#: tsearch/dict_synonym.c:119 #, c-format msgid "unrecognized synonym parameter: \"%s\"" msgstr "unbekannter Synonymparameter: »%s«" -#: tsearch/dict_synonym.c:127 +#: tsearch/dict_synonym.c:126 #, c-format msgid "missing Synonyms parameter" msgstr "Parameter »Synonyms« fehlt" -#: tsearch/dict_synonym.c:134 +#: tsearch/dict_synonym.c:133 #, c-format msgid "could not open synonym file \"%s\": %m" msgstr "konnte Synonymdatei »%s« nicht öffnen: %m" @@ -25346,38 +25429,43 @@ msgstr "ungültiges Affix-Flag »%s« mit Flag-Wert »long«" msgid "could not open dictionary file \"%s\": %m" msgstr "konnte Wörterbuchdatei »%s« nicht öffnen: %m" -#: tsearch/spell.c:1182 tsearch/spell.c:1194 tsearch/spell.c:1758 -#: tsearch/spell.c:1763 tsearch/spell.c:1768 +#: tsearch/spell.c:1182 tsearch/spell.c:1189 tsearch/spell.c:1200 +#: tsearch/spell.c:1773 tsearch/spell.c:1778 tsearch/spell.c:1783 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ungültiges Affixalias »%s«" -#: tsearch/spell.c:1235 tsearch/spell.c:1306 tsearch/spell.c:1455 +#: tsearch/spell.c:1241 tsearch/spell.c:1312 tsearch/spell.c:1470 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "konnte Affixdatei »%s« nicht öffnen: %m" -#: tsearch/spell.c:1289 +#: tsearch/spell.c:1295 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Ispell-Wörterbuch unterstützt nur die Flag-Werte »default«, »long« und »num«" -#: tsearch/spell.c:1333 +#: tsearch/spell.c:1339 #, c-format msgid "invalid number of flag vector aliases" msgstr "ungültige Anzahl Flag-Vektor-Aliasse" -#: tsearch/spell.c:1356 +#: tsearch/spell.c:1362 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "Anzahl der Aliasse überschreitet angegebene Zahl %d" -#: tsearch/spell.c:1570 +#: tsearch/spell.c:1436 +#, c-format +msgid "number of aliases is less than specified number %d" +msgstr "Anzahl der Aliasse ist kleiner als angegebene Zahl %d" + +#: tsearch/spell.c:1585 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "Affixdatei enthält Befehle im alten und im neuen Stil" -#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:274 utils/adt/tsvector_op.c:1126 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:274 utils/adt/tsvector_op.c:1099 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "Zeichenkette ist zu lang für tsvector (%d Bytes, maximal %d Bytes)" @@ -25414,26 +25502,32 @@ msgstr "konnte Stoppwortdatei »%s« nicht öffnen: %m" msgid "text search parser does not support headline creation" msgstr "Textsucheparser unterstützt das Erzeugen von Headlines nicht" -#: tsearch/wparser_def.c:2665 +#: tsearch/wparser_def.c:2668 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "unbekannter Headline-Parameter: »%s«" -#: tsearch/wparser_def.c:2675 +#: tsearch/wparser_def.c:2678 #, c-format msgid "%s must be less than %s" msgstr "%s muss kleiner als %s sein" -#: tsearch/wparser_def.c:2679 +#: tsearch/wparser_def.c:2682 #, c-format msgid "%s must be positive" msgstr "%s muss positiv sein" -#: tsearch/wparser_def.c:2683 tsearch/wparser_def.c:2687 +#: tsearch/wparser_def.c:2686 tsearch/wparser_def.c:2690 #, c-format msgid "%s must be >= 0" msgstr "%s muss >= 0 sein" +#: tsearch/wparser_def.c:2729 tsearch/wparser_def.c:2733 +#: tsearch/wparser_def.c:2737 +#, c-format +msgid "value for \"%s\" is too long" +msgstr "Wert für »%s« ist zu lang" + #: utils/activity/pgstat.c:534 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" @@ -25530,7 +25624,7 @@ msgstr "verfälschte Statistikdatei »%s«" msgid "function call to dropped function" msgstr "Funktionsaufruf einer gelöschten Funktion" -#: utils/activity/pgstat_shmem.c:536 +#: utils/activity/pgstat_shmem.c:539 #, c-format msgid "Failed while allocating entry %u/%u/%." msgstr "Fehlgeschlagen beim Anlegen von Eintrag %u/%u/%." @@ -25671,7 +25765,7 @@ msgstr "Eingabedatentyp ist kein Array" #: utils/adt/int.c:1054 utils/adt/int.c:1087 utils/adt/int.c:1101 #: utils/adt/int.c:1115 utils/adt/int.c:1146 utils/adt/int.c:1228 #: utils/adt/int.c:1292 utils/adt/int.c:1360 utils/adt/int.c:1366 -#: utils/adt/int8.c:1256 utils/adt/numeric.c:2040 utils/adt/numeric.c:4558 +#: utils/adt/int8.c:1286 utils/adt/numeric.c:2046 utils/adt/numeric.c:4564 #: utils/adt/rangetypes.c:1552 utils/adt/rangetypes.c:1565 #: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1186 #: utils/adt/varlena.c:3240 utils/adt/varlena.c:4174 @@ -25712,12 +25806,12 @@ msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Arrays mit unterschiedlichen Dimensionen sind nicht kompatibel für Aneinanderhängen." #: utils/adt/array_userfuncs.c:1053 utils/adt/array_userfuncs.c:1061 -#: utils/adt/arrayfuncs.c:5634 utils/adt/arrayfuncs.c:5640 +#: utils/adt/arrayfuncs.c:5643 utils/adt/arrayfuncs.c:5649 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "Arrays unterschiedlicher Dimensionalität können nicht akkumuliert werden" -#: utils/adt/array_userfuncs.c:1073 +#: utils/adt/array_userfuncs.c:1073 utils/adt/arrayfuncs.c:5605 #, c-format msgid "array size exceeds the maximum allowed (%zu)" msgstr "Arraygröße überschreitet erlaubtes Maximum (%zu)" @@ -25835,7 +25929,7 @@ msgid "Unexpected end of input." msgstr "Unerwartetes Ende der Eingabe." #: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3511 -#: utils/adt/arrayfuncs.c:6126 +#: utils/adt/arrayfuncs.c:6133 #, c-format msgid "invalid number of dimensions: %d" msgstr "ungültige Anzahl Dimensionen: %d" @@ -25850,8 +25944,8 @@ msgstr "ungültige Array-Flags" msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "binäre Daten haben Array-Elementtyp %u (%s) statt erwartet %u (%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 -#: utils/adt/rangetypes.c:353 utils/cache/lsyscache.c:3136 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:451 +#: utils/adt/rangetypes.c:353 utils/cache/lsyscache.c:3260 #, c-format msgid "no binary input function available for type %s" msgstr "keine binäre Eingabefunktion verfügbar für Typ %s" @@ -25861,8 +25955,8 @@ msgstr "keine binäre Eingabefunktion verfügbar für Typ %s" msgid "improper binary format in array element %d" msgstr "falsches Binärformat in Arrayelement %d" -#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 -#: utils/adt/rangetypes.c:358 utils/cache/lsyscache.c:3169 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:456 +#: utils/adt/rangetypes.c:358 utils/cache/lsyscache.c:3293 #, c-format msgid "no binary output function available for type %s" msgstr "keine binäre Ausgabefunktion verfügbar für Typ %s" @@ -25874,8 +25968,8 @@ msgstr "Auswählen von Stücken aus Arrays mit fester Länge ist nicht implement #: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 #: utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 -#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6112 -#: utils/adt/arrayfuncs.c:6138 utils/adt/arrayfuncs.c:6149 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6119 +#: utils/adt/arrayfuncs.c:6145 utils/adt/arrayfuncs.c:6156 #: utils/adt/json.c:1441 utils/adt/json.c:1509 utils/adt/jsonb.c:1317 #: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4734 utils/adt/jsonfuncs.c:4887 #: utils/adt/jsonfuncs.c:4998 utils/adt/jsonfuncs.c:5046 @@ -25925,8 +26019,8 @@ msgstr "NULL-Werte im Array sind in diesem Zusammenhang nicht erlaubt" msgid "cannot compare arrays of different element types" msgstr "kann Arrays mit verschiedenen Elementtypen nicht vergleichen" -#: utils/adt/arrayfuncs.c:4195 utils/adt/multirangetypes.c:2806 -#: utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1425 +#: utils/adt/arrayfuncs.c:4195 utils/adt/multirangetypes.c:2807 +#: utils/adt/multirangetypes.c:2879 utils/adt/rangetypes.c:1425 #: utils/adt/rangetypes.c:1489 utils/adt/rowtypes.c:1893 #, c-format msgid "could not identify a hash function for type %s" @@ -25942,52 +26036,52 @@ msgstr "konnte keine erweiterte Hash-Funktion für Typ %s ermitteln" msgid "data type %s is not an array type" msgstr "Datentyp %s ist kein Array-Typ" -#: utils/adt/arrayfuncs.c:5579 +#: utils/adt/arrayfuncs.c:5580 #, c-format msgid "cannot accumulate null arrays" msgstr "Arrays, die NULL sind, können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5607 +#: utils/adt/arrayfuncs.c:5616 #, c-format msgid "cannot accumulate empty arrays" msgstr "leere Arrays können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:6010 utils/adt/arrayfuncs.c:6050 +#: utils/adt/arrayfuncs.c:6017 utils/adt/arrayfuncs.c:6057 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "Dimensions-Array oder Untergrenzen-Array darf nicht NULL sein" -#: utils/adt/arrayfuncs.c:6113 utils/adt/arrayfuncs.c:6139 +#: utils/adt/arrayfuncs.c:6120 utils/adt/arrayfuncs.c:6146 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensions-Array muss eindimensional sein." -#: utils/adt/arrayfuncs.c:6118 utils/adt/arrayfuncs.c:6144 +#: utils/adt/arrayfuncs.c:6125 utils/adt/arrayfuncs.c:6151 #, c-format msgid "dimension values cannot be null" msgstr "Dimensionswerte dürfen nicht NULL sein" -#: utils/adt/arrayfuncs.c:6150 +#: utils/adt/arrayfuncs.c:6157 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Untergrenzen-Array hat andere Größe als Dimensions-Array." -#: utils/adt/arrayfuncs.c:6431 +#: utils/adt/arrayfuncs.c:6438 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "Entfernen von Elementen aus mehrdimensionalen Arrays wird nicht unterstützt" -#: utils/adt/arrayfuncs.c:6708 +#: utils/adt/arrayfuncs.c:6715 #, c-format msgid "thresholds must be one-dimensional array" msgstr "Parameter »thresholds« muss ein eindimensionales Array sein" -#: utils/adt/arrayfuncs.c:6713 +#: utils/adt/arrayfuncs.c:6720 #, c-format msgid "thresholds array must not contain NULLs" msgstr "»thresholds«-Array darf keine NULL-Werte enthalten" -#: utils/adt/arrayfuncs.c:6946 +#: utils/adt/arrayfuncs.c:6953 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "Anzahl der zu entfernenden Elemente muss zwischen 0 und %d sein" @@ -26028,7 +26122,7 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "Kodierungsumwandlung zwischen %s und ASCII wird nicht unterstützt" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:150 utils/adt/cash.c:354 utils/adt/datetime.c:4264 +#: utils/adt/bool.c:150 utils/adt/cash.c:370 utils/adt/datetime.c:4264 #: utils/adt/float.c:207 utils/adt/float.c:294 utils/adt/float.c:308 #: utils/adt/float.c:413 utils/adt/float.c:496 utils/adt/float.c:510 #: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 @@ -26036,38 +26130,38 @@ msgstr "Kodierungsumwandlung zwischen %s und ASCII wird nicht unterstützt" #: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 #: utils/adt/geo_ops.c:4672 utils/adt/int.c:198 utils/adt/int.c:210 #: utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 -#: utils/adt/network.c:99 utils/adt/numeric.c:805 utils/adt/numeric.c:7325 -#: utils/adt/numeric.c:7528 utils/adt/numeric.c:8475 utils/adt/numutils.c:356 +#: utils/adt/network.c:99 utils/adt/numeric.c:805 utils/adt/numeric.c:7331 +#: utils/adt/numeric.c:7534 utils/adt/numeric.c:8481 utils/adt/numutils.c:356 #: utils/adt/numutils.c:617 utils/adt/numutils.c:878 utils/adt/numutils.c:917 #: utils/adt/numutils.c:939 utils/adt/numutils.c:1003 utils/adt/numutils.c:1025 #: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 #: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:512 -#: utils/adt/uuid.c:176 utils/adt/xid8funcs.c:323 +#: utils/adt/uuid.c:193 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "ungültige Eingabesyntax für Typ %s: »%s«" #: utils/adt/cash.c:98 utils/adt/cash.c:111 utils/adt/cash.c:124 -#: utils/adt/cash.c:137 utils/adt/cash.c:150 +#: utils/adt/cash.c:137 utils/adt/cash.c:150 utils/adt/cash.c:174 #, c-format msgid "money out of range" msgstr "money ist außerhalb des gültigen Bereichs" -#: utils/adt/cash.c:161 utils/adt/cash.c:725 utils/adt/float.c:106 +#: utils/adt/cash.c:161 utils/adt/cash.c:741 utils/adt/float.c:106 #: utils/adt/int.c:872 utils/adt/int.c:988 utils/adt/int.c:1068 #: utils/adt/int.c:1130 utils/adt/int.c:1168 utils/adt/int.c:1196 -#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 -#: utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 -#: utils/adt/numeric.c:3295 utils/adt/numeric.c:3318 utils/adt/numeric.c:3403 -#: utils/adt/numeric.c:3421 utils/adt/numeric.c:3517 utils/adt/numeric.c:9400 -#: utils/adt/numeric.c:9924 utils/adt/numeric.c:10040 utils/adt/numeric.c:11551 -#: utils/adt/timestamp.c:3772 +#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:972 +#: utils/adt/int8.c:1052 utils/adt/int8.c:1114 utils/adt/int8.c:1194 +#: utils/adt/numeric.c:3301 utils/adt/numeric.c:3324 utils/adt/numeric.c:3409 +#: utils/adt/numeric.c:3427 utils/adt/numeric.c:3523 utils/adt/numeric.c:9406 +#: utils/adt/numeric.c:9930 utils/adt/numeric.c:10046 utils/adt/numeric.c:11557 +#: utils/adt/timestamp.c:3776 #, c-format msgid "division by zero" msgstr "Division durch Null" -#: utils/adt/cash.c:292 utils/adt/cash.c:317 utils/adt/cash.c:327 -#: utils/adt/cash.c:367 utils/adt/int.c:204 utils/adt/numutils.c:350 +#: utils/adt/cash.c:308 utils/adt/cash.c:333 utils/adt/cash.c:343 +#: utils/adt/cash.c:383 utils/adt/int.c:204 utils/adt/numutils.c:350 #: utils/adt/numutils.c:611 utils/adt/numutils.c:872 utils/adt/numutils.c:923 #: utils/adt/numutils.c:962 utils/adt/numutils.c:1009 #, c-format @@ -26100,9 +26194,9 @@ msgstr "Präzision von TIME(%d)%s darf nicht negativ sein" msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "Präzision von TIME(%d)%s auf erlaubten Höchstwert %d reduziert" -#: utils/adt/date.c:168 utils/adt/date.c:176 utils/adt/formatting.c:4174 -#: utils/adt/formatting.c:4183 utils/adt/formatting.c:4288 -#: utils/adt/formatting.c:4298 +#: utils/adt/date.c:168 utils/adt/date.c:176 utils/adt/formatting.c:4285 +#: utils/adt/formatting.c:4294 utils/adt/formatting.c:4399 +#: utils/adt/formatting.c:4409 #, c-format msgid "date out of range: \"%s\"" msgstr "date ist außerhalb des gültigen Bereichs: »%s«" @@ -26135,22 +26229,22 @@ msgid "date out of range for timestamp" msgstr "Datum ist außerhalb des gültigen Bereichs für Typ »timestamp«" #: utils/adt/date.c:1187 utils/adt/date.c:1270 utils/adt/date.c:1286 -#: utils/adt/date.c:2280 utils/adt/date.c:3076 utils/adt/timestamp.c:4724 -#: utils/adt/timestamp.c:4815 utils/adt/timestamp.c:4963 -#: utils/adt/timestamp.c:5064 utils/adt/timestamp.c:5179 -#: utils/adt/timestamp.c:5231 utils/adt/timestamp.c:5488 -#: utils/adt/timestamp.c:5689 utils/adt/timestamp.c:5736 -#: utils/adt/timestamp.c:5960 utils/adt/timestamp.c:6007 -#: utils/adt/timestamp.c:6088 utils/adt/timestamp.c:6232 +#: utils/adt/date.c:2280 utils/adt/date.c:3076 utils/adt/timestamp.c:4728 +#: utils/adt/timestamp.c:4819 utils/adt/timestamp.c:4967 +#: utils/adt/timestamp.c:5068 utils/adt/timestamp.c:5183 +#: utils/adt/timestamp.c:5235 utils/adt/timestamp.c:5492 +#: utils/adt/timestamp.c:5693 utils/adt/timestamp.c:5740 +#: utils/adt/timestamp.c:5964 utils/adt/timestamp.c:6011 +#: utils/adt/timestamp.c:6092 utils/adt/timestamp.c:6236 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "Einheit »%s« nicht unterstützt für Typ %s" #: utils/adt/date.c:1295 utils/adt/date.c:2296 utils/adt/date.c:3096 -#: utils/adt/timestamp.c:4829 utils/adt/timestamp.c:5081 -#: utils/adt/timestamp.c:5245 utils/adt/timestamp.c:5448 -#: utils/adt/timestamp.c:5745 utils/adt/timestamp.c:6016 -#: utils/adt/timestamp.c:6057 utils/adt/timestamp.c:6293 +#: utils/adt/timestamp.c:4833 utils/adt/timestamp.c:5085 +#: utils/adt/timestamp.c:5249 utils/adt/timestamp.c:5452 +#: utils/adt/timestamp.c:5749 utils/adt/timestamp.c:6020 +#: utils/adt/timestamp.c:6061 utils/adt/timestamp.c:6297 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "Einheit »%s« nicht erkannt für Typ %s" @@ -26158,38 +26252,38 @@ msgstr "Einheit »%s« nicht erkannt für Typ %s" #: utils/adt/date.c:1379 utils/adt/date.c:1425 utils/adt/date.c:1984 #: utils/adt/date.c:2015 utils/adt/date.c:2044 utils/adt/date.c:2934 #: utils/adt/date.c:3166 utils/adt/datetime.c:432 utils/adt/datetime.c:1826 -#: utils/adt/formatting.c:4019 utils/adt/formatting.c:4055 -#: utils/adt/formatting.c:4142 utils/adt/formatting.c:4264 utils/adt/json.c:375 +#: utils/adt/formatting.c:4130 utils/adt/formatting.c:4166 +#: utils/adt/formatting.c:4253 utils/adt/formatting.c:4375 utils/adt/json.c:375 #: utils/adt/json.c:414 utils/adt/timestamp.c:250 utils/adt/timestamp.c:282 #: utils/adt/timestamp.c:707 utils/adt/timestamp.c:716 #: utils/adt/timestamp.c:794 utils/adt/timestamp.c:827 -#: utils/adt/timestamp.c:3125 utils/adt/timestamp.c:3134 -#: utils/adt/timestamp.c:3151 utils/adt/timestamp.c:3156 -#: utils/adt/timestamp.c:3175 utils/adt/timestamp.c:3188 -#: utils/adt/timestamp.c:3199 utils/adt/timestamp.c:3205 -#: utils/adt/timestamp.c:3211 utils/adt/timestamp.c:3216 -#: utils/adt/timestamp.c:3269 utils/adt/timestamp.c:3278 -#: utils/adt/timestamp.c:3299 utils/adt/timestamp.c:3304 -#: utils/adt/timestamp.c:3325 utils/adt/timestamp.c:3338 -#: utils/adt/timestamp.c:3352 utils/adt/timestamp.c:3360 -#: utils/adt/timestamp.c:3366 utils/adt/timestamp.c:3371 -#: utils/adt/timestamp.c:4439 utils/adt/timestamp.c:4591 -#: utils/adt/timestamp.c:4667 utils/adt/timestamp.c:4733 -#: utils/adt/timestamp.c:4823 utils/adt/timestamp.c:4902 -#: utils/adt/timestamp.c:4972 utils/adt/timestamp.c:5075 -#: utils/adt/timestamp.c:5553 utils/adt/timestamp.c:5827 -#: utils/adt/timestamp.c:6361 utils/adt/timestamp.c:6371 -#: utils/adt/timestamp.c:6376 utils/adt/timestamp.c:6382 -#: utils/adt/timestamp.c:6422 utils/adt/timestamp.c:6509 -#: utils/adt/timestamp.c:6550 utils/adt/timestamp.c:6554 -#: utils/adt/timestamp.c:6608 utils/adt/timestamp.c:6612 -#: utils/adt/timestamp.c:6618 utils/adt/timestamp.c:6659 utils/adt/xml.c:2575 +#: utils/adt/timestamp.c:3129 utils/adt/timestamp.c:3138 +#: utils/adt/timestamp.c:3155 utils/adt/timestamp.c:3160 +#: utils/adt/timestamp.c:3179 utils/adt/timestamp.c:3192 +#: utils/adt/timestamp.c:3203 utils/adt/timestamp.c:3209 +#: utils/adt/timestamp.c:3215 utils/adt/timestamp.c:3220 +#: utils/adt/timestamp.c:3273 utils/adt/timestamp.c:3282 +#: utils/adt/timestamp.c:3303 utils/adt/timestamp.c:3308 +#: utils/adt/timestamp.c:3329 utils/adt/timestamp.c:3342 +#: utils/adt/timestamp.c:3356 utils/adt/timestamp.c:3364 +#: utils/adt/timestamp.c:3370 utils/adt/timestamp.c:3375 +#: utils/adt/timestamp.c:4443 utils/adt/timestamp.c:4595 +#: utils/adt/timestamp.c:4671 utils/adt/timestamp.c:4737 +#: utils/adt/timestamp.c:4827 utils/adt/timestamp.c:4906 +#: utils/adt/timestamp.c:4976 utils/adt/timestamp.c:5079 +#: utils/adt/timestamp.c:5557 utils/adt/timestamp.c:5831 +#: utils/adt/timestamp.c:6365 utils/adt/timestamp.c:6375 +#: utils/adt/timestamp.c:6380 utils/adt/timestamp.c:6386 +#: utils/adt/timestamp.c:6426 utils/adt/timestamp.c:6513 +#: utils/adt/timestamp.c:6554 utils/adt/timestamp.c:6558 +#: utils/adt/timestamp.c:6612 utils/adt/timestamp.c:6616 +#: utils/adt/timestamp.c:6622 utils/adt/timestamp.c:6663 utils/adt/xml.c:2575 #: utils/adt/xml.c:2582 utils/adt/xml.c:2602 utils/adt/xml.c:2609 #, c-format msgid "timestamp out of range" msgstr "timestamp ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:1601 utils/adt/date.c:2417 utils/adt/formatting.c:4347 +#: utils/adt/date.c:1601 utils/adt/date.c:2417 utils/adt/formatting.c:4458 #, c-format msgid "time out of range" msgstr "time ist außerhalb des gültigen Bereichs" @@ -26216,9 +26310,9 @@ msgstr "kann unendlichen interval-Wert nicht von time subtrahieren" #: utils/adt/date.c:2180 utils/adt/date.c:2732 utils/adt/float.c:1043 #: utils/adt/float.c:1119 utils/adt/int.c:664 utils/adt/int.c:711 -#: utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2699 -#: utils/adt/timestamp.c:3869 utils/adt/timestamp.c:3906 -#: utils/adt/timestamp.c:3947 +#: utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2705 +#: utils/adt/timestamp.c:3873 utils/adt/timestamp.c:3910 +#: utils/adt/timestamp.c:3951 #, c-format msgid "invalid preceding or following size in window function" msgstr "ungültige vorhergehende oder folgende Größe in Fensterfunktion" @@ -26228,12 +26322,12 @@ msgstr "ungültige vorhergehende oder folgende Größe in Fensterfunktion" msgid "time zone displacement out of range" msgstr "Zeitzonenunterschied ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:3197 utils/adt/timestamp.c:6404 utils/adt/timestamp.c:6641 +#: utils/adt/date.c:3197 utils/adt/timestamp.c:6408 utils/adt/timestamp.c:6645 #, c-format msgid "interval time zone \"%s\" must be finite" msgstr "Intervall-Zeitzone »%s« muss endlich sein" -#: utils/adt/date.c:3204 utils/adt/timestamp.c:6411 utils/adt/timestamp.c:6648 +#: utils/adt/date.c:3204 utils/adt/timestamp.c:6415 utils/adt/timestamp.c:6652 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "Intervall-Zeitzone »%s« darf keine Monate oder Tage enthalten" @@ -26399,35 +26493,35 @@ msgstr "»%s« ist außerhalb des gültigen Bereichs für Typ double precision" #: utils/adt/float.c:1254 utils/adt/float.c:1328 utils/adt/int.c:384 #: utils/adt/int.c:922 utils/adt/int.c:944 utils/adt/int.c:958 #: utils/adt/int.c:972 utils/adt/int.c:1004 utils/adt/int.c:1242 -#: utils/adt/int8.c:1277 utils/adt/numeric.c:4697 utils/adt/numeric.c:4702 +#: utils/adt/int8.c:1307 utils/adt/numeric.c:4703 utils/adt/numeric.c:4708 #: utils/adt/varlena.c:4149 #, c-format msgid "smallint out of range" msgstr "smallint ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:1454 utils/adt/numeric.c:3813 utils/adt/numeric.c:10455 +#: utils/adt/float.c:1454 utils/adt/numeric.c:3819 utils/adt/numeric.c:10461 #, c-format msgid "cannot take square root of a negative number" msgstr "Quadratwurzel von negativer Zahl kann nicht ermittelt werden" -#: utils/adt/float.c:1522 utils/adt/numeric.c:4101 utils/adt/numeric.c:4213 +#: utils/adt/float.c:1522 utils/adt/numeric.c:4107 utils/adt/numeric.c:4219 #, c-format msgid "zero raised to a negative power is undefined" msgstr "null hoch eine negative Zahl ist undefiniert" -#: utils/adt/float.c:1526 utils/adt/numeric.c:4105 utils/adt/numeric.c:11346 +#: utils/adt/float.c:1526 utils/adt/numeric.c:4111 utils/adt/numeric.c:11352 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "eine negative Zahl hoch eine nicht ganze Zahl ergibt ein komplexes Ergebnis" -#: utils/adt/float.c:1702 utils/adt/float.c:1735 utils/adt/numeric.c:4013 -#: utils/adt/numeric.c:11126 +#: utils/adt/float.c:1702 utils/adt/float.c:1735 utils/adt/numeric.c:4019 +#: utils/adt/numeric.c:11132 #, c-format msgid "cannot take logarithm of zero" msgstr "Logarithmus von null kann nicht ermittelt werden" -#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3951 -#: utils/adt/numeric.c:4008 utils/adt/numeric.c:11130 +#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3957 +#: utils/adt/numeric.c:4014 utils/adt/numeric.c:11136 #, c-format msgid "cannot take logarithm of a negative number" msgstr "Logarithmus negativer Zahlen kann nicht ermittelt werden" @@ -26441,295 +26535,295 @@ msgstr "Logarithmus negativer Zahlen kann nicht ermittelt werden" msgid "input is out of range" msgstr "Eingabe ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:4085 utils/adt/numeric.c:1980 +#: utils/adt/float.c:4085 utils/adt/numeric.c:1986 #, c-format msgid "count must be greater than zero" msgstr "Anzahl muss größer als null sein" -#: utils/adt/float.c:4090 utils/adt/numeric.c:1991 +#: utils/adt/float.c:4090 utils/adt/numeric.c:1997 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "Operand, Untergrenze und Obergrenze dürfen nicht NaN sein" -#: utils/adt/float.c:4096 utils/adt/numeric.c:1996 +#: utils/adt/float.c:4096 utils/adt/numeric.c:2002 #, c-format msgid "lower and upper bounds must be finite" msgstr "Untergrenze und Obergrenze müssen endlich sein" -#: utils/adt/float.c:4162 utils/adt/numeric.c:2010 +#: utils/adt/float.c:4162 utils/adt/numeric.c:2016 #, c-format msgid "lower bound cannot equal upper bound" msgstr "Untergrenze kann nicht gleich der Obergrenze sein" -#: utils/adt/formatting.c:556 +#: utils/adt/formatting.c:557 #, c-format msgid "invalid format specification for an interval value" msgstr "ungültige Formatangabe für Intervall-Wert" -#: utils/adt/formatting.c:557 +#: utils/adt/formatting.c:558 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Intervalle beziehen sich nicht auf bestimmte Kalenderdaten." -#: utils/adt/formatting.c:1199 +#: utils/adt/formatting.c:1200 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "»EEEE« muss das letzte Muster sein" -#: utils/adt/formatting.c:1207 +#: utils/adt/formatting.c:1208 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "»9« muss vor »PR« stehen" -#: utils/adt/formatting.c:1223 +#: utils/adt/formatting.c:1224 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "»0« muss vor »PR« stehen" -#: utils/adt/formatting.c:1250 +#: utils/adt/formatting.c:1251 #, c-format msgid "multiple decimal points" msgstr "mehrere Dezimalpunkte" -#: utils/adt/formatting.c:1254 utils/adt/formatting.c:1341 +#: utils/adt/formatting.c:1255 utils/adt/formatting.c:1342 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "»V« und Dezimalpunkt können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1266 +#: utils/adt/formatting.c:1267 #, c-format msgid "cannot use \"S\" twice" msgstr "»S« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1270 +#: utils/adt/formatting.c:1271 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "»S« und »PL«/»MI«/»SG«/»PR« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1290 +#: utils/adt/formatting.c:1291 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "»S« und »MI« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1300 +#: utils/adt/formatting.c:1301 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "»S« und »PL« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1311 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "»S« und »SG« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1319 +#: utils/adt/formatting.c:1320 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "»PR« und »S«/»PL«/»MI«/»SG« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1328 +#: utils/adt/formatting.c:1329 #, c-format msgid "cannot use \"RN\" twice" msgstr "»RN« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1349 +#: utils/adt/formatting.c:1350 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "»EEEE« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1355 +#: utils/adt/formatting.c:1356 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "»EEEE« ist mit anderen Formaten inkompatibel" -#: utils/adt/formatting.c:1356 +#: utils/adt/formatting.c:1357 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "»EEEE« kann nur zusammen mit Platzhaltern für Ziffern oder Dezimalpunkt verwendet werden." -#: utils/adt/formatting.c:1365 +#: utils/adt/formatting.c:1366 #, c-format msgid "\"RN\" is incompatible with other formats" msgstr "»RN« ist mit anderen Formaten inkompatibel" -#: utils/adt/formatting.c:1366 +#: utils/adt/formatting.c:1367 #, c-format msgid "\"RN\" may only be used together with \"FM\"." msgstr "»RN« kann nur zusammen mit »FM« verwendet werden." -#: utils/adt/formatting.c:1447 +#: utils/adt/formatting.c:1448 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "ungültiges Datum-/Zeit-Formattrennzeichen: »%s«" -#: utils/adt/formatting.c:1574 +#: utils/adt/formatting.c:1575 #, c-format msgid "\"%s\" is not a number" msgstr "»%s« ist keine Zahl" -#: utils/adt/formatting.c:1655 utils/adt/formatting.c:1719 -#: utils/adt/formatting.c:1783 utils/adt/formatting.c:1847 +#: utils/adt/formatting.c:1656 utils/adt/formatting.c:1720 +#: utils/adt/formatting.c:1784 utils/adt/formatting.c:1848 #, c-format msgid "could not determine which collation to use for %s function" msgstr "konnte die für die Funktion %s zu verwendende Sortierfolge nicht bestimmen" -#: utils/adt/formatting.c:1855 +#: utils/adt/formatting.c:1856 #, c-format msgid "Unicode case folding can only be performed if server encoding is UTF8" msgstr "Unicode-Case-Folding kann nur durchgeführt werden, wenn die Serverkodierung UTF8 ist" -#: utils/adt/formatting.c:2152 +#: utils/adt/formatting.c:2153 #, c-format msgid "invalid combination of date conventions" msgstr "ungültige Kombination von Datumskonventionen" -#: utils/adt/formatting.c:2153 +#: utils/adt/formatting.c:2154 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Die Gregorianische und die ISO-Konvention für Wochendaten können nicht einer Formatvorlage gemischt werden." -#: utils/adt/formatting.c:2175 +#: utils/adt/formatting.c:2176 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "widersprüchliche Werte für das Feld »%s« in Formatzeichenkette" -#: utils/adt/formatting.c:2177 +#: utils/adt/formatting.c:2178 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Der Wert widerspricht einer vorherigen Einstellung für den selben Feldtyp." -#: utils/adt/formatting.c:2244 +#: utils/adt/formatting.c:2245 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "Quellzeichenkette zu kurz für Formatfeld »%s»" -#: utils/adt/formatting.c:2246 +#: utils/adt/formatting.c:2247 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Feld benötigt %d Zeichen, aber nur %d verbleiben." -#: utils/adt/formatting.c:2248 utils/adt/formatting.c:2262 +#: utils/adt/formatting.c:2249 utils/adt/formatting.c:2263 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Wenn die Quellzeichenkette keine feste Breite hat, versuchen Sie den Modifikator »FM«." -#: utils/adt/formatting.c:2258 utils/adt/formatting.c:2271 -#: utils/adt/formatting.c:2492 utils/adt/formatting.c:3392 -#: utils/adt/formatting.c:3595 +#: utils/adt/formatting.c:2259 utils/adt/formatting.c:2272 +#: utils/adt/formatting.c:2603 utils/adt/formatting.c:3503 +#: utils/adt/formatting.c:3706 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "ungültiger Wert »%s« für »%s«" -#: utils/adt/formatting.c:2260 +#: utils/adt/formatting.c:2261 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Feld benötigt %d Zeichen, aber nur %d konnten geparst werden." -#: utils/adt/formatting.c:2273 +#: utils/adt/formatting.c:2274 #, c-format msgid "Value must be an integer." msgstr "Der Wert muss eine ganze Zahl sein." -#: utils/adt/formatting.c:2278 utils/adt/formatting.c:3603 +#: utils/adt/formatting.c:2279 utils/adt/formatting.c:3714 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "Wert für »%s« in der Eingabezeichenkette ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:2280 +#: utils/adt/formatting.c:2281 #, c-format msgid "Value must be in the range %d to %d." msgstr "Der Wert muss im Bereich %d bis %d sein." -#: utils/adt/formatting.c:2494 +#: utils/adt/formatting.c:2605 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "Der angegebene Wert stimmte mit keinem der für dieses Feld zulässigen Werte überein." -#: utils/adt/formatting.c:2710 utils/adt/formatting.c:2730 -#: utils/adt/formatting.c:2750 utils/adt/formatting.c:2770 -#: utils/adt/formatting.c:2789 utils/adt/formatting.c:2808 -#: utils/adt/formatting.c:2832 utils/adt/formatting.c:2850 -#: utils/adt/formatting.c:2868 utils/adt/formatting.c:2886 -#: utils/adt/formatting.c:2903 utils/adt/formatting.c:2920 +#: utils/adt/formatting.c:2821 utils/adt/formatting.c:2841 +#: utils/adt/formatting.c:2861 utils/adt/formatting.c:2881 +#: utils/adt/formatting.c:2900 utils/adt/formatting.c:2919 +#: utils/adt/formatting.c:2943 utils/adt/formatting.c:2961 +#: utils/adt/formatting.c:2979 utils/adt/formatting.c:2997 +#: utils/adt/formatting.c:3014 utils/adt/formatting.c:3031 #, c-format msgid "localized string format value too long" msgstr "lokalisierter Formatwert ist zu lang" -#: utils/adt/formatting.c:3200 +#: utils/adt/formatting.c:3311 #, c-format msgid "unmatched format separator \"%c\"" msgstr "Formattrennzeichen »%c« ohne passende Eingabe" -#: utils/adt/formatting.c:3261 +#: utils/adt/formatting.c:3372 #, c-format msgid "unmatched format character \"%s\"" msgstr "Formatzeichen »%s« ohne passende Eingabe" -#: utils/adt/formatting.c:3394 +#: utils/adt/formatting.c:3505 #, c-format msgid "Time zone abbreviation is not recognized." msgstr "Zeitzonenabkürzung wird nicht erkannt." -#: utils/adt/formatting.c:3692 +#: utils/adt/formatting.c:3803 #, c-format msgid "input string is too short for datetime format" msgstr "Eingabezeichenkette ist zu kurz für Datum-/Zeitformat" -#: utils/adt/formatting.c:3700 +#: utils/adt/formatting.c:3811 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "nach dem Datum-/Zeitformat bleiben noch Zeichen in der Eingabezeichenkette" -#: utils/adt/formatting.c:4244 +#: utils/adt/formatting.c:4355 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "Zeitzone fehlt in Eingabezeichenkette für Typ timestamptz" -#: utils/adt/formatting.c:4250 +#: utils/adt/formatting.c:4361 #, c-format msgid "timestamptz out of range" msgstr "timestamptz ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:4278 +#: utils/adt/formatting.c:4389 #, c-format msgid "datetime format is zoned but not timed" msgstr "Datum-/Zeitformat hat Zeitzone aber keine Zeit" -#: utils/adt/formatting.c:4327 +#: utils/adt/formatting.c:4438 #, c-format msgid "missing time zone in input string for type timetz" msgstr "Zeitzone fehlt in Eingabezeichenkette für Typ timetz" -#: utils/adt/formatting.c:4333 +#: utils/adt/formatting.c:4444 #, c-format msgid "timetz out of range" msgstr "timetz ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:4359 +#: utils/adt/formatting.c:4470 #, c-format msgid "datetime format is not dated and not timed" msgstr "Datum-/Zeitformat hat kein Datum und keine Zeit" -#: utils/adt/formatting.c:4536 +#: utils/adt/formatting.c:4647 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "Stunde »%d« ist bei einer 12-Stunden-Uhr ungültig" -#: utils/adt/formatting.c:4538 +#: utils/adt/formatting.c:4649 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Verwenden Sie die 24-Stunden-Uhr oder geben Sie eine Stunde zwischen 1 und 12 an." -#: utils/adt/formatting.c:4715 +#: utils/adt/formatting.c:4826 #, c-format msgid "cannot calculate day of year without year information" msgstr "kann Tag des Jahres nicht berechnen ohne Jahrinformationen" -#: utils/adt/formatting.c:5849 +#: utils/adt/formatting.c:5960 #, c-format msgid "\"EEEE\" not supported for input" msgstr "»E« wird nicht bei der Eingabe unterstützt" -#: utils/adt/formatting.c:6139 +#: utils/adt/formatting.c:6250 #, c-format msgid "invalid Roman numeral" msgstr "ungültige römische Zahl" @@ -26817,8 +26911,8 @@ msgstr "Array ist kein gültiger int2vector" msgid "invalid int2vector data" msgstr "ungültige int2vector-Daten" -#: utils/adt/int.c:1558 utils/adt/int8.c:1403 utils/adt/numeric.c:1767 -#: utils/adt/timestamp.c:6708 utils/adt/timestamp.c:6794 +#: utils/adt/int.c:1558 utils/adt/int8.c:1433 utils/adt/numeric.c:1773 +#: utils/adt/timestamp.c:6712 utils/adt/timestamp.c:6798 #, c-format msgid "step size cannot equal zero" msgstr "Schrittgröße kann nicht gleich null sein" @@ -26827,19 +26921,19 @@ msgstr "Schrittgröße kann nicht gleich null sein" #: utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 #: utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 #: utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 -#: utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 -#: utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 -#: utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 -#: utils/adt/int8.c:1055 utils/adt/int8.c:1069 utils/adt/int8.c:1100 -#: utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 -#: utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4646 +#: utils/adt/int8.c:787 utils/adt/int8.c:929 utils/adt/int8.c:943 +#: utils/adt/int8.c:957 utils/adt/int8.c:988 utils/adt/int8.c:1010 +#: utils/adt/int8.c:1024 utils/adt/int8.c:1038 utils/adt/int8.c:1071 +#: utils/adt/int8.c:1085 utils/adt/int8.c:1099 utils/adt/int8.c:1130 +#: utils/adt/int8.c:1152 utils/adt/int8.c:1166 utils/adt/int8.c:1180 +#: utils/adt/int8.c:1342 utils/adt/int8.c:1377 utils/adt/numeric.c:4652 #: utils/adt/rangetypes.c:1599 utils/adt/rangetypes.c:1612 #: utils/adt/varbit.c:1676 utils/adt/varlena.c:4199 #, c-format msgid "bigint out of range" msgstr "bigint ist außerhalb des gültigen Bereichs" -#: utils/adt/int8.c:1360 +#: utils/adt/int8.c:1390 #, c-format msgid "OID out of range" msgstr "OID ist außerhalb des gültigen Bereichs" @@ -27263,8 +27357,8 @@ msgstr "Jsonpath-Item-Methode .%s() kann nur auf ein Array angewendet werden" #: utils/adt/jsonpath_exec.c:1165 utils/adt/jsonpath_exec.c:1191 #: utils/adt/jsonpath_exec.c:1279 utils/adt/jsonpath_exec.c:1304 #: utils/adt/jsonpath_exec.c:1356 utils/adt/jsonpath_exec.c:1376 -#: utils/adt/jsonpath_exec.c:1438 utils/adt/jsonpath_exec.c:1527 -#: utils/adt/jsonpath_exec.c:1560 utils/adt/jsonpath_exec.c:1584 +#: utils/adt/jsonpath_exec.c:1438 utils/adt/jsonpath_exec.c:1516 +#: utils/adt/jsonpath_exec.c:1548 utils/adt/jsonpath_exec.c:1572 #, c-format msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type %s" msgstr "Argument »%s« der JSON-Path-Item-Methode .%s() ist ungültig für Typ %s" @@ -27276,7 +27370,7 @@ msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" msgstr "NaN oder unendliche Werte sind für JSON-Path-Item-Methode .%s() nicht erlaubt" #: utils/adt/jsonpath_exec.c:1209 utils/adt/jsonpath_exec.c:1312 -#: utils/adt/jsonpath_exec.c:1454 utils/adt/jsonpath_exec.c:1592 +#: utils/adt/jsonpath_exec.c:1454 utils/adt/jsonpath_exec.c:1580 #, c-format msgid "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "JSON-Path-Item-Methode .%s() kann nur auf eine Zeichenkette oder einen numerischen Wert angewendet werden" @@ -27286,135 +27380,135 @@ msgstr "JSON-Path-Item-Methode .%s() kann nur auf eine Zeichenkette oder einen n msgid "jsonpath item method .%s() can only be applied to a boolean, string, or numeric value" msgstr "JSON-Path-Item-Methode .%s() kann nur auf boolean, eine Zeichenkette oder einen numerischen Wert angewendet werden" -#: utils/adt/jsonpath_exec.c:1486 +#: utils/adt/jsonpath_exec.c:1482 #, c-format msgid "precision of jsonpath item method .%s() is out of range for type integer" msgstr "Präzision der JSON-Path-Item-Methode .%s() ist außerhalb des gültigen Bereichs für Typ integer" -#: utils/adt/jsonpath_exec.c:1500 +#: utils/adt/jsonpath_exec.c:1496 #, c-format msgid "scale of jsonpath item method .%s() is out of range for type integer" msgstr "Skala der JSON-Path-Item-Methode .%s() ist außerhalb des gültigen Bereichs für Typ integer" -#: utils/adt/jsonpath_exec.c:1647 +#: utils/adt/jsonpath_exec.c:1635 #, c-format msgid "jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value" msgstr "JSON-Path-Item-Methode .%s() kann nur auf boolean, eine Zeichenkette, einen numerischen Wert oder einen datetime-Wert angewendet werden" -#: utils/adt/jsonpath_exec.c:2136 +#: utils/adt/jsonpath_exec.c:2124 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "linker Operand des JSON-Path-Operators %s ist kein einzelner numerischer Wert" -#: utils/adt/jsonpath_exec.c:2143 +#: utils/adt/jsonpath_exec.c:2131 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "rechter Operand des JSON-Path-Operators %s ist kein einzelner numerischer Wert" -#: utils/adt/jsonpath_exec.c:2211 +#: utils/adt/jsonpath_exec.c:2199 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "Operand des unären JSON-Path-Operators %s ist kein numerischer Wert" -#: utils/adt/jsonpath_exec.c:2310 +#: utils/adt/jsonpath_exec.c:2298 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "JSON-Path-Item-Methode .%s() kann nur auf einen numerischen Wert angewendet werden" -#: utils/adt/jsonpath_exec.c:2356 +#: utils/adt/jsonpath_exec.c:2344 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "JSON-Path-Item-Methode .%s() kann nur auf eine Zeichenkette angewendet werden" -#: utils/adt/jsonpath_exec.c:2449 +#: utils/adt/jsonpath_exec.c:2437 #, c-format msgid "time precision of jsonpath item method .%s() is out of range for type integer" msgstr "Zeitpräzision der JSON-Path-Item-Methode .%s() ist außerhalb des gültigen Bereichs für Typ integer" -#: utils/adt/jsonpath_exec.c:2483 utils/adt/jsonpath_exec.c:2489 -#: utils/adt/jsonpath_exec.c:2516 utils/adt/jsonpath_exec.c:2544 -#: utils/adt/jsonpath_exec.c:2597 utils/adt/jsonpath_exec.c:2648 -#: utils/adt/jsonpath_exec.c:2719 +#: utils/adt/jsonpath_exec.c:2471 utils/adt/jsonpath_exec.c:2477 +#: utils/adt/jsonpath_exec.c:2504 utils/adt/jsonpath_exec.c:2532 +#: utils/adt/jsonpath_exec.c:2585 utils/adt/jsonpath_exec.c:2636 +#: utils/adt/jsonpath_exec.c:2707 #, c-format msgid "%s format is not recognized: \"%s\"" msgstr "%s-Format wird nicht erkannt: »%s«" -#: utils/adt/jsonpath_exec.c:2485 +#: utils/adt/jsonpath_exec.c:2473 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "Verwenden Sie das Template-Argument für .datetime(), um das Eingabeformat anzugeben." -#: utils/adt/jsonpath_exec.c:2678 utils/adt/jsonpath_exec.c:2759 +#: utils/adt/jsonpath_exec.c:2666 utils/adt/jsonpath_exec.c:2747 #, c-format msgid "time precision of jsonpath item method .%s() is invalid" msgstr "Zeitpräzision der JSON-Path-Item-Methode .%s() ist ungültig" -#: utils/adt/jsonpath_exec.c:2839 +#: utils/adt/jsonpath_exec.c:2827 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "JSON-Path-Item-Methode .%s() kann nur auf ein Objekt angewendet werden" -#: utils/adt/jsonpath_exec.c:3123 +#: utils/adt/jsonpath_exec.c:3111 #, c-format msgid "could not convert value of type %s to jsonpath" msgstr "konnte Wert vom Typ %s nicht in jsonpath umwandeln" -#: utils/adt/jsonpath_exec.c:3157 +#: utils/adt/jsonpath_exec.c:3145 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "konnte JSON-Path-Variable »%s« nicht finden" -#: utils/adt/jsonpath_exec.c:3210 +#: utils/adt/jsonpath_exec.c:3198 #, c-format msgid "\"vars\" argument is not an object" msgstr "Argument »vars« ist kein Objekt" -#: utils/adt/jsonpath_exec.c:3211 +#: utils/adt/jsonpath_exec.c:3199 #, c-format msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." msgstr "JSON-Path-Parameter sollten als Schüssel-Wert-Paare im »vars«-Objekt kodiert werden." -#: utils/adt/jsonpath_exec.c:3474 +#: utils/adt/jsonpath_exec.c:3462 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "JSON-Path-Arrayindex ist kein einzelner numerischer Wert" -#: utils/adt/jsonpath_exec.c:3486 +#: utils/adt/jsonpath_exec.c:3474 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "JSON-Path-Arrayindex ist außerhalb des gültigen Bereichs für ganze Zahlen" -#: utils/adt/jsonpath_exec.c:3670 +#: utils/adt/jsonpath_exec.c:3658 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "Wert kann nicht von %s nach %s konvertiert werden ohne Verwendung von Zeitzonen" -#: utils/adt/jsonpath_exec.c:3672 +#: utils/adt/jsonpath_exec.c:3660 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Verwenden Sie die *_tz()-Funktion für Zeitzonenunterstützung." -#: utils/adt/jsonpath_exec.c:3980 +#: utils/adt/jsonpath_exec.c:3968 #, c-format msgid "JSON path expression for column \"%s\" must return single item when no wrapper is requested" msgstr "JSON-Path-Ausdruck für Spalte »%s« muss ein einzelnes Element zurückgeben, wenn kein Wrapper angefordert wurde" -#: utils/adt/jsonpath_exec.c:3982 utils/adt/jsonpath_exec.c:3987 +#: utils/adt/jsonpath_exec.c:3970 utils/adt/jsonpath_exec.c:3975 #, c-format msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." msgstr "Verwenden Sie die WITH-WRAPPER-Klausel, um SQL/JSON-Elemente in ein Array einzupacken." -#: utils/adt/jsonpath_exec.c:3986 +#: utils/adt/jsonpath_exec.c:3974 #, c-format msgid "JSON path expression in JSON_QUERY must return single item when no wrapper is requested" msgstr "JSON-Pfad-Ausdruck in JSON_QUERY muss ein einzelnes Element zurückgeben, wenn kein Wrapper angefordert wurde" -#: utils/adt/jsonpath_exec.c:4044 utils/adt/jsonpath_exec.c:4068 +#: utils/adt/jsonpath_exec.c:4032 utils/adt/jsonpath_exec.c:4056 #, c-format msgid "JSON path expression for column \"%s\" must return single scalar item" msgstr "JSON-Path-Ausdruck für Spalte »%s« muss ein einzelnes skalares Element zurückgeben" -#: utils/adt/jsonpath_exec.c:4049 utils/adt/jsonpath_exec.c:4073 +#: utils/adt/jsonpath_exec.c:4037 utils/adt/jsonpath_exec.c:4061 #, c-format msgid "JSON path expression in JSON_VALUE must return single scalar item" msgstr "JSON-Pfad-Ausdruck in JSON_VALUE muss ein einzelnes skalares Element zurückgeben" @@ -27429,7 +27523,7 @@ msgstr "Levenshtein-Argument überschreitet die maximale Länge von %d Zeichen" msgid "could not determine which collation to use for LIKE" msgstr "konnte die für LIKE zu verwendende Sortierfolge nicht bestimmen" -#: utils/adt/like.c:193 utils/adt/like_support.c:1019 +#: utils/adt/like.c:193 utils/adt/like_support.c:1031 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "konnte die für ILIKE zu verwendende Sortierfolge nicht bestimmen" @@ -27439,28 +27533,28 @@ msgstr "konnte die für ILIKE zu verwendende Sortierfolge nicht bestimmen" msgid "nondeterministic collations are not supported for ILIKE" msgstr "nichtdeterministische Sortierfolgen werden von ILIKE nicht unterstützt" -#: utils/adt/like_match.c:107 utils/adt/like_match.c:169 -#: utils/adt/like_match.c:237 +#: utils/adt/like_match.c:164 utils/adt/like_match.c:232 +#: utils/adt/like_match.c:352 #, c-format msgid "LIKE pattern must not end with escape character" msgstr "LIKE-Muster darf nicht mit Escape-Zeichen enden" -#: utils/adt/like_match.c:437 utils/adt/regexp.c:804 +#: utils/adt/like_match.c:448 utils/adt/regexp.c:804 #, c-format msgid "invalid escape string" msgstr "ungültige ESCAPE-Zeichenkette" -#: utils/adt/like_match.c:438 utils/adt/regexp.c:805 +#: utils/adt/like_match.c:449 utils/adt/regexp.c:805 #, c-format msgid "Escape string must be empty or one character." msgstr "ESCAPE-Zeichenkette muss null oder ein Zeichen lang sein." -#: utils/adt/like_support.c:1009 +#: utils/adt/like_support.c:1021 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "Mustersuche ohne Rücksicht auf Groß-/Kleinschreibung wird für Typ bytea nicht unterstützt" -#: utils/adt/like_support.c:1106 +#: utils/adt/like_support.c:1118 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "Mustersuche mit regulären Ausdrücken wird für Typ bytea nicht unterstützt" @@ -27577,12 +27671,12 @@ msgstr "Start einer Range erwartet." msgid "Expected comma or end of multirange." msgstr "Komma oder Ende der Multirange erwartet." -#: utils/adt/multirangetypes.c:982 +#: utils/adt/multirangetypes.c:983 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "Multiranges können nicht aus mehrdimensionalen Arrays konstruiert werden" -#: utils/adt/multirangetypes.c:1008 +#: utils/adt/multirangetypes.c:1009 #, c-format msgid "multirange values cannot contain null members" msgstr "Multirange-Werte können keine Mitglieder, die NULL sind, haben" @@ -27661,10 +27755,10 @@ msgstr "Ergebnis ist außerhalb des gültigen Bereichs" msgid "cannot subtract inet values of different sizes" msgstr "Subtraktion von »inet«-Werten unterschiedlicher Größe nicht möglich" -#: utils/adt/numeric.c:795 utils/adt/numeric.c:3763 utils/adt/numeric.c:7320 -#: utils/adt/numeric.c:7523 utils/adt/numeric.c:7995 utils/adt/numeric.c:10929 -#: utils/adt/numeric.c:11404 utils/adt/numeric.c:11498 -#: utils/adt/numeric.c:11633 +#: utils/adt/numeric.c:795 utils/adt/numeric.c:3769 utils/adt/numeric.c:7326 +#: utils/adt/numeric.c:7529 utils/adt/numeric.c:8001 utils/adt/numeric.c:10935 +#: utils/adt/numeric.c:11410 utils/adt/numeric.c:11504 +#: utils/adt/numeric.c:11639 #, c-format msgid "value overflows numeric format" msgstr "Wert verursacht Überlauf im »numeric«-Format" @@ -27684,109 +27778,109 @@ msgstr "ungültige Skala in externem »numeric«-Wert" msgid "invalid digit in external \"numeric\" value" msgstr "ungültige Ziffer in externem »numeric«-Wert" -#: utils/adt/numeric.c:1338 utils/adt/numeric.c:1352 +#: utils/adt/numeric.c:1335 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "Präzision von NUMERIC (%d) muss zwischen 1 und %d liegen" -#: utils/adt/numeric.c:1343 +#: utils/adt/numeric.c:1340 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "Skala von NUMERIC (%d) muss zwischen %d und %d liegen" -#: utils/adt/numeric.c:1361 +#: utils/adt/numeric.c:1367 #, c-format msgid "invalid NUMERIC type modifier" msgstr "ungültiker Modifikator für Typ NUMERIC" -#: utils/adt/numeric.c:1727 +#: utils/adt/numeric.c:1733 #, c-format msgid "start value cannot be NaN" msgstr "Startwert kann nicht NaN sein" -#: utils/adt/numeric.c:1731 +#: utils/adt/numeric.c:1737 #, c-format msgid "start value cannot be infinity" msgstr "Startwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1738 +#: utils/adt/numeric.c:1744 #, c-format msgid "stop value cannot be NaN" msgstr "Stoppwert kann nicht NaN sein" -#: utils/adt/numeric.c:1742 +#: utils/adt/numeric.c:1748 #, c-format msgid "stop value cannot be infinity" msgstr "Stoppwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1755 +#: utils/adt/numeric.c:1761 #, c-format msgid "step size cannot be NaN" msgstr "Schrittgröße kann nicht NaN sein" -#: utils/adt/numeric.c:1759 +#: utils/adt/numeric.c:1765 #, c-format msgid "step size cannot be infinity" msgstr "Schrittgröße kann nicht unendlich sein" -#: utils/adt/numeric.c:3753 +#: utils/adt/numeric.c:3759 #, c-format msgid "factorial of a negative number is undefined" msgstr "Fakultät einer negativen Zahl ist undefiniert" -#: utils/adt/numeric.c:4360 +#: utils/adt/numeric.c:4366 #, c-format msgid "lower bound cannot be NaN" msgstr "Untergrenze kann nicht NaN sein" -#: utils/adt/numeric.c:4364 +#: utils/adt/numeric.c:4370 #, c-format msgid "lower bound cannot be infinity" msgstr "Untergrenze kann nicht unendlich sein" -#: utils/adt/numeric.c:4371 +#: utils/adt/numeric.c:4377 #, c-format msgid "upper bound cannot be NaN" msgstr "Obergrenze kann nicht NaN sein" -#: utils/adt/numeric.c:4375 +#: utils/adt/numeric.c:4381 #, c-format msgid "upper bound cannot be infinity" msgstr "Obergrenze kann nicht unendlich sein" -#: utils/adt/numeric.c:4536 utils/adt/numeric.c:4624 utils/adt/numeric.c:4684 -#: utils/adt/numeric.c:4880 +#: utils/adt/numeric.c:4542 utils/adt/numeric.c:4630 utils/adt/numeric.c:4690 +#: utils/adt/numeric.c:4886 #, c-format msgid "cannot convert NaN to %s" msgstr "kann NaN nicht in %s umwandeln" -#: utils/adt/numeric.c:4540 utils/adt/numeric.c:4628 utils/adt/numeric.c:4688 -#: utils/adt/numeric.c:4884 +#: utils/adt/numeric.c:4546 utils/adt/numeric.c:4634 utils/adt/numeric.c:4694 +#: utils/adt/numeric.c:4890 #, c-format msgid "cannot convert infinity to %s" msgstr "kann Unendlich nicht in %s umwandeln" -#: utils/adt/numeric.c:4893 +#: utils/adt/numeric.c:4899 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn ist außerhalb des gültigen Bereichs" -#: utils/adt/numeric.c:8085 utils/adt/numeric.c:8136 +#: utils/adt/numeric.c:8091 utils/adt/numeric.c:8142 #, c-format msgid "numeric field overflow" msgstr "Feldüberlauf bei Typ »numeric«" -#: utils/adt/numeric.c:8086 +#: utils/adt/numeric.c:8092 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Ein Feld mit Präzision %d, Skala %d muss beim Runden einen Betrag von weniger als %s%d ergeben." -#: utils/adt/numeric.c:8137 +#: utils/adt/numeric.c:8143 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Ein Feld mit Präzision %d, Skala %d kann keinen unendlichen Wert enthalten." -#: utils/adt/numeric.c:11702 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/numeric.c:11708 utils/adt/pseudorandomfuncs.c:135 #: utils/adt/pseudorandomfuncs.c:159 #, c-format msgid "lower bound must be less than or equal to upper bound" @@ -27858,34 +27952,34 @@ msgstr "Die Sortierfolge in der Datenbank wurde mit Version %s erzeugt, aber das msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "Bauen Sie alle von dieser Sortierfolge beinflussten Objekte neu und führen Sie ALTER COLLATION %s REFRESH VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." -#: utils/adt/pg_locale.c:1498 utils/adt/pg_locale.c:1525 -#: utils/adt/pg_locale_builtin.c:188 +#: utils/adt/pg_locale.c:1504 utils/adt/pg_locale.c:1531 +#: utils/adt/pg_locale_builtin.c:200 #, c-format msgid "invalid locale name \"%s\" for builtin provider" msgstr "ungültiger Locale-Name »%s« für Provider »builtin«" -#: utils/adt/pg_locale.c:1590 +#: utils/adt/pg_locale.c:1596 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "konnte Locale-Namen »%s« nicht in Sprach-Tag umwandeln: %s" -#: utils/adt/pg_locale.c:1599 utils/adt/pg_locale.c:1674 +#: utils/adt/pg_locale.c:1605 utils/adt/pg_locale.c:1680 #: utils/adt/pg_locale_icu.c:215 #, c-format msgid "ICU is not supported in this build" msgstr "ICU wird in dieser Installation nicht unterstützt" -#: utils/adt/pg_locale.c:1632 +#: utils/adt/pg_locale.c:1638 #, c-format msgid "could not get language from ICU locale \"%s\": %s" msgstr "konnte Sprache nicht aus ICU-Locale »%s« ermitteln: %s" -#: utils/adt/pg_locale.c:1634 utils/adt/pg_locale.c:1664 +#: utils/adt/pg_locale.c:1640 utils/adt/pg_locale.c:1670 #, c-format msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." msgstr "Um die Validierung von ICU-Locales auszuschalten, setzen Sie den Parameter »%s« auf »%s«." -#: utils/adt/pg_locale.c:1662 +#: utils/adt/pg_locale.c:1668 #, c-format msgid "ICU locale \"%s\" has unknown language \"%s\"" msgstr "ICU-Locale »%s« hat unbekannte Sprache »%s«" @@ -27910,28 +28004,28 @@ msgstr "konnte Collator für Locale »%s« mit Regeln »%s« nicht öffnen: %s" msgid "collation failed: %s" msgstr "Vergleichung fehlgeschlagen: %s" -#: utils/adt/pg_locale_icu.c:569 utils/adt/pg_locale_icu.c:833 +#: utils/adt/pg_locale_icu.c:563 utils/adt/pg_locale_icu.c:819 #, c-format msgid "sort key generation failed: %s" msgstr "Sortierschlüsselerzeugung fehlgeschlagen: %s" -#: utils/adt/pg_locale_icu.c:643 utils/adt/pg_locale_icu.c:655 -#: utils/adt/pg_locale_icu.c:883 utils/adt/pg_locale_icu.c:904 +#: utils/adt/pg_locale_icu.c:637 utils/adt/pg_locale_icu.c:649 +#: utils/adt/pg_locale_icu.c:873 utils/adt/pg_locale_icu.c:893 #, c-format msgid "%s failed: %s" msgstr "%s fehlgeschlagen: %s" -#: utils/adt/pg_locale_icu.c:684 +#: utils/adt/pg_locale_icu.c:678 #, c-format msgid "case conversion failed: %s" msgstr "Groß/Klein-Umwandlung fehlgeschlagen: %s" -#: utils/adt/pg_locale_icu.c:856 +#: utils/adt/pg_locale_icu.c:842 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "Kodierung »%s« wird von ICU nicht unterstützt" -#: utils/adt/pg_locale_icu.c:863 +#: utils/adt/pg_locale_icu.c:849 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "konnte ICU-Konverter für Kodierung »%s« nicht öffnen: %s" @@ -27951,32 +28045,32 @@ msgstr "konnte Locale »%s« nicht laden" msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "konnte Sortierfolgenversion für Locale »%s« nicht ermitteln: Fehlercode %lu" -#: utils/adt/pg_locale_libc.c:771 utils/adt/pg_locale_libc.c:784 +#: utils/adt/pg_locale_libc.c:777 utils/adt/pg_locale_libc.c:790 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "konnte Zeichenkette nicht in UTF-16 umwandeln: Fehlercode %lu" -#: utils/adt/pg_locale_libc.c:793 +#: utils/adt/pg_locale_libc.c:799 #, c-format msgid "could not compare Unicode strings: %m" msgstr "konnte Unicode-Zeichenketten nicht vergleichen: %m" -#: utils/adt/pg_locale_libc.c:825 +#: utils/adt/pg_locale_libc.c:831 #, c-format msgid "could not create locale \"%s\": %m" msgstr "konnte Locale »%s« nicht erzeugen: %m" -#: utils/adt/pg_locale_libc.c:828 +#: utils/adt/pg_locale_libc.c:834 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Das Betriebssystem konnte keine Locale-Daten für den Locale-Namen »%s« finden." -#: utils/adt/pg_locale_libc.c:1000 +#: utils/adt/pg_locale_libc.c:1006 #, c-format msgid "invalid multibyte character for locale" msgstr "ungültiges Mehrbytezeichen für Locale" -#: utils/adt/pg_locale_libc.c:1001 +#: utils/adt/pg_locale_libc.c:1007 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "Die LC_CTYPE-Locale des Servers ist wahrscheinlich mit der Kodierung der Datenbank inkompatibel." @@ -28157,8 +28251,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:2029 utils/adt/ruleutils.c:10836 -#: utils/adt/ruleutils.c:11049 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10838 +#: utils/adt/ruleutils.c:11051 #, c-format msgid "too many arguments" msgstr "zu viele Argumente" @@ -28343,22 +28437,22 @@ msgstr "kann unterschiedliche Spaltentyp %s und %s in Record-Spalte %d nicht ver msgid "cannot compare record types with different numbers of columns" msgstr "kann Record-Typen mit unterschiedlicher Anzahl Spalten nicht vergleichen" -#: utils/adt/ruleutils.c:2740 +#: utils/adt/ruleutils.c:2742 #, c-format msgid "input is a query, not an expression" msgstr "Eingabe ist eine Anfrage, kein Ausdruck" -#: utils/adt/ruleutils.c:2752 +#: utils/adt/ruleutils.c:2754 #, c-format msgid "expression contains variables of more than one relation" msgstr "Ausdruck enthält Verweise auf Variablen von mehr als einer Relation" -#: utils/adt/ruleutils.c:2759 +#: utils/adt/ruleutils.c:2761 #, c-format msgid "expression contains variables" msgstr "Ausdruck enthält Variablen" -#: utils/adt/ruleutils.c:5433 +#: utils/adt/ruleutils.c:5435 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "Regel »%s« hat nicht unterstützten Ereignistyp %d" @@ -28435,21 +28529,21 @@ msgstr "timestamp ist außerhalb des gültigen Bereichs: »%g«" #: utils/adt/timestamp.c:948 utils/adt/timestamp.c:1507 #: utils/adt/timestamp.c:1517 utils/adt/timestamp.c:1578 -#: utils/adt/timestamp.c:2866 utils/adt/timestamp.c:2875 -#: utils/adt/timestamp.c:2890 utils/adt/timestamp.c:2964 -#: utils/adt/timestamp.c:2981 utils/adt/timestamp.c:3038 -#: utils/adt/timestamp.c:3081 utils/adt/timestamp.c:3459 -#: utils/adt/timestamp.c:3517 utils/adt/timestamp.c:3540 -#: utils/adt/timestamp.c:3549 utils/adt/timestamp.c:3573 -#: utils/adt/timestamp.c:3596 utils/adt/timestamp.c:3605 -#: utils/adt/timestamp.c:3740 utils/adt/timestamp.c:3841 -#: utils/adt/timestamp.c:4248 utils/adt/timestamp.c:4285 -#: utils/adt/timestamp.c:4333 utils/adt/timestamp.c:4342 -#: utils/adt/timestamp.c:4434 utils/adt/timestamp.c:4481 -#: utils/adt/timestamp.c:4490 utils/adt/timestamp.c:4586 -#: utils/adt/timestamp.c:4639 utils/adt/timestamp.c:4649 -#: utils/adt/timestamp.c:4874 utils/adt/timestamp.c:4884 -#: utils/adt/timestamp.c:5239 +#: utils/adt/timestamp.c:2870 utils/adt/timestamp.c:2879 +#: utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2968 +#: utils/adt/timestamp.c:2985 utils/adt/timestamp.c:3042 +#: utils/adt/timestamp.c:3085 utils/adt/timestamp.c:3463 +#: utils/adt/timestamp.c:3521 utils/adt/timestamp.c:3544 +#: utils/adt/timestamp.c:3553 utils/adt/timestamp.c:3577 +#: utils/adt/timestamp.c:3600 utils/adt/timestamp.c:3609 +#: utils/adt/timestamp.c:3744 utils/adt/timestamp.c:3845 +#: utils/adt/timestamp.c:4252 utils/adt/timestamp.c:4289 +#: utils/adt/timestamp.c:4337 utils/adt/timestamp.c:4346 +#: utils/adt/timestamp.c:4438 utils/adt/timestamp.c:4485 +#: utils/adt/timestamp.c:4494 utils/adt/timestamp.c:4590 +#: utils/adt/timestamp.c:4643 utils/adt/timestamp.c:4653 +#: utils/adt/timestamp.c:4878 utils/adt/timestamp.c:4888 +#: utils/adt/timestamp.c:5243 #, c-format msgid "interval out of range" msgstr "interval-Wert ist außerhalb des gültigen Bereichs" @@ -28474,32 +28568,32 @@ msgstr "INTERVAL(%d)-Präzision auf erlaubtes Maximum %d reduziert" msgid "interval(%d) precision must be between %d and %d" msgstr "Präzision von interval(%d) muss zwischen %d und %d sein" -#: utils/adt/timestamp.c:4623 utils/adt/timestamp.c:4858 +#: utils/adt/timestamp.c:4627 utils/adt/timestamp.c:4862 #, c-format msgid "origin out of range" msgstr "Anfangspunkt ist außerhalb des gültigen Bereichs" -#: utils/adt/timestamp.c:4628 utils/adt/timestamp.c:4863 +#: utils/adt/timestamp.c:4632 utils/adt/timestamp.c:4867 #, c-format msgid "timestamps cannot be binned into infinite intervals" msgstr "timestamp-Werte können nicht in unendliche Intervalle einsortiert werden" -#: utils/adt/timestamp.c:4633 utils/adt/timestamp.c:4868 +#: utils/adt/timestamp.c:4637 utils/adt/timestamp.c:4872 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "timestamp-Werte können nicht in Intervalle, die Monate oder Jahre enthalten, einsortiert werden" -#: utils/adt/timestamp.c:4644 utils/adt/timestamp.c:4879 +#: utils/adt/timestamp.c:4648 utils/adt/timestamp.c:4883 #, c-format msgid "stride must be greater than zero" msgstr "Schrittgröße muss größer als null sein" -#: utils/adt/timestamp.c:5181 utils/adt/timestamp.c:5233 +#: utils/adt/timestamp.c:5185 utils/adt/timestamp.c:5237 #, c-format msgid "Months usually have fractional weeks." msgstr "Monate haben gewöhnlich partielle Wochen." -#: utils/adt/timestamp.c:6713 utils/adt/timestamp.c:6799 +#: utils/adt/timestamp.c:6717 utils/adt/timestamp.c:6803 #, c-format msgid "step size cannot be infinite" msgstr "Schrittgröße kann nicht unendlich sein" @@ -28604,62 +28698,67 @@ msgstr "Wort ist zu lang (%ld Bytes, maximal %ld Bytes)" msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "Zeichenkette ist zu lang für tsvector (%ld Bytes, maximal %ld Bytes)" -#: utils/adt/tsvector_op.c:771 +#: utils/adt/tsvector_op.c:238 +#, c-format +msgid "unrecognized weight: \"%c\"" +msgstr "unbekannte Gewichtung: »%c«" + +#: utils/adt/tsvector_op.c:242 +#, c-format +msgid "unrecognized weight: \"\\%03o\"" +msgstr "unbekannte Gewichtung: »\\%03o«" + +#: utils/adt/tsvector_op.c:766 #, c-format msgid "lexeme array may not contain nulls" msgstr "Lexem-Array darf keine NULL-Werte enthalten" -#: utils/adt/tsvector_op.c:776 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain empty strings" msgstr "Lexem-Array darf keine leeren Zeichenketten enthalten" -#: utils/adt/tsvector_op.c:845 +#: utils/adt/tsvector_op.c:840 #, c-format msgid "weight array may not contain nulls" msgstr "Gewichtungs-Array darf keine NULL-Werte enthalten" -#: utils/adt/tsvector_op.c:869 -#, c-format -msgid "unrecognized weight: \"%c\"" -msgstr "unbekannte Gewichtung: »%c«" - -#: utils/adt/tsvector_op.c:2599 +#: utils/adt/tsvector_op.c:2572 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_stat-Anfrage muss eine tsvector-Spalte zurückgeben" -#: utils/adt/tsvector_op.c:2792 +#: utils/adt/tsvector_op.c:2765 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector-Spalte »%s« existiert nicht" -#: utils/adt/tsvector_op.c:2799 +#: utils/adt/tsvector_op.c:2772 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "Spalte »%s« hat nicht Typ tsvector" -#: utils/adt/tsvector_op.c:2811 +#: utils/adt/tsvector_op.c:2784 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "Konfigurationsspalte »%s« existiert nicht" -#: utils/adt/tsvector_op.c:2817 +#: utils/adt/tsvector_op.c:2790 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "Spalte »%s« hat nicht Typ regconfig" -#: utils/adt/tsvector_op.c:2824 +#: utils/adt/tsvector_op.c:2797 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "Konfigurationsspalte »%s« darf nicht NULL sein" -#: utils/adt/tsvector_op.c:2837 +#: utils/adt/tsvector_op.c:2810 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "Textsuchekonfigurationsname »%s« muss Schemaqualifikation haben" -#: utils/adt/tsvector_op.c:2862 +#: utils/adt/tsvector_op.c:2835 #, c-format msgid "column \"%s\" is not of a character type" msgstr "Spalte »%s« hat keinen Zeichentyp" @@ -28679,11 +28778,31 @@ msgstr "es gibt kein escaptes Zeichen: »%s«" msgid "wrong position info in tsvector: \"%s\"" msgstr "falsche Positionsinformationen in tsvector: »%s«" -#: utils/adt/uuid.c:535 utils/adt/uuid.c:632 +#: utils/adt/uuid.c:552 utils/adt/uuid.c:649 #, c-format msgid "could not generate random values" msgstr "konnte keine Zufallswerte erzeugen" +#: utils/adt/uuid.c:700 +#, c-format +msgid "interval out of range for UUID version 7" +msgstr "interval-Wert ist außerhalb des gültigen Bereichs für UUID Version 7" + +#: utils/adt/uuid.c:701 +#, c-format +msgid "UUID version 7 does not support infinite intervals." +msgstr "UUID Version 7 unterstützt keine unendlichen Intervalle." + +#: utils/adt/uuid.c:725 +#, c-format +msgid "timestamp out of range for UUID version 7" +msgstr "timestamp ist außerhalb des gültigen Bereichs für UUID Version 7" + +#: utils/adt/uuid.c:726 +#, c-format +msgid "UUID version 7 supports timestamps from 1970-01-01 to approximately year 10889." +msgstr "UUID Version 7 unterstützt Timestamps von 1970-01-01 bis ungefähr zum Jahr 10889." + #: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" @@ -28990,47 +29109,47 @@ msgstr "ungültige Anfrage" msgid "portal \"%s\" does not return tuples" msgstr "Portal »%s« gibt keine Tupel zurück" -#: utils/adt/xml.c:4363 +#: utils/adt/xml.c:4365 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ungültiges Array for XML-Namensraumabbildung" -#: utils/adt/xml.c:4364 +#: utils/adt/xml.c:4366 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Das Array muss zweidimensional sein und die Länge der zweiten Achse muss gleich 2 sein." -#: utils/adt/xml.c:4388 +#: utils/adt/xml.c:4390 #, c-format msgid "empty XPath expression" msgstr "leerer XPath-Ausdruck" -#: utils/adt/xml.c:4440 +#: utils/adt/xml.c:4442 #, c-format msgid "neither namespace name nor URI may be null" msgstr "weder Namensraumname noch URI dürfen NULL sein" -#: utils/adt/xml.c:4447 +#: utils/adt/xml.c:4449 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "konnte XML-Namensraum mit Namen »%s« und URI »%s« nicht registrieren" -#: utils/adt/xml.c:4796 +#: utils/adt/xml.c:4798 #, c-format msgid "DEFAULT namespace is not supported" msgstr "DEFAULT-Namensraum wird nicht unterstützt" -#: utils/adt/xml.c:4825 +#: utils/adt/xml.c:4827 #, c-format msgid "row path filter must not be empty string" msgstr "Zeilenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4859 +#: utils/adt/xml.c:4861 #, c-format msgid "column path filter must not be empty string" msgstr "Spaltenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:5006 +#: utils/adt/xml.c:5008 #, c-format msgid "more than one value returned by column XPath expression" msgstr "XPath-Ausdruck für Spalte gab mehr als einen Wert zurück" @@ -29040,23 +29159,23 @@ msgstr "XPath-Ausdruck für Spalte gab mehr als einen Wert zurück" msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "konnte den tatsächlichen Argumenttyp der polymorphischen Funktion »%s« nicht ermitteln" -#: utils/cache/lsyscache.c:1147 +#: utils/cache/lsyscache.c:1257 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "Typumwandlung von Typ %s in Typ %s existiert nicht" -#: utils/cache/lsyscache.c:3065 utils/cache/lsyscache.c:3098 -#: utils/cache/lsyscache.c:3131 utils/cache/lsyscache.c:3164 +#: utils/cache/lsyscache.c:3189 utils/cache/lsyscache.c:3222 +#: utils/cache/lsyscache.c:3255 utils/cache/lsyscache.c:3288 #, c-format msgid "type %s is only a shell" msgstr "Typ %s ist nur eine Hülle" -#: utils/cache/lsyscache.c:3070 +#: utils/cache/lsyscache.c:3194 #, c-format msgid "no input function available for type %s" msgstr "keine Eingabefunktion verfügbar für Typ %s" -#: utils/cache/lsyscache.c:3103 +#: utils/cache/lsyscache.c:3227 #, c-format msgid "no output function available for type %s" msgstr "keine Ausgabefunktion verfügbar für Typ %s" @@ -29066,27 +29185,27 @@ msgstr "keine Ausgabefunktion verfügbar für Typ %s" msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "in Operatorklasse »%s« für Zugriffsmethode %s fehlt Support-Funktion %d für Typ %s" -#: utils/cache/relcache.c:3805 +#: utils/cache/relcache.c:3807 #, c-format msgid "heap relfilenumber value not set when in binary upgrade mode" msgstr "Heap-Relfile-Nummer-Wert ist im Binary-Upgrade-Modus nicht gesetzt" -#: utils/cache/relcache.c:3813 +#: utils/cache/relcache.c:3815 #, c-format msgid "unexpected request for new relfilenumber in binary upgrade mode" msgstr "unerwartete Anforderung einer neuen Relfile-Nummer im Binary-Upgrade-Modus" -#: utils/cache/relcache.c:6633 +#: utils/cache/relcache.c:6635 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "konnte Initialisierungsdatei für Relationscache »%s« nicht erzeugen: %m" -#: utils/cache/relcache.c:6635 +#: utils/cache/relcache.c:6637 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Setze trotzdem fort, aber irgendwas stimmt nicht." -#: utils/cache/relcache.c:6965 +#: utils/cache/relcache.c:6967 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "konnte Cache-Datei »%s« nicht löschen: %m" @@ -29106,7 +29225,7 @@ msgstr "Relation-Mapping-Datei »%s« enthält ungültige Daten" msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "Relation-Mapping-Datei »%s« enthält falsche Prüfsumme" -#: utils/cache/typcache.c:1901 utils/fmgr/funcapi.c:574 +#: utils/cache/typcache.c:1894 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "Record-Typ wurde nicht registriert" @@ -32409,22 +32528,22 @@ msgstr "Policy für Sicherheit auf Zeilenebene für Tabelle »%s« würde Auswir msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "Um die Policy für den Tabelleneigentümer zu deaktivieren, verwenden Sie ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/stack_depth.c:101 +#: utils/misc/stack_depth.c:102 #, c-format msgid "stack depth limit exceeded" msgstr "Grenze für Stacktiefe überschritten" -#: utils/misc/stack_depth.c:102 +#: utils/misc/stack_depth.c:103 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Erhöhen Sie den Konfigurationsparameter »max_stack_depth« (aktuell %dkB), nachdem Sie sichergestellt haben, dass die Stacktiefenbegrenzung Ihrer Plattform ausreichend ist." -#: utils/misc/stack_depth.c:149 +#: utils/misc/stack_depth.c:165 #, c-format msgid "\"max_stack_depth\" must not exceed %zdkB." msgstr "»max_stack_depth« darf %zdkB nicht überschreiten." -#: utils/misc/stack_depth.c:151 +#: utils/misc/stack_depth.c:167 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Erhöhen Sie die Stacktiefenbegrenzung Ihrer Plattform mit »ulimit -s« oder der lokalen Entsprechung." @@ -32510,16 +32629,26 @@ msgstr "Fehler während der Erzeugung des Speicherkontexts »%s«." msgid "could not attach to dynamic shared area" msgstr "konnte nicht an dynamische Shared Area anbinden" -#: utils/mmgr/mcxt.c:1163 +#: utils/mmgr/mcxt.c:1166 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Fehler bei Anfrage mit Größe %zu im Speicherkontext »%s«." -#: utils/mmgr/mcxt.c:1319 +#: utils/mmgr/mcxt.c:1322 #, c-format msgid "logging memory contexts of PID %d" msgstr "logge Speicherkontexte von PID %d" +#: utils/mmgr/mcxt.c:1698 +#, c-format +msgid "invalid memory allocation request size %zu + %zu" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu" + +#: utils/mmgr/mcxt.c:1717 +#, c-format +msgid "invalid memory allocation request size %zu * %zu" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu" + #: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" diff --git a/src/backend/po/ja.po b/src/backend/po/ja.po index 02f26abdea7..ff7543c79ed 100644 --- a/src/backend/po/ja.po +++ b/src/backend/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: postgres (PostgreSQL 18)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-10 09:27+0900\n" -"PO-Revision-Date: 2026-02-10 09:57+0900\n" +"POT-Creation-Date: 2026-07-03 15:55+0900\n" +"PO-Revision-Date: 2026-07-03 16:23+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -87,19 +87,19 @@ msgstr "記録されていません" msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み込み用にオープンできませんでした: %m" -#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1353 access/transam/xlog.c:3478 access/transam/xlog.c:4369 access/transam/xlogrecovery.c:1257 access/transam/xlogrecovery.c:1355 access/transam/xlogrecovery.c:1392 access/transam/xlogrecovery.c:1459 backup/basebackup.c:2128 backup/walsummary.c:283 commands/extension.c:3970 libpq/hba.c:769 -#: replication/logical/origin.c:768 replication/logical/origin.c:804 replication/logical/reorderbuffer.c:5366 replication/logical/snapbuild.c:1951 replication/slot.c:2546 replication/slot.c:2587 replication/walsender.c:643 storage/file/buffile.c:470 storage/file/copydir.c:201 utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 +#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1354 access/transam/xlog.c:3478 access/transam/xlog.c:4369 access/transam/xlogrecovery.c:1257 access/transam/xlogrecovery.c:1355 access/transam/xlogrecovery.c:1392 access/transam/xlogrecovery.c:1459 backup/basebackup.c:2126 backup/walsummary.c:283 commands/extension.c:3970 libpq/hba.c:769 +#: replication/logical/origin.c:768 replication/logical/origin.c:804 replication/logical/reorderbuffer.c:5364 replication/logical/snapbuild.c:1951 replication/slot.c:2548 replication/slot.c:2589 replication/walsender.c:643 storage/file/buffile.c:470 storage/file/copydir.c:201 utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み込みに失敗しました: %m" -#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 access/transam/xlog.c:3483 access/transam/xlog.c:4374 replication/logical/origin.c:773 replication/logical/origin.c:812 replication/logical/snapbuild.c:1956 replication/slot.c:2550 replication/slot.c:2591 replication/walsender.c:648 utils/cache/relmapper.c:833 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 access/transam/xlog.c:3483 access/transam/xlog.c:4374 replication/logical/origin.c:773 replication/logical/origin.c:812 replication/logical/snapbuild.c:1956 replication/slot.c:2552 replication/slot.c:2593 replication/walsender.c:648 utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" -#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:512 access/transam/twophase.c:1365 access/transam/twophase.c:1783 access/transam/xlog.c:3324 access/transam/xlog.c:3518 access/transam/xlog.c:3523 access/transam/xlog.c:3659 -#: access/transam/xlog.c:4339 access/transam/xlog.c:5311 commands/copyfrom.c:1929 commands/copyto.c:598 libpq/be-fsstubs.c:475 libpq/be-fsstubs.c:545 replication/logical/origin.c:706 replication/logical/origin.c:845 replication/logical/reorderbuffer.c:5418 replication/logical/snapbuild.c:1696 replication/logical/snapbuild.c:1822 replication/slot.c:2432 replication/slot.c:2598 replication/walsender.c:658 storage/file/copydir.c:224 storage/file/copydir.c:229 +#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:512 access/transam/twophase.c:1366 access/transam/twophase.c:1784 access/transam/xlog.c:3324 access/transam/xlog.c:3518 access/transam/xlog.c:3523 access/transam/xlog.c:3659 +#: access/transam/xlog.c:4339 access/transam/xlog.c:5311 commands/copyfrom.c:1929 commands/copyto.c:598 libpq/be-fsstubs.c:475 libpq/be-fsstubs.c:545 replication/logical/origin.c:706 replication/logical/origin.c:845 replication/logical/reorderbuffer.c:5416 replication/logical/snapbuild.c:1696 replication/logical/snapbuild.c:1822 replication/slot.c:2434 replication/slot.c:2600 replication/walsender.c:658 storage/file/copydir.c:224 storage/file/copydir.c:229 #: storage/file/copydir.c:284 storage/file/copydir.c:289 storage/file/fd.c:828 storage/file/fd.c:3818 storage/file/fd.c:3924 utils/cache/relmapper.c:841 utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" @@ -122,29 +122,29 @@ msgstr "" "されるものと一致しないようです。この場合以下の結果は不正確になります。また、\n" "PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。" -#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 ../common/file_utils.c:69 ../common/file_utils.c:370 ../common/file_utils.c:428 ../common/file_utils.c:502 access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1309 access/transam/xlog.c:3214 access/transam/xlog.c:3394 access/transam/xlog.c:3433 access/transam/xlog.c:3626 access/transam/xlog.c:4359 -#: access/transam/xlogrecovery.c:4307 access/transam/xlogrecovery.c:4408 access/transam/xlogutils.c:825 backup/basebackup.c:549 backup/basebackup.c:1600 backup/walsummary.c:220 libpq/hba.c:626 postmaster/syslogger.c:1512 replication/logical/origin.c:758 replication/logical/reorderbuffer.c:4019 replication/logical/reorderbuffer.c:4573 replication/logical/reorderbuffer.c:5346 replication/logical/snapbuild.c:1651 replication/logical/snapbuild.c:1763 -#: replication/slot.c:2518 replication/walsender.c:616 replication/walsender.c:3094 storage/file/copydir.c:167 storage/file/copydir.c:255 storage/file/fd.c:803 storage/file/fd.c:3575 storage/file/fd.c:3805 storage/file/fd.c:3895 storage/smgr/md.c:686 utils/cache/relmapper.c:818 utils/cache/relmapper.c:935 utils/error/elog.c:2132 utils/init/miscinit.c:1586 utils/init/miscinit.c:1720 utils/init/miscinit.c:1797 utils/misc/guc.c:4779 utils/misc/guc.c:4829 +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 ../common/file_utils.c:69 ../common/file_utils.c:370 ../common/file_utils.c:428 ../common/file_utils.c:502 access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1310 access/transam/xlog.c:3214 access/transam/xlog.c:3394 access/transam/xlog.c:3433 access/transam/xlog.c:3626 access/transam/xlog.c:4359 +#: access/transam/xlogrecovery.c:4309 access/transam/xlogrecovery.c:4410 access/transam/xlogutils.c:849 backup/basebackup.c:549 backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:626 postmaster/syslogger.c:1512 replication/logical/origin.c:758 replication/logical/reorderbuffer.c:4017 replication/logical/reorderbuffer.c:4571 replication/logical/reorderbuffer.c:5344 replication/logical/snapbuild.c:1651 replication/logical/snapbuild.c:1763 +#: replication/slot.c:2520 replication/walsender.c:616 replication/walsender.c:3125 storage/file/copydir.c:167 storage/file/copydir.c:255 storage/file/fd.c:803 storage/file/fd.c:3575 storage/file/fd.c:3805 storage/file/fd.c:3895 storage/smgr/md.c:686 utils/cache/relmapper.c:818 utils/cache/relmapper.c:935 utils/error/elog.c:2132 utils/init/miscinit.c:1586 utils/init/miscinit.c:1720 utils/init/miscinit.c:1797 utils/misc/guc.c:4779 utils/misc/guc.c:4829 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 access/transam/twophase.c:1756 access/transam/twophase.c:1765 access/transam/xlog.c:9340 access/transam/xlogfuncs.c:699 backup/basebackup_server.c:173 backup/basebackup_server.c:266 backup/walsummary.c:304 postmaster/postmaster.c:4105 postmaster/syslogger.c:1523 postmaster/syslogger.c:1536 postmaster/syslogger.c:1549 utils/cache/relmapper.c:947 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 access/transam/twophase.c:1757 access/transam/twophase.c:1766 access/transam/xlog.c:9342 access/transam/xlogfuncs.c:699 backup/basebackup_server.c:173 backup/basebackup_server.c:266 backup/walsummary.c:304 postmaster/postmaster.c:4087 postmaster/syslogger.c:1523 postmaster/syslogger.c:1536 postmaster/syslogger.c:1549 utils/cache/relmapper.c:947 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 ../common/file_utils.c:440 ../common/file_utils.c:510 access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 access/transam/timeline.c:506 access/transam/twophase.c:1777 access/transam/xlog.c:3314 access/transam/xlog.c:3512 access/transam/xlog.c:4332 access/transam/xlog.c:8726 access/transam/xlog.c:8770 -#: backup/basebackup_server.c:207 commands/dbcommands.c:515 replication/logical/snapbuild.c:1689 replication/slot.c:2416 replication/slot.c:2528 storage/file/fd.c:820 storage/file/fd.c:3916 storage/smgr/md.c:1469 storage/smgr/md.c:1529 storage/sync/sync.c:446 utils/misc/guc.c:4527 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 ../common/file_utils.c:440 ../common/file_utils.c:510 access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 access/transam/timeline.c:506 access/transam/twophase.c:1778 access/transam/xlog.c:3314 access/transam/xlog.c:3512 access/transam/xlog.c:4332 access/transam/xlog.c:8728 access/transam/xlog.c:8772 +#: backup/basebackup_server.c:207 commands/dbcommands.c:515 replication/logical/snapbuild.c:1689 replication/slot.c:2418 replication/slot.c:2530 storage/file/fd.c:820 storage/file/fd.c:3916 storage/smgr/md.c:1469 storage/smgr/md.c:1529 storage/sync/sync.c:446 utils/misc/guc.c:4527 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" -#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 ../common/cryptohash_openssl.c:356 ../common/exec.c:543 ../common/exec.c:588 ../common/exec.c:680 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:151 ../common/hmac_openssl.c:339 ../common/jsonapi.c:2410 ../common/md5_common.c:156 ../common/parse_manifest.c:157 ../common/parse_manifest.c:852 ../common/psprintf.c:140 ../common/scram-common.c:268 ../port/path.c:829 ../port/path.c:866 -#: ../port/path.c:883 access/transam/twophase.c:1418 access/transam/xlogrecovery.c:571 lib/dshash.c:253 libpq/auth.c:1353 libpq/auth.c:1397 libpq/auth.c:1959 libpq/be-secure-gssapi.c:537 libpq/be-secure-gssapi.c:717 postmaster/bgworker.c:355 postmaster/bgworker.c:1023 postmaster/postmaster.c:3575 postmaster/walsummarizer.c:938 replication/libpqwalreceiver/libpqwalreceiver.c:364 replication/logical/logical.c:212 replication/walsender.c:825 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 ../common/cryptohash_openssl.c:356 ../common/exec.c:543 ../common/exec.c:588 ../common/exec.c:680 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:151 ../common/hmac_openssl.c:339 ../common/jsonapi.c:2459 ../common/md5_common.c:156 ../common/parse_manifest.c:157 ../common/parse_manifest.c:852 ../common/psprintf.c:140 ../common/scram-common.c:268 ../port/path.c:846 ../port/path.c:883 +#: ../port/path.c:900 access/transam/twophase.c:1419 access/transam/xlogrecovery.c:571 lib/dshash.c:253 libpq/auth.c:1353 libpq/auth.c:1397 libpq/auth.c:1959 libpq/be-secure-gssapi.c:537 libpq/be-secure-gssapi.c:717 postmaster/bgworker.c:355 postmaster/bgworker.c:1023 postmaster/postmaster.c:3557 postmaster/walsummarizer.c:939 replication/libpqwalreceiver/libpqwalreceiver.c:364 replication/logical/logical.c:212 replication/walsender.c:825 #: storage/buffer/localbuf.c:745 storage/file/fd.c:912 storage/file/fd.c:1447 storage/file/fd.c:1608 storage/file/fd.c:2592 storage/ipc/procarray.c:1465 storage/ipc/procarray.c:2217 storage/ipc/procarray.c:2224 storage/ipc/procarray.c:2727 storage/ipc/procarray.c:3436 utils/activity/pgstat_shmem.c:535 utils/adt/pg_locale.c:517 utils/adt/pg_locale.c:591 utils/adt/pg_locale_icu.c:358 utils/adt/pg_locale_libc.c:207 utils/adt/pg_locale_libc.c:302 #: utils/adt/pg_locale_libc.c:390 utils/fmgr/dfmgr.c:234 utils/hash/dynahash.c:517 utils/hash/dynahash.c:617 utils/hash/dynahash.c:1100 utils/mb/mbutils.c:410 utils/mb/mbutils.c:438 utils/mb/mbutils.c:823 utils/mb/mbutils.c:850 utils/misc/guc.c:647 utils/misc/guc.c:672 utils/misc/guc.c:1060 utils/misc/guc.c:4505 utils/misc/tzparser.c:479 utils/mmgr/aset.c:451 utils/mmgr/bump.c:183 utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 utils/mmgr/dsa.c:810 -#: utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1162 utils/mmgr/slab.c:370 +#: utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1165 utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "メモリ不足です" @@ -201,22 +201,32 @@ msgstr "コマンド\"%s\"からデータが返却されませんでした" 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:142 ../port/path.c:831 ../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 +#: ../common/fe_memutils.c:41 ../common/fe_memutils.c:81 ../common/fe_memutils.c:104 ../common/fe_memutils.c:167 ../common/psprintf.c:142 ../port/path.c:848 ../port/path.c:885 ../port/path.c:902 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" -#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 +#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "nullポインタは複製できません(内部エラー)\n" +#: ../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です\n" + +#: ../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "メモリ割り当て要求サイズ %zu * %zu が不正です\n" + #: ../common/file_utils.c:75 storage/file/fd.c:3581 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "ファイル\"%s\"に対してファイルシステムを同期できませんでした: %m" -#: ../common/file_utils.c:123 ../common/file_utils.c:588 ../common/file_utils.c:592 access/transam/twophase.c:1321 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 backup/basebackup.c:357 backup/basebackup.c:555 backup/basebackup.c:626 backup/walsummary.c:247 commands/copyfrom.c:1889 commands/copyto.c:979 commands/extension.c:3949 commands/tablespace.c:804 commands/tablespace.c:893 postmaster/pgarch.c:682 replication/logical/snapbuild.c:1546 +#: ../common/file_utils.c:123 ../common/file_utils.c:588 ../common/file_utils.c:592 access/transam/twophase.c:1322 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 backup/basebackup.c:357 backup/basebackup.c:555 backup/basebackup.c:626 backup/walsummary.c:247 commands/copyfrom.c:1889 commands/copyto.c:979 commands/extension.c:3949 commands/tablespace.c:804 commands/tablespace.c:893 postmaster/pgarch.c:682 replication/logical/snapbuild.c:1546 #: replication/logical/snapbuild.c:2073 storage/file/fd.c:1972 storage/file/fd.c:2060 storage/file/fd.c:3629 utils/adt/dbsize.c:105 utils/adt/dbsize.c:266 utils/adt/dbsize.c:355 utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" @@ -227,7 +237,7 @@ msgstr "ファイル\"%s\"のstatに失敗しました: %m" msgid "this build does not support sync method \"%s\"" msgstr "このビルドでは同期方式\"%s\"をサポートしていません" -#: ../common/file_utils.c:156 ../common/file_utils.c:304 ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 commands/tablespace.c:738 postmaster/postmaster.c:1496 storage/file/fd.c:2997 storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:340 +#: ../common/file_utils.c:156 ../common/file_utils.c:304 ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 commands/tablespace.c:738 postmaster/postmaster.c:1497 storage/file/fd.c:2997 storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:340 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" @@ -237,7 +247,7 @@ msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: ../common/file_utils.c:520 access/transam/xlogarchive.c:389 postmaster/pgarch.c:836 postmaster/syslogger.c:1560 replication/logical/snapbuild.c:1708 replication/slot.c:1027 replication/slot.c:2299 replication/slot.c:2448 storage/file/fd.c:838 utils/time/snapmgr.c:1273 +#: ../common/file_utils.c:520 access/transam/xlogarchive.c:389 postmaster/pgarch.c:836 postmaster/syslogger.c:1560 replication/logical/snapbuild.c:1708 replication/slot.c:1029 replication/slot.c:2301 replication/slot.c:2450 storage/file/fd.c:838 utils/time/snapmgr.c:1273 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" @@ -246,106 +256,106 @@ msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: % msgid "internal error" msgstr "内部エラー" -#: ../common/jsonapi.c:2435 +#: ../common/jsonapi.c:2484 msgid "Recursive descent parser cannot use incremental lexer." msgstr "再帰降下パーサーは差分字句解析器を使用できません。" -#: ../common/jsonapi.c:2437 +#: ../common/jsonapi.c:2486 msgid "Incremental parser requires incremental lexer." msgstr "差分パーサーは差分字句解析器を必要とします。" -#: ../common/jsonapi.c:2439 +#: ../common/jsonapi.c:2488 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSONのネストが深すぎます、可能な最大の深さは6400です。" -#: ../common/jsonapi.c:2441 +#: ../common/jsonapi.c:2490 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "エスケープシーケンス\"\\%.*s\"は不正です。" -#: ../common/jsonapi.c:2445 +#: ../common/jsonapi.c:2494 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../common/jsonapi.c:2449 +#: ../common/jsonapi.c:2498 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "入力の終端を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2452 +#: ../common/jsonapi.c:2501 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "配列要素または\"]\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2455 +#: ../common/jsonapi.c:2504 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "\",\"または\"]\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2458 +#: ../common/jsonapi.c:2507 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "\":\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2461 +#: ../common/jsonapi.c:2510 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON値を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2464 +#: ../common/jsonapi.c:2513 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../common/jsonapi.c:2466 +#: ../common/jsonapi.c:2515 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "文字列または\"}\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2469 +#: ../common/jsonapi.c:2518 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "\",\"または\"}\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2472 +#: ../common/jsonapi.c:2521 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "文字列を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2475 +#: ../common/jsonapi.c:2524 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "トークン\"%.*s\"は不正です。" -#: ../common/jsonapi.c:2481 jsonpath_scan.l:585 +#: ../common/jsonapi.c:2530 jsonpath_scan.l:585 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../common/jsonapi.c:2483 +#: ../common/jsonapi.c:2532 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../common/jsonapi.c:2486 +#: ../common/jsonapi.c:2535 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "エンコーディングがUTF-8ではない場合、コードポイントの値が 007F 以上についてはUnicodeエスケープの値は使用できません。" -#: ../common/jsonapi.c:2495 +#: ../common/jsonapi.c:2544 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicodeエスケープの値がサーバーエンコーディング%sに変換できませんでした。" -#: ../common/jsonapi.c:2502 jsonpath_scan.l:618 +#: ../common/jsonapi.c:2551 jsonpath_scan.l:618 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../common/jsonapi.c:2504 jsonpath_scan.l:629 jsonpath_scan.l:639 jsonpath_scan.l:691 +#: ../common/jsonapi.c:2553 jsonpath_scan.l:629 jsonpath_scan.l:639 jsonpath_scan.l:691 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodeのローサロゲートはハイサロゲートに続かなければなりません。" -#: ../common/jsonapi.c:2526 +#: ../common/jsonapi.c:2575 msgid "out of memory while constructing error description" msgstr "エラー記述の構築中のメモリ不足" @@ -459,7 +469,7 @@ msgstr "ファイル名をデコードできませんでした" msgid "file size is not an integer" msgstr "ファイルサイズが整数ではありません" -#: ../common/parse_manifest.c:699 backup/basebackup.c:872 +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "認識できないチェックサムアルゴリズム: \"%s\"" @@ -526,7 +536,7 @@ msgstr "目録チェックサムの不一致" msgid "could not parse backup manifest: %s" msgstr "バックアップ目録をパースできませんでした: %s" -#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 ../common/percentrepl.c:118 ../common/percentrepl.c:124 tcop/backend_startup.c:769 utils/misc/guc.c:3164 utils/misc/guc.c:3205 utils/misc/guc.c:3280 utils/misc/guc.c:4709 utils/misc/guc.c:6940 utils/misc/guc.c:6981 +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 ../common/percentrepl.c:118 ../common/percentrepl.c:124 tcop/backend_startup.c:788 utils/misc/guc.c:3164 utils/misc/guc.c:3205 utils/misc/guc.c:3280 utils/misc/guc.c:4709 utils/misc/guc.c:6940 utils/misc/guc.c:6981 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "パラメータ\"%s\"の値が不正です: \"%s\"" @@ -586,7 +596,7 @@ msgstr "制限付きトークンで再実行できませんでした: %lu" msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスの終了コードを取得できませんでした: エラーコード %lu" -#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 access/transam/twophase.c:1716 access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:399 backup/walsummary.c:254 postmaster/postmaster.c:1069 postmaster/syslogger.c:1489 replication/logical/origin.c:614 replication/logical/reorderbuffer.c:4841 replication/logical/snapbuild.c:1589 replication/logical/snapbuild.c:2045 replication/slot.c:2502 storage/file/fd.c:878 storage/file/fd.c:3443 +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 access/transam/twophase.c:1717 access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:399 backup/walsummary.c:254 postmaster/postmaster.c:1070 postmaster/syslogger.c:1489 replication/logical/origin.c:614 replication/logical/reorderbuffer.c:4839 replication/logical/snapbuild.c:1589 replication/logical/snapbuild.c:2045 replication/slot.c:2504 storage/file/fd.c:878 storage/file/fd.c:3443 #: storage/file/fd.c:3505 storage/file/reinit.c:261 storage/ipc/dsm.c:343 storage/smgr/md.c:401 storage/smgr/md.c:460 storage/sync/sync.c:243 utils/time/snapmgr.c:1609 #, c-format msgid "could not remove file \"%s\": %m" @@ -727,7 +737,7 @@ msgstr "再試行を30秒間続けます。" msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "データベースシステムに干渉するアンチウィルス、バックアップといったソフトウェアが存在する可能性があります。" -#: ../port/path.c:853 +#: ../port/path.c:870 #, c-format msgid "could not get current working directory: %m\n" msgstr "現在の作業ディレクトリを取得できませんでした: %m\n" @@ -757,7 +767,7 @@ msgstr "アクセストークンのメンバーシップを確認できません msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "インデックス\"%s\" ページ%uのBRIN範囲要約のリクエストは登録されていません" -#: access/brin/brin.c:1397 access/brin/brin.c:1504 access/gin/ginfast.c:1040 access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:242 access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:323 access/transam/xlogfuncs.c:389 access/transam/xlogfuncs.c:447 statistics/attribute_stats.c:191 statistics/attribute_stats.c:936 statistics/relation_stats.c:97 +#: access/brin/brin.c:1397 access/brin/brin.c:1504 access/gin/ginfast.c:1040 access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:242 access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:323 access/transam/xlogfuncs.c:389 access/transam/xlogfuncs.c:447 statistics/attribute_stats.c:191 statistics/attribute_stats.c:962 statistics/relation_stats.c:97 #, c-format msgid "recovery is in progress" msgstr "リカバリは現在進行中です" @@ -782,7 +792,7 @@ msgstr "\"%s\"はBRINインデックスではありません" msgid "could not open parent table of index \"%s\"" msgstr "インデックス\"%s\"の親テーブルをオープンできませんでした" -#: access/brin/brin.c:1472 access/brin/brin.c:1568 access/gin/ginfast.c:1085 parser/parse_utilcmd.c:2454 +#: access/brin/brin.c:1472 access/brin/brin.c:1568 access/gin/ginfast.c:1085 parser/parse_utilcmd.c:2458 #, c-format msgid "index \"%s\" is not valid" msgstr "インデックス\"%s\"は有効ではありません" @@ -892,7 +902,7 @@ msgstr "インデックス列数(%d)が上限(%d)を超えています" msgid "index row requires %zu bytes, maximum size is %zu" msgstr "インデックス行が%zuバイトを必要としますが最大値は%zuです" -#: access/common/printtup.c:292 commands/explain_dr.c:94 tcop/fastpath.c:106 tcop/fastpath.c:453 tcop/postgres.c:1950 +#: access/common/printtup.c:292 commands/explain_dr.c:94 tcop/fastpath.c:106 tcop/fastpath.c:453 tcop/postgres.c:1951 #, c-format msgid "unsupported format code: %d" msgstr "非サポートの書式コード: %d" @@ -1025,7 +1035,7 @@ msgstr "他のセッションの一時インデックスにはアクセスでき msgid "failed to re-find tuple within index \"%s\"" msgstr "インデックス\"%s\"内で行の再検索に失敗しました" -#: access/gin/gininsert.c:1310 access/gin/ginutil.c:152 executor/execExpr.c:2244 utils/adt/array_userfuncs.c:1963 utils/adt/arrayfuncs.c:4034 utils/adt/arrayfuncs.c:6732 utils/adt/rowtypes.c:974 utils/sort/tuplesortvariants.c:646 +#: access/gin/gininsert.c:1310 access/gin/ginutil.c:152 executor/execExpr.c:2244 utils/adt/array_userfuncs.c:1972 utils/adt/arrayfuncs.c:4034 utils/adt/arrayfuncs.c:6739 utils/adt/rowtypes.c:974 utils/sort/tuplesortvariants.c:646 #, c-format msgid "could not identify a comparison function for type %s" msgstr "%s型の比較関数が見つかりません" @@ -1110,8 +1120,8 @@ msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は演算子%3$s msgid "could not determine which collation to use for string hashing" msgstr "文字列のハッシュ値計算で使用する照合順序を特定できませんでした" -#: access/hash/hashfunc.c:281 access/hash/hashfunc.c:336 catalog/heap.c:688 catalog/heap.c:694 commands/createas.c:203 commands/createas.c:515 commands/indexcmds.c:2090 commands/tablecmds.c:19987 commands/view.c:80 regex/regc_pg_locale.c:242 utils/adt/formatting.c:1655 utils/adt/formatting.c:1719 utils/adt/formatting.c:1783 utils/adt/formatting.c:1847 utils/adt/like.c:163 utils/adt/like.c:194 utils/adt/like_support.c:1020 utils/adt/varchar.c:738 -#: utils/adt/varchar.c:1001 utils/adt/varchar.c:1057 utils/adt/varlena.c:1610 +#: access/hash/hashfunc.c:281 access/hash/hashfunc.c:336 catalog/heap.c:702 catalog/heap.c:708 commands/createas.c:203 commands/createas.c:515 commands/indexcmds.c:2092 commands/tablecmds.c:20008 commands/view.c:80 regex/regc_pg_locale.c:242 utils/adt/formatting.c:1657 utils/adt/formatting.c:1721 utils/adt/formatting.c:1785 utils/adt/formatting.c:1849 utils/adt/like.c:163 utils/adt/like.c:194 utils/adt/like_support.c:1020 utils/adt/varchar.c:738 +#: utils/adt/varchar.c:1001 utils/adt/varchar.c:1057 utils/adt/varlena.c:1648 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "照合順序を明示するには COLLATE 句を使います。" @@ -1211,8 +1221,8 @@ 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:977 access/heap/rewriteheap.c:1094 access/transam/timeline.c:329 access/transam/timeline.c:481 access/transam/xlog.c:3239 access/transam/xlog.c:3447 access/transam/xlog.c:4311 access/transam/xlog.c:9329 access/transam/xlogfuncs.c:693 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:495 postmaster/launch_backend.c:354 postmaster/postmaster.c:4092 postmaster/walsummarizer.c:1215 -#: replication/logical/origin.c:626 replication/slot.c:2360 storage/file/copydir.c:173 storage/file/copydir.c:261 storage/smgr/md.c:252 utils/time/snapmgr.c:1252 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 access/transam/timeline.c:329 access/transam/timeline.c:481 access/transam/xlog.c:3239 access/transam/xlog.c:3447 access/transam/xlog.c:4311 access/transam/xlog.c:9331 access/transam/xlogfuncs.c:693 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:495 postmaster/launch_backend.c:354 postmaster/postmaster.c:4074 postmaster/walsummarizer.c:1216 +#: replication/logical/origin.c:626 replication/slot.c:2362 storage/file/copydir.c:173 storage/file/copydir.c:261 storage/smgr/md.c:252 utils/time/snapmgr.c:1252 #, c-format msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作成できませんでした: %m" @@ -1222,7 +1232,7 @@ msgstr "ファイル\"%s\"を作成できませんでした: %m" msgid "could not truncate file \"%s\" to %u: %m" msgstr "ファイル\"%s\"を%uバイトに切り詰められませんでした: %m" -#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:498 access/transam/xlog.c:3300 access/transam/xlog.c:3503 access/transam/xlog.c:4323 commands/dbcommands.c:507 postmaster/launch_backend.c:365 postmaster/launch_backend.c:377 replication/logical/origin.c:638 replication/logical/origin.c:680 replication/logical/origin.c:699 replication/logical/snapbuild.c:1665 replication/slot.c:2396 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:498 access/transam/xlog.c:3292 access/transam/xlog.c:3503 access/transam/xlog.c:4323 commands/dbcommands.c:507 postmaster/launch_backend.c:365 postmaster/launch_backend.c:377 replication/logical/origin.c:638 replication/logical/origin.c:680 replication/logical/origin.c:699 replication/logical/snapbuild.c:1665 replication/slot.c:2398 #: storage/file/buffile.c:545 storage/file/copydir.c:213 utils/init/miscinit.c:1661 utils/init/miscinit.c:1672 utils/init/miscinit.c:1680 utils/misc/guc.c:4488 utils/misc/guc.c:4519 utils/misc/guc.c:5678 utils/misc/guc.c:5696 utils/time/snapmgr.c:1257 utils/time/snapmgr.c:1264 #, c-format msgid "could not write to file \"%s\": %m" @@ -1480,7 +1490,7 @@ msgstr "システムカタログのスキャン中にトランザクションが msgid "cannot access index \"%s\" while it is being reindexed" msgstr "再作成中であるためインデックス\"%s\"にアクセスできません" -#: access/index/indexam.c:203 catalog/objectaddress.c:1361 commands/indexcmds.c:3016 commands/tablecmds.c:284 commands/tablecmds.c:308 commands/tablecmds.c:19666 commands/tablecmds.c:21608 +#: access/index/indexam.c:203 catalog/objectaddress.c:1361 commands/indexcmds.c:3018 commands/tablecmds.c:284 commands/tablecmds.c:308 commands/tablecmds.c:19687 commands/tablecmds.c:21629 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\"はインデックスではありません" @@ -1505,7 +1515,7 @@ msgstr "キー %s はすでに存在します。" msgid "This may be because of a non-immutable index expression." msgstr "これは不変でないインデックス式が原因である可能性があります" -#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 parser/parse_utilcmd.c:2504 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 parser/parse_utilcmd.c:2508 #, c-format msgid "index \"%s\" is not a btree" msgstr "インデックス\"%s\"はbtreeではありません" @@ -1584,7 +1594,7 @@ msgstr "tid (%u, %u) はリレーション\"%s\"に対して妥当ではあり msgid "\"%s\" cannot be empty." msgstr "\"%s\"は空にはできません。" -#: access/table/tableamapi.c:113 access/transam/xlogrecovery.c:4912 +#: access/table/tableamapi.c:113 access/transam/xlogrecovery.c:4914 #, c-format msgid "\"%s\" is too long (maximum %d characters)." msgstr "\"%s\"が長過ぎます(最大%d文字)。" @@ -1624,114 +1634,114 @@ msgstr "プライマリサーバーで設定パラメータ\"%s\"がonに設定 msgid "Make sure the configuration parameter \"%s\" is set." msgstr "設定パラメータ\"%s\"が設定されていることを確認してください。" -#: access/transam/multixact.c:1179 +#: access/transam/multixact.c:1266 #, c-format msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database \"%s\"" msgstr "データベース\"%s\"はMultiXactIds周回によるデータ損失を防ぐために、新規のMultiXactIdsを割り当てるコマンドを受け付けていません" -#: access/transam/multixact.c:1181 access/transam/multixact.c:1188 access/transam/multixact.c:1212 access/transam/multixact.c:1221 access/transam/varsup.c:158 access/transam/varsup.c:165 +#: access/transam/multixact.c:1268 access/transam/multixact.c:1275 access/transam/multixact.c:1299 access/transam/multixact.c:1308 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" -"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +"You might also need to commit or roll back old prepared transactions." msgstr "" "そのデータベース全体の VACUUM を実行してください。\n" -"古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除も必要かもしれません。" +"古い準備済みトランザクションのコミットまたはロールバックも必要かもしれません。" -#: access/transam/multixact.c:1186 +#: access/transam/multixact.c:1273 #, c-format msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database with OID %u" msgstr "OID %u のデータベースは周回によるデータ損失を防ぐために、新規のMultiXactIdsを割り当てるコマンドを受け付けていません" -#: access/transam/multixact.c:1207 access/transam/multixact.c:2552 +#: access/transam/multixact.c:1294 access/transam/multixact.c:2650 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "データベース\"%s\"はあと%u個のMultiXactIdが使われる前にVACUUMする必要があります" -#: access/transam/multixact.c:1216 access/transam/multixact.c:2561 +#: access/transam/multixact.c:1303 access/transam/multixact.c:2659 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" msgstr[0] "OID %u のデータベースはあと%u個のMultiXactIdが使われる前にVACUUMする必要があります" -#: access/transam/multixact.c:1280 +#: access/transam/multixact.c:1367 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "マルチトランザクションの\"メンバ\"が制限を超えました" -#: access/transam/multixact.c:1281 +#: access/transam/multixact.c:1368 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." msgstr[0] "このコマンドで%u個のメンバを持つマルチトランザクションが生成されますが、残りのスペースは %u 個のメンバ分しかありません。" -#: access/transam/multixact.c:1286 +#: access/transam/multixact.c:1373 #, c-format msgid "Execute a database-wide VACUUM in database with OID %u with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." msgstr "\"vacuum_multixact_freeze_min_age\"と\"vacuum_multixact_freeze_table_age\"をより小さな値に設定してOID %u のデータベースでデータベース全体にVACUUMを実行してください。" -#: access/transam/multixact.c:1317 +#: access/transam/multixact.c:1404 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" msgstr[0] "OID %u のデータベースは更に%d個のマルチトランザクションメンバが使用される前にVACUUMを実行する必要があります" -#: access/transam/multixact.c:1322 +#: access/transam/multixact.c:1409 #, c-format msgid "Execute a database-wide VACUUM in that database with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." msgstr "\"vacuum_multixact_freeze_min_age\"'と\"vacuum_multixact_freeze_table_age\"をより小さな値に設定した上で、そのデータベースでVACUUMを実行してください。" -#: access/transam/multixact.c:1461 +#: access/transam/multixact.c:1548 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %uはもう存在しません: 周回しているようです" -#: access/transam/multixact.c:1467 +#: access/transam/multixact.c:1554 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %uを作成できませんでした: 周回している様子" -#: access/transam/multixact.c:1560 +#: access/transam/multixact.c:1647 #, c-format msgid "MultiXact %u has invalid next offset" msgstr "MultiXact %u の次のオフセットが不正です" -#: access/transam/multixact.c:2557 access/transam/multixact.c:2566 +#: access/transam/multixact.c:2655 access/transam/multixact.c:2664 #, c-format msgid "" "To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" -"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +"You might also need to commit or roll back old prepared transactions." msgstr "" "MultiXactIdの割り当て失敗を防ぐために、このデータベースでデータベース全体に対するVACUUMを実行してください。\n" -"古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除も必要かもしれません。" +"古い準備済みトランザクションのコミットまたはロールバックも必要かもしれません。" -#: access/transam/multixact.c:2845 +#: access/transam/multixact.c:2947 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "最古のチェックポイント済みのマルチトランザクション%uがディスク上に存在しないため、マルチトランザクションメンバーの周回防止機能を無効にしました" -#: access/transam/multixact.c:2867 +#: access/transam/multixact.c:2969 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "マルチトランザクションメンバーの周回防止機能が有効になりました" -#: access/transam/multixact.c:3258 +#: access/transam/multixact.c:3360 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "最古のマルチトランザクション%uが見つかりません、アクセス可能な最古のものは%u、切り詰めをスキップします" -#: access/transam/multixact.c:3276 +#: access/transam/multixact.c:3378 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "マルチトランザクション%uがディスク上に存在しないため、そこまでの切り詰めができません、切り詰めをスキップします" -#: access/transam/multixact.c:3293 +#: access/transam/multixact.c:3395 #, c-format msgid "cannot truncate up to MultiXact %u because it has invalid offset, skipping truncation" msgstr "マルチトランザクション%uのオフセットが不正なため、そこまでの切り詰めができません、切り詰めをスキップします" -#: access/transam/multixact.c:3638 +#: access/transam/multixact.c:3732 #, c-format msgid "invalid MultiXactId: %u" msgstr "不正なMultiXactId: %u" @@ -1760,12 +1770,12 @@ msgstr "パラレルワーカーへの接続を失いました" msgid "parallel worker" msgstr "パラレルワーカー" -#: access/transam/parallel.c:1355 replication/logical/applyparallelworker.c:897 +#: access/transam/parallel.c:1355 replication/logical/applyparallelworker.c:906 #, c-format msgid "could not map dynamic shared memory segment" msgstr "動的共有メモリセグメントをマップできませんでした" -#: access/transam/parallel.c:1360 replication/logical/applyparallelworker.c:903 +#: access/transam/parallel.c:1360 replication/logical/applyparallelworker.c:912 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "動的共有メモリセグメントのマジックナンバーが不正です" @@ -1945,12 +1955,12 @@ msgstr "\"max_prepared_transactions\"を0以外の値に設定してください msgid "transaction identifier \"%s\" is already in use" msgstr "トランザクション識別子\"%s\"はすでに存在します" -#: access/transam/twophase.c:404 access/transam/twophase.c:2530 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "準備済みのトランザクションの最大数に達しました" -#: access/transam/twophase.c:405 access/transam/twophase.c:2531 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format msgid "Increase \"max_prepared_transactions\" (currently %d)." msgstr "\"max_prepared_transactions\"を大きくしてください(現在は%d)。" @@ -1985,119 +1995,119 @@ msgstr "終了させるためにはこのトランザクションを準備した msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "識別子\"%s\"の準備されたトランザクションはありません" -#: access/transam/twophase.c:1174 +#: access/transam/twophase.c:1175 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "2相状態ファイルの最大長が制限を超えました" -#: access/transam/twophase.c:1329 +#: access/transam/twophase.c:1330 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" msgstr[0] "ファイル\"%s\"のサイズが不正: %lld バイト" -#: access/transam/twophase.c:1338 +#: access/transam/twophase.c:1339 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "ファイル\"%s\"のCRCオフセットのアライメントが不正です" -#: access/transam/twophase.c:1356 +#: access/transam/twophase.c:1357 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$lldバイトのうち%2$dバイトを読み込みました" -#: access/transam/twophase.c:1371 +#: access/transam/twophase.c:1372 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "ファイル\"%s\"に格納されているマジックナンバーが不正です" -#: access/transam/twophase.c:1377 +#: access/transam/twophase.c:1378 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "ファイル\"%s\"内に格納されているサイズが不正です" -#: access/transam/twophase.c:1389 +#: access/transam/twophase.c:1390 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "算出されたCRCチェックサムがファイル\"%s\"に格納されている値と一致しません" -#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:572 postmaster/walsummarizer.c:939 replication/logical/logical.c:213 replication/walsender.c:826 +#: access/transam/twophase.c:1420 access/transam/xlogrecovery.c:572 postmaster/walsummarizer.c:940 replication/logical/logical.c:213 replication/walsender.c:826 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "WALリーダの割り当てに中に失敗しました。" -#: access/transam/twophase.c:1429 +#: access/transam/twophase.c:1430 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "WALの%X/%Xから2相状態を読み取れませんでした: %s" -#: access/transam/twophase.c:1434 +#: access/transam/twophase.c:1435 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "WALの%X/%Xから2相状態を読み取れませんでした" -#: access/transam/twophase.c:1442 +#: access/transam/twophase.c:1443 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "WALの%X/%Xにあるはずの2相状態のデータがありません" -#: access/transam/twophase.c:1744 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "ファイル\"%s\"を再作成できませんでした: %m" -#: access/transam/twophase.c:1871 +#: access/transam/twophase.c:1872 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "長時間実行中の準備済みトランザクションのために%u個の2相状態ファイルが書き込まれました" -#: access/transam/twophase.c:2106 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "共有メモリから準備済みトランザクション%uを復元します" -#: access/transam/twophase.c:2199 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "不要になったトランザクション%uの2相状態ファイルを削除します" -#: access/transam/twophase.c:2206 +#: access/transam/twophase.c:2207 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "不要になったトランザクション%uの2相状態をメモリから削除します" -#: access/transam/twophase.c:2219 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "トランザクション%uの未来の2相状態ファイルを削除します" -#: access/transam/twophase.c:2226 +#: access/transam/twophase.c:2227 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "未来のトランザクション%uの2相状態をメモリから削除します" -#: access/transam/twophase.c:2251 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "トランザクション%uの2相状態ファイルが破損しています" -#: access/transam/twophase.c:2256 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "メモリ上にあるトランザクション%uの2相状態が破損しています" -#: access/transam/twophase.c:2513 +#: access/transam/twophase.c:2514 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "トランザクション%uの2相状態ファイルを復元できませんでした" -#: access/transam/twophase.c:2515 +#: access/transam/twophase.c:2516 #, c-format msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." msgstr "2相状態ファイルがWALレコード%X/%Xで見つかりましたが、このトランザクションはすでにディスクから復元済みです。" -#: access/transam/twophase.c:2523 storage/file/fd.c:514 utils/fmgr/dfmgr.c:214 +#: access/transam/twophase.c:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:214 #, c-format msgid "could not access file \"%s\": %m" msgstr "ファイル\"%s\"にアクセスできませんでした: %m" @@ -2107,6 +2117,15 @@ msgstr "ファイル\"%s\"にアクセスできませんでした: %m" msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database \"%s\"" msgstr "データベース\"%s\"はXID周回によるデータ損失を防ぐために、新規のトランザクションIDを割り当てるコマンドを受け付けていません" +#: access/transam/varsup.c:158 access/transam/varsup.c:165 +#, c-format +msgid "" +"Execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"そのデータベース全体の VACUUM を実行してください。\n" +"古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除も必要かもしれません。" + #: access/transam/varsup.c:163 #, c-format msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database with OID %u" @@ -2264,12 +2283,12 @@ msgstr "生成されたWALより先の位置までの読み込み要求; 要求 msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." msgstr "WALセグメントサイズは1MBから1GBまでの間の2の累乗でなければなりません。" -#: access/transam/xlog.c:2454 +#: access/transam/xlog.c:2451 #, c-format msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" msgstr "ログファイル \"%s\" のオフセット%uに長さ%zuの書き込みができませんでした: %m" -#: access/transam/xlog.c:3740 access/transam/xlogutils.c:820 replication/walsender.c:3088 +#: access/transam/xlog.c:3740 access/transam/xlogutils.c:844 replication/walsender.c:3119 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "要求された WAL セグメント %s はすでに削除されています" @@ -2367,12 +2386,12 @@ msgstr[0] "制御ファイル中の不正なWALセグメントサイズ (%dバ msgid "\"%s\" must be at least twice \"%s\"" msgstr "\"%s\"は\"%s\"の2倍以上でなければなりません" -#: access/transam/xlog.c:4725 catalog/namespace.c:4699 commands/tablespace.c:1210 commands/user.c:2531 commands/variable.c:72 replication/slot.c:2768 tcop/postgres.c:3626 utils/error/elog.c:2257 +#: access/transam/xlog.c:4725 catalog/namespace.c:4699 commands/tablespace.c:1210 commands/user.c:2531 commands/variable.c:72 replication/slot.c:2770 tcop/postgres.c:3630 utils/error/elog.c:2257 #, c-format msgid "List syntax is invalid." msgstr "リスト文法が無効です" -#: access/transam/xlog.c:4771 commands/user.c:2547 commands/variable.c:173 tcop/postgres.c:3642 utils/error/elog.c:2283 +#: access/transam/xlog.c:4771 commands/user.c:2547 commands/variable.c:173 tcop/postgres.c:3646 utils/error/elog.c:2283 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "不明なキーワードです: \"%s\"" @@ -2482,159 +2501,159 @@ msgstr "新しいタイムラインIDを選択: %u" msgid "archive recovery complete" msgstr "アーカイブリカバリが完了しました" -#: access/transam/xlog.c:6653 +#: access/transam/xlog.c:6655 #, c-format msgid "shutting down" msgstr "シャットダウンしています" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6692 +#: access/transam/xlog.c:6694 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "リスタートポイント開始:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6704 +#: access/transam/xlog.c:6706 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "チェックポイント開始:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6769 +#: access/transam/xlog.c:6771 #, c-format msgid "restartpoint complete: wrote %d buffers (%.1f%%), wrote %d SLRU buffers; %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "リスタートポイント完了: %d個のバッファを出力 (%.1f%%), %d個のSLRUバッファを出力; %d個のWALファイルを追加、%d個を削除、%d個を再利用; 書き出し=%ld.%03d秒, 同期=%ld.%03d秒, 全体=%ld.%03d秒; 同期したファイル=%d, 最長=%ld.%03d秒, 平均=%ld.%03d秒; 距離=%d kB, 予測=%d kB; lsn=%X/%X, 再生lsn=%X/%X" -#: access/transam/xlog.c:6793 +#: access/transam/xlog.c:6795 #, c-format msgid "checkpoint complete: wrote %d buffers (%.1f%%), wrote %d SLRU buffers; %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "チェックポイント完了: %d個のバッファを出力 (%.1f%%), %d個のSLRUバッファを出力; %d個のWALファイルを追加、%d個を削除、%d個を再利用; 書き出し=%ld.%03d秒, 同期=%ld.%03d秒, 全体=%ld.%03d秒; 同期したファイル=%d, 最長=%ld.%03d秒, 平均=%ld.%03d秒; 距離=%d kB, 予測=%d kB; lsn=%X/%X, 再生lsn=%X/%X" -#: access/transam/xlog.c:7279 +#: access/transam/xlog.c:7281 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "データベースのシャットダウンに並行して、先行書き込みログが発生しました" -#: access/transam/xlog.c:7871 +#: access/transam/xlog.c:7873 #, c-format msgid "recovery restart point at %X/%X" msgstr "リカバリ再開ポイントは%X/%Xです" -#: access/transam/xlog.c:7873 +#: access/transam/xlog.c:7875 #, c-format msgid "Last completed transaction was at log time %s." msgstr "最後に完了したトランザクションはログ時刻 %s のものです" -#: access/transam/xlog.c:8137 +#: access/transam/xlog.c:8139 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "復帰ポイント\"%s\"が%X/%Xに作成されました" -#: access/transam/xlog.c:8344 +#: access/transam/xlog.c:8346 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "オンラインバックアップはキャンセルされ、リカバリを継続できません" -#: access/transam/xlog.c:8402 +#: access/transam/xlog.c:8404 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "シャットダウンチェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:8468 +#: access/transam/xlog.c:8470 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "オンラインチェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:8505 +#: access/transam/xlog.c:8507 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "リカバリ終了チェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:8775 +#: access/transam/xlog.c:8777 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "ライトスルーファイル\"%s\"をfsyncできませんでした: %m" -#: access/transam/xlog.c:8780 +#: access/transam/xlog.c:8782 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "ファイル\"%s\"をfdatasyncできませんでした: %m" -#: access/transam/xlog.c:8857 access/transam/xlog.c:9193 +#: access/transam/xlog.c:8859 access/transam/xlog.c:9195 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "オンラインバックアップを行うにはWALレベルが不十分です" -#: access/transam/xlog.c:8858 access/transam/xlog.c:9194 access/transam/xlogfuncs.c:249 +#: access/transam/xlog.c:8860 access/transam/xlog.c:9196 access/transam/xlogfuncs.c:249 #, c-format msgid "\"wal_level\" must be set to \"replica\" or \"logical\" at server start." msgstr "サーバーの開始時に\"wal_level\"を\"replica\"または \"logical\"にセットする必要があります。" -#: access/transam/xlog.c:8863 +#: access/transam/xlog.c:8865 #, c-format msgid "backup label too long (max %d bytes)" msgstr "バックアップラベルが長すぎます (最大%dバイト)" -#: access/transam/xlog.c:8984 +#: access/transam/xlog.c:8986 #, c-format msgid "WAL generated with \"full_page_writes=off\" was replayed since last restartpoint" msgstr "\"full_page_writes=off\"で生成されたWALが最終リスタートポイント以降に再生されました" -#: access/transam/xlog.c:8986 access/transam/xlog.c:9282 +#: access/transam/xlog.c:8988 access/transam/xlog.c:9284 #, c-format msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, and then try an online backup again." msgstr "つまりこのスタンバイで取得されたバックアップは破損しており、使用すべきではありません。プライマリで\"full_page_writes\"を有効にしCHECKPOINTを実行したのち、再度オンラインバックアップを試行してください。" -#: access/transam/xlog.c:9066 backup/basebackup.c:1419 utils/adt/misc.c:354 +#: access/transam/xlog.c:9068 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: access/transam/xlog.c:9073 backup/basebackup.c:1424 utils/adt/misc.c:359 +#: access/transam/xlog.c:9075 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" -#: access/transam/xlog.c:9232 backup/basebackup.c:1283 +#: access/transam/xlog.c:9234 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "オンラインバックアップ中にスタンバイが昇格しました" -#: access/transam/xlog.c:9233 backup/basebackup.c:1284 +#: access/transam/xlog.c:9235 backup/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "つまり取得中のバックアップは破損しているため使用してはいけません。再度オンラインバックアップを取得してください。" -#: access/transam/xlog.c:9280 +#: access/transam/xlog.c:9282 #, c-format msgid "WAL generated with \"full_page_writes=off\" was replayed during online backup" msgstr "\"full_page_writes=off\"で生成されたWALがオンラインバックアップ中に再生されました" -#: access/transam/xlog.c:9396 +#: access/transam/xlog.c:9398 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "ベースバックアップ完了、必要な WAL セグメントがアーカイブされるのを待っています" -#: access/transam/xlog.c:9410 +#: access/transam/xlog.c:9412 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "まだ必要なすべての WAL セグメントがアーカイブされるのを待っています(%d 秒経過)" -#: access/transam/xlog.c:9412 +#: access/transam/xlog.c:9414 #, c-format msgid "Check that your \"archive_command\" is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." msgstr "\"archive_command\"が正しく実行されていることを確認してください。バックアップ処理は安全に取り消すことができますが、全てのWALセグメントがそろわなければこのバックアップは利用できません。" -#: access/transam/xlog.c:9419 +#: access/transam/xlog.c:9421 #, c-format msgid "all required WAL segments have been archived" msgstr "必要なすべての WAL セグメントがアーカイブされました" -#: access/transam/xlog.c:9423 +#: access/transam/xlog.c:9425 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "WAL アーカイブが有効になっていません。バックアップを完了させるには、すべての必要なWALセグメントが他の方法でコピーされたことを確認してください。" -#: access/transam/xlog.c:9462 +#: access/transam/xlog.c:9464 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "バックエンドがpg_backup_stopの呼び出し前に終了したため、バックアップは異常終了しました" @@ -2677,7 +2696,7 @@ msgstr "アーカイブステータスファイル\"%s\"を作成できません msgid "could not write archive status file \"%s\": %m" msgstr "アーカイブステータスファイル\"%s\"に書き込めませんでした: %m" -#: access/transam/xlogfuncs.c:70 backup/basebackup.c:999 +#: access/transam/xlogfuncs.c:70 backup/basebackup.c:997 #, c-format msgid "a backup is already in progress in this session" msgstr "このセッションではすでにバックアップが進行中です" @@ -2848,82 +2867,82 @@ msgstr "WALセグメント%3$s、LSN %4$X/%5$X、オフセット%6$uで想定外 msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%3$s、LSN %4$X/%5$X、オフセット%6$uで異常な順序のタイムラインID %1$u(%2$uの後)" -#: access/transam/xlogreader.c:1769 +#: access/transam/xlogreader.c:1771 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %uが%X/%Xで不正です" -#: access/transam/xlogreader.c:1793 +#: access/transam/xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません" -#: access/transam/xlogreader.c:1800 +#: access/transam/xlogreader.c:1802 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATAが設定されていませんが、%2$X/%3$Xのデータ長は%1$uです" -#: access/transam/xlogreader.c:1836 +#: access/transam/xlogreader.c:1838 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEが設定されていますが、%4$X/%5$Xでホールオフセット%1$u、長さ%2$u、ブロックイメージ長%3$uです" -#: access/transam/xlogreader.c:1852 +#: access/transam/xlogreader.c:1854 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEが設定されていませんが、%3$X/%4$Xにおけるホールオフセット%1$uの長さが%2$uです" -#: access/transam/xlogreader.c:1866 +#: access/transam/xlogreader.c:1868 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" -#: access/transam/xlogreader.c:1881 +#: access/transam/xlogreader.c:1883 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEもBKPIMAGE_COMPRESSEDも設定されていませんが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" -#: access/transam/xlogreader.c:1897 +#: access/transam/xlogreader.c:1899 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません" -#: access/transam/xlogreader.c:1909 +#: access/transam/xlogreader.c:1911 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "%2$X/%3$Xにおけるblock_id %1$uが不正です" -#: access/transam/xlogreader.c:1976 +#: access/transam/xlogreader.c:1978 #, c-format msgid "record with invalid length at %X/%X" msgstr "%X/%Xのレコードのサイズが不正です" -#: access/transam/xlogreader.c:2002 +#: access/transam/xlogreader.c:2004 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "WALレコード中ID %dのバックアップブロックを特定できませんでした" -#: access/transam/xlogreader.c:2086 +#: access/transam/xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "%X/%Xで不正なブロック%dが指定されているためイメージが復元できませんでした" -#: access/transam/xlogreader.c:2093 +#: access/transam/xlogreader.c:2095 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "%X/%Xでブロック%dのイメージが不正な状態であるため復元できませんでした" -#: access/transam/xlogreader.c:2120 access/transam/xlogreader.c:2137 +#: access/transam/xlogreader.c:2122 access/transam/xlogreader.c:2139 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "%1$X/%2$Xで、ブロック%4$dがこのビルドでサポートされない圧縮方式%3$sで圧縮されているため復元できませんでした" -#: access/transam/xlogreader.c:2146 +#: access/transam/xlogreader.c:2148 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "%X/%Xでブロック%dのイメージが不明な方式で圧縮されているため復元できませんでした" -#: access/transam/xlogreader.c:2154 +#: access/transam/xlogreader.c:2156 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "%X/%Xのブロック%dが伸張できませんでした" @@ -3267,7 +3286,7 @@ msgstr "リカバリ完了位置で一時停止しています" msgid "Execute pg_wal_replay_resume() to promote." msgstr "再開するには pg_wal_replay_resume() を実行してください" -#: access/transam/xlogrecovery.c:2963 access/transam/xlogrecovery.c:4720 +#: access/transam/xlogrecovery.c:2963 access/transam/xlogrecovery.c:4722 #, c-format msgid "recovery has paused" msgstr "リカバリは一時停止中です" @@ -3282,143 +3301,143 @@ msgstr "再開するには pg_xlog_replay_resume() を実行してください" msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%2$s、LSN %3$X/%4$X、オフセット%5$uで想定外のタイムラインID%1$u" -#: access/transam/xlogrecovery.c:3443 +#: access/transam/xlogrecovery.c:3445 #, c-format msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" msgstr "WALセグメント%s、LSN %X/%X、オフセット%uを読み取れませんでした: %m" -#: access/transam/xlogrecovery.c:3450 +#: access/transam/xlogrecovery.c:3452 #, c-format 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:4104 +#: access/transam/xlogrecovery.c:4106 #, c-format msgid "invalid checkpoint location" msgstr "不正なチェックポイント位置" -#: access/transam/xlogrecovery.c:4114 +#: access/transam/xlogrecovery.c:4116 #, c-format msgid "invalid checkpoint record" msgstr "チェックポイントレコードが不正です" -#: access/transam/xlogrecovery.c:4120 +#: access/transam/xlogrecovery.c:4122 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "チェックポイントレコード内のリソースマネージャIDがで不正です" -#: access/transam/xlogrecovery.c:4128 +#: access/transam/xlogrecovery.c:4130 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "チェックポイントレコード内のxl_infoが不正です" -#: access/transam/xlogrecovery.c:4134 +#: access/transam/xlogrecovery.c:4136 #, c-format msgid "invalid length of checkpoint record" msgstr "チェックポイントレコード長が不正です" -#: access/transam/xlogrecovery.c:4188 +#: access/transam/xlogrecovery.c:4190 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "新しいタイムライン%uはデータベースシステムのタイムライン%uの子ではありません" -#: access/transam/xlogrecovery.c:4202 +#: access/transam/xlogrecovery.c:4204 #, 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:4221 +#: access/transam/xlogrecovery.c:4223 #, c-format msgid "new target timeline is %u" msgstr "新しい目標タイムラインは%uです" -#: access/transam/xlogrecovery.c:4422 +#: access/transam/xlogrecovery.c:4424 #, c-format msgid "WAL receiver process shutdown requested" msgstr "wal receiverプロセスのシャットダウンが要求されました" -#: access/transam/xlogrecovery.c:4482 +#: access/transam/xlogrecovery.c:4484 #, c-format msgid "received promote request" msgstr "昇格要求を受信しました" -#: access/transam/xlogrecovery.c:4711 +#: access/transam/xlogrecovery.c:4713 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "不十分なパラメータ設定のため、ホットスタンバイを使用できません" -#: access/transam/xlogrecovery.c:4712 access/transam/xlogrecovery.c:4739 access/transam/xlogrecovery.c:4769 +#: access/transam/xlogrecovery.c:4714 access/transam/xlogrecovery.c:4741 access/transam/xlogrecovery.c:4771 #, 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:4721 +#: access/transam/xlogrecovery.c:4723 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "リカバリの一時停止を解除すると、サーバーはシャットダウンします。" -#: access/transam/xlogrecovery.c:4722 +#: access/transam/xlogrecovery.c:4724 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "その後、必要な設定変更を行った後にサーバーを再起動できます。" -#: access/transam/xlogrecovery.c:4733 +#: access/transam/xlogrecovery.c:4735 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "不十分なパラメータ設定のため、昇格できません" -#: access/transam/xlogrecovery.c:4743 +#: access/transam/xlogrecovery.c:4745 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "必要な設定変更を行ったのち、サーバーを再起動してください。" -#: access/transam/xlogrecovery.c:4767 +#: access/transam/xlogrecovery.c:4769 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "不十分なパラメータ設定値のためリカバリが停止しました" -#: access/transam/xlogrecovery.c:4773 +#: access/transam/xlogrecovery.c:4775 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "必要な設定変更を行うことでサーバーを再起動できます。" -#: access/transam/xlogrecovery.c:4793 access/transam/xlogrecovery.c:4795 catalog/dependency.c:1153 catalog/dependency.c:1160 catalog/dependency.c:1171 commands/tablecmds.c:1519 commands/tablecmds.c:16740 commands/tablespace.c:460 commands/user.c:1302 commands/vacuum.c:226 commands/view.c:441 executor/execExprInterp.c:5211 executor/execExprInterp.c:5219 libpq/auth.c:320 replication/logical/applyparallelworker.c:1048 replication/slot.c:1705 replication/slot.c:2783 -#: replication/slot.c:2785 replication/syncrep.c:1079 storage/aio/method_io_uring.c:389 storage/lmgr/deadlock.c:1137 storage/lmgr/proc.c:1525 utils/misc/guc.c:3166 utils/misc/guc.c:3207 utils/misc/guc.c:3282 utils/misc/guc.c:6834 utils/misc/guc.c:6868 utils/misc/guc.c:6902 utils/misc/guc.c:6945 utils/misc/guc.c:6987 +#: access/transam/xlogrecovery.c:4795 access/transam/xlogrecovery.c:4797 catalog/dependency.c:1153 catalog/dependency.c:1160 catalog/dependency.c:1171 commands/tablecmds.c:1529 commands/tablecmds.c:16761 commands/tablespace.c:460 commands/user.c:1302 commands/vacuum.c:226 commands/view.c:441 executor/execExprInterp.c:5282 executor/execExprInterp.c:5290 libpq/auth.c:320 replication/logical/applyparallelworker.c:1057 replication/slot.c:1707 replication/slot.c:2785 +#: replication/slot.c:2787 replication/syncrep.c:1079 storage/aio/method_io_uring.c:389 storage/lmgr/deadlock.c:1137 storage/lmgr/proc.c:1558 utils/misc/guc.c:3166 utils/misc/guc.c:3207 utils/misc/guc.c:3282 utils/misc/guc.c:6834 utils/misc/guc.c:6868 utils/misc/guc.c:6902 utils/misc/guc.c:6945 utils/misc/guc.c:6987 #, c-format msgid "%s" msgstr "%s" -#: access/transam/xlogrecovery.c:4825 +#: access/transam/xlogrecovery.c:4827 #, c-format msgid "multiple recovery targets specified" msgstr "複数のリカバリ目標が指定されています" -#: access/transam/xlogrecovery.c:4826 +#: access/transam/xlogrecovery.c:4828 #, 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:4837 +#: access/transam/xlogrecovery.c:4839 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "\"immediate\"のみが指定可能です。" -#: access/transam/xlogrecovery.c:4991 +#: access/transam/xlogrecovery.c:4993 #, c-format msgid "Timestamp out of range: \"%s\"." msgstr "timestampが範囲外です: \"%s\"。" -#: access/transam/xlogrecovery.c:5036 +#: access/transam/xlogrecovery.c:5038 #, c-format msgid "\"recovery_target_timeline\" is not a valid number." msgstr "\"recovery_target_timeline\"が数値として妥当ではありません。" -#: access/transam/xlogutils.c:1023 +#: access/transam/xlogutils.c:1059 #, c-format msgid "could not read from WAL segment %s, offset %d: %m" msgstr "WALセグメント%s、オフセット%dを読み取れませんでした: %m" -#: access/transam/xlogutils.c:1030 +#: access/transam/xlogutils.c:1066 #, c-format msgid "could not read from WAL segment %s, offset %d: read %d of %d" msgstr "WALセグメント%1$s、オフセット%2$dを読み取れませんでした: %4$d 中 %3$d 読み込みました" @@ -3438,7 +3457,7 @@ msgstr "失敗したアーカイブコマンドは次のとおりです: %s" msgid "archive command was terminated by exception 0x%X" msgstr "アーカイブコマンドが例外0x%Xで終了しました" -#: archive/shell_archive.c:109 postmaster/postmaster.c:2850 +#: archive/shell_archive.c:109 postmaster/postmaster.c:2832 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "16進値の説明についてはC インクルードファイル\"ntstatus.h\"を参照してください。" @@ -3499,113 +3518,113 @@ msgstr[0] "合計%lld個のデータチェックサム検証エラー" msgid "checksum verification failure during base backup" msgstr "ベースバックアップ中にチェックサム確認が失敗しました" -#: backup/basebackup.c:735 backup/basebackup.c:744 backup/basebackup.c:755 backup/basebackup.c:772 backup/basebackup.c:781 backup/basebackup.c:790 backup/basebackup.c:805 backup/basebackup.c:822 backup/basebackup.c:831 backup/basebackup.c:843 backup/basebackup.c:867 backup/basebackup.c:881 backup/basebackup.c:892 backup/basebackup.c:903 backup/basebackup.c:916 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format msgid "duplicate option \"%s\"" msgstr "\"%s\"オプションは重複しています" -#: backup/basebackup.c:763 +#: backup/basebackup.c:761 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "認識されないチェックポイントタイプ: \"%s\"" -#: backup/basebackup.c:795 +#: backup/basebackup.c:793 #, c-format msgid "incremental backups cannot be taken unless WAL summarization is enabled" msgstr "WAL集約が有効でなければ差分バックアップは取得できません" -#: backup/basebackup.c:811 +#: backup/basebackup.c:809 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%dはパラメータ\"%s\"の有効範囲を超えています(%d .. %d)" -#: backup/basebackup.c:856 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "認識できない目録オプション: \"%s\"" -#: backup/basebackup.c:907 +#: backup/basebackup.c:905 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "認識できない圧縮アルゴリズム: \"%s\"" -#: backup/basebackup.c:923 +#: backup/basebackup.c:921 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "認識できないベースバックアップオプション: \"%s\"" -#: backup/basebackup.c:934 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "目録のチェックサムにはバックアップ目録が必要です" -#: backup/basebackup.c:943 +#: backup/basebackup.c:941 #, c-format msgid "target detail cannot be used without target" msgstr "ターゲット詳細はターゲットの指定なしでは指定できません" -#: backup/basebackup.c:952 backup/basebackup_target.c:218 +#: backup/basebackup.c:950 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "ターゲット\"%s\"はターゲット詳細を受け付けません" -#: backup/basebackup.c:963 +#: backup/basebackup.c:961 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "圧縮詳細は圧縮が有効でない場合は指定できません" -#: backup/basebackup.c:976 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "不正な圧縮指定: %s" -#: backup/basebackup.c:1026 +#: backup/basebackup.c:1024 #, c-format msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" msgstr "差分のBASE_BACKUPの実行前にUPLOAD_MANIFESTを実行する必要があります" -#: backup/basebackup.c:1159 backup/basebackup.c:1360 +#: backup/basebackup.c:1157 backup/basebackup.c:1358 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "\"%s\"というファイルまたはディレクトリの情報を取得できませんでした。: %m" -#: backup/basebackup.c:1546 +#: backup/basebackup.c:1544 #, c-format msgid "skipping special file \"%s\"" msgstr "スペシャルファイル\"%s\"をスキップしています" -#: backup/basebackup.c:1753 +#: backup/basebackup.c:1751 #, c-format msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" msgstr "ファイル\"%s\"、ブロック%uでチェックサム検証に失敗しました: 読み込みバッファサイズ%dとページサイズ%dが異なっています" -#: backup/basebackup.c:1815 +#: backup/basebackup.c:1813 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" msgstr[0] "ファイル\"%s\"では合計%d個のチェックサムエラーが発生しました" -#: backup/basebackup.c:1920 +#: backup/basebackup.c:1918 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" msgstr "ファイル\"%s\"のブロック%uでチェックサム検証が失敗しました: 計算されたチェックサムは%Xですが想定は%Xです" -#: backup/basebackup.c:1927 +#: backup/basebackup.c:1925 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "ファイル\"%s\"における以降のチェックサムエラーは報告されません" -#: backup/basebackup.c:2052 +#: backup/basebackup.c:2050 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "ファイル名がtarフォーマットに対して長すぎます: \"%s\"" -#: backup/basebackup.c:2058 +#: backup/basebackup.c:2056 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "シンボリックリンクのリンク先tarのフォーマットにとって長すぎます: ファイル名 \"%s\", リンク先 \"%s\"" -#: backup/basebackup.c:2132 +#: backup/basebackup.c:2130 #, c-format msgid "could not read file \"%s\": read %zd of %zu" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$zdバイトを読み込みました" @@ -3700,7 +3719,7 @@ msgstr "\"%s\"ロールの権限を持つロールのみが、サーバー上に msgid "relative path not allowed for backup stored on server" msgstr "サーバー上に格納されるバックアップでは相対パスは指定できません" -#: backup/basebackup_server.c:102 commands/dbcommands.c:478 commands/tablespace.c:157 commands/tablespace.c:173 commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2287 storage/file/copydir.c:58 +#: backup/basebackup_server.c:102 commands/dbcommands.c:478 commands/tablespace.c:157 commands/tablespace.c:173 commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2289 storage/file/copydir.c:58 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" @@ -3720,10 +3739,10 @@ msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" msgid "Check free disk space." msgstr "ディスクの空き容量をチェックしてください。" -#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 backup/walsummary.c:309 +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 #, c-format -msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" -msgstr "ファイル\"%1$s\"に書き込みできませんでした: オフセット%4$uで%3$dバイト中%2$dバイト分のみを書き出しました" +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %lld" +msgstr "ファイル\"%1$s\"に書き込みできませんでした: オフセット%4$lldで%3$dバイト中%2$dバイト分のみを書き出しました" #: backup/basebackup_target.c:146 #, c-format @@ -3750,27 +3769,32 @@ msgstr "圧縮ワーカー数を%dに設定できませんでした: %s" msgid "could not enable long-distance mode: %s" msgstr "長距離モードを有効化できませんでした: %s" +#: backup/walsummary.c:309 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "ファイル\"%1$s\"に書き込みできませんでした: オフセット%4$uで%3$dバイト中%2$dバイト分のみを書き出しました" + #: backup/walsummaryfuncs.c:95 #, c-format msgid "invalid timeline %" msgstr "不正なタイムライン%" -#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:626 tcop/postgres.c:3858 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:627 tcop/postgres.c:3862 #, c-format msgid "--%s must be first argument" msgstr "--%sは最初の引数でなければなりません" -#: bootstrap/bootstrap.c:253 postmaster/postmaster.c:640 tcop/postgres.c:3872 +#: bootstrap/bootstrap.c:253 postmaster/postmaster.c:641 tcop/postgres.c:3876 #, c-format msgid "--%s requires a value" msgstr "--%sには値が必要です" -#: bootstrap/bootstrap.c:258 postmaster/postmaster.c:645 tcop/postgres.c:3877 +#: bootstrap/bootstrap.c:258 postmaster/postmaster.c:646 tcop/postgres.c:3881 #, c-format msgid "-c %s requires a value" msgstr "-c %sは値が必要です" -#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:763 postmaster/postmaster.c:776 +#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:764 postmaster/postmaster.c:777 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細については\"%s --help\"を実行してください。\n" @@ -3925,9 +3949,9 @@ msgstr "デフォルト権限を変更する権限がありません" msgid "cannot use IN SCHEMA clause when using %s" msgstr "%s の使用時には IN SCHEMA 句は指定できません" -#: catalog/aclchk.c:1577 catalog/catalog.c:684 catalog/heap.c:2621 catalog/heap.c:2941 catalog/objectaddress.c:1528 catalog/pg_publication.c:570 commands/analyze.c:388 commands/copy.c:1039 commands/sequence.c:1655 commands/tablecmds.c:7751 commands/tablecmds.c:7929 commands/tablecmds.c:8130 commands/tablecmds.c:8259 commands/tablecmds.c:8413 commands/tablecmds.c:8507 commands/tablecmds.c:8610 commands/tablecmds.c:8776 commands/tablecmds.c:8806 -#: commands/tablecmds.c:8961 commands/tablecmds.c:9064 commands/tablecmds.c:9198 commands/tablecmds.c:9311 commands/tablecmds.c:14397 commands/tablecmds.c:14600 commands/tablecmds.c:14761 commands/tablecmds.c:15989 commands/tablecmds.c:18756 commands/trigger.c:948 parser/analyze.c:2575 parser/parse_relation.c:749 parser/parse_target.c:1070 parser/parse_type.c:144 parser/parse_utilcmd.c:3662 parser/parse_utilcmd.c:3702 parser/parse_utilcmd.c:3744 -#: statistics/attribute_stats.c:212 statistics/attribute_stats.c:955 utils/adt/acl.c:2938 utils/adt/ruleutils.c:2858 +#: catalog/aclchk.c:1577 catalog/catalog.c:684 catalog/heap.c:2638 catalog/heap.c:2960 catalog/objectaddress.c:1528 catalog/pg_publication.c:570 commands/analyze.c:388 commands/copy.c:1040 commands/sequence.c:1655 commands/tablecmds.c:7761 commands/tablecmds.c:7939 commands/tablecmds.c:8140 commands/tablecmds.c:8269 commands/tablecmds.c:8423 commands/tablecmds.c:8517 commands/tablecmds.c:8620 commands/tablecmds.c:8786 commands/tablecmds.c:8816 +#: commands/tablecmds.c:8971 commands/tablecmds.c:9074 commands/tablecmds.c:9208 commands/tablecmds.c:9321 commands/tablecmds.c:14418 commands/tablecmds.c:14621 commands/tablecmds.c:14782 commands/tablecmds.c:16010 commands/tablecmds.c:18777 commands/trigger.c:948 parser/analyze.c:2591 parser/parse_relation.c:781 parser/parse_target.c:1070 parser/parse_type.c:144 parser/parse_utilcmd.c:3671 parser/parse_utilcmd.c:3711 parser/parse_utilcmd.c:3753 +#: statistics/attribute_stats.c:212 statistics/attribute_stats.c:981 utils/adt/acl.c:2938 utils/adt/ruleutils.c:2858 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の列\"%1$s\"は存在しません" @@ -3937,12 +3961,12 @@ msgstr "リレーション\"%2$s\"の列\"%1$s\"は存在しません" msgid "\"%s\" is an index" msgstr "\"%s\"はインデックスです" -#: catalog/aclchk.c:1829 commands/tablecmds.c:16146 commands/tablecmds.c:19675 +#: catalog/aclchk.c:1829 commands/tablecmds.c:16167 commands/tablecmds.c:19696 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\"は複合型です" -#: catalog/aclchk.c:1837 catalog/objectaddress.c:1368 commands/tablecmds.c:266 commands/tablecmds.c:19639 utils/adt/acl.c:2122 utils/adt/acl.c:2152 utils/adt/acl.c:2185 utils/adt/acl.c:2221 utils/adt/acl.c:2252 utils/adt/acl.c:2283 +#: catalog/aclchk.c:1837 catalog/objectaddress.c:1368 commands/tablecmds.c:266 commands/tablecmds.c:19660 utils/adt/acl.c:2122 utils/adt/acl.c:2152 utils/adt/acl.c:2185 utils/adt/acl.c:2221 utils/adt/acl.c:2252 utils/adt/acl.c:2283 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\"はシーケンスではありません" @@ -4394,7 +4418,7 @@ msgstr "%s()を呼び出すにはスーパーユーザーである必要があ msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() はシステムカタログでのみ使用できます" -#: catalog/catalog.c:676 parser/parse_utilcmd.c:2447 +#: catalog/catalog.c:676 parser/parse_utilcmd.c:2451 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "インデックス\"%s\"はテーブル\"%s\"には属していません" @@ -4477,7 +4501,7 @@ msgstr "%s型の定数をここで使用することはできません" msgid "transition table \"%s\" cannot be referenced in a persistent object" msgstr "遷移テーブル\"%s\"は永続オブジェクトからは参照できません" -#: catalog/dependency.c:2390 parser/parse_relation.c:3513 parser/parse_relation.c:3523 statistics/attribute_stats.c:224 statistics/attribute_stats.c:596 statistics/attribute_stats.c:604 +#: catalog/dependency.c:2390 parser/parse_relation.c:3545 parser/parse_relation.c:3555 statistics/attribute_stats.c:224 statistics/attribute_stats.c:613 statistics/attribute_stats.c:621 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の列\"%1$d\"は存在しません" @@ -4492,12 +4516,12 @@ msgstr "\"%s.%s\"を作成する権限がありません" msgid "System catalog modifications are currently disallowed." msgstr "システムカタログの更新は現在禁止されています" -#: catalog/heap.c:463 commands/tablecmds.c:2562 commands/tablecmds.c:3014 commands/tablecmds.c:7361 +#: catalog/heap.c:463 commands/tablecmds.c:2572 commands/tablecmds.c:3024 commands/tablecmds.c:7371 #, c-format msgid "tables can have at most %d columns" msgstr "テーブルは最大で%d列までしか持てません" -#: catalog/heap.c:481 commands/tablecmds.c:7663 +#: catalog/heap.c:481 commands/tablecmds.c:7673 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "列名\"%s\"はシステム用の列名に使われています" @@ -4508,228 +4532,228 @@ msgid "column name \"%s\" specified more than once" msgstr "列名\"%s\"が複数指定されました" #. translator: first %s is an integer not a name -#: catalog/heap.c:575 +#: catalog/heap.c:579 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "パーティションキー列%sは疑似型%sです" -#: catalog/heap.c:580 +#: catalog/heap.c:584 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "列\"%s\"は疑似型%sです" -#: catalog/heap.c:595 +#: catalog/heap.c:599 #, c-format msgid "virtual generated column \"%s\" cannot have a domain type" msgstr "仮想生成列\"%s\"ではドメイン型は使用できません" -#: catalog/heap.c:622 +#: catalog/heap.c:626 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "複合型 %s がそれ自身のメンバーになることはできません" -#: catalog/heap.c:673 +#: catalog/heap.c:687 #, c-format msgid "virtual generated column \"%s\" cannot have a user-defined type" msgstr "仮想生成列\"%s\"ではユーザー定義関数は使用できません" -#: catalog/heap.c:674 catalog/heap.c:3295 +#: catalog/heap.c:688 catalog/heap.c:3314 #, c-format msgid "Virtual generated columns that make use of user-defined types are not yet supported." msgstr "ユーザー定義型を使用した仮想生成列は未サポートです。" #. translator: first %s is an integer not a name -#: catalog/heap.c:686 +#: catalog/heap.c:700 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "照合可能な型 %2$s のパーティションキー列%1$sのための照合順序が見つかりませんでした" -#: catalog/heap.c:692 commands/createas.c:200 commands/createas.c:512 +#: catalog/heap.c:706 commands/createas.c:200 commands/createas.c:512 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "照合可能な型 %2$s を持つ列\"%1$s\"のための照合順序を決定できませんでした" -#: catalog/heap.c:1179 catalog/index.c:901 commands/createas.c:408 commands/tablecmds.c:4296 +#: catalog/heap.c:1196 catalog/index.c:901 commands/createas.c:408 commands/tablecmds.c:4306 #, c-format msgid "relation \"%s\" already exists" msgstr "リレーション\"%s\"はすでに存在します" -#: catalog/heap.c:1195 catalog/pg_type.c:434 catalog/pg_type.c:805 catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 commands/typecmds.c:758 commands/typecmds.c:1213 commands/typecmds.c:1439 commands/typecmds.c:1619 commands/typecmds.c:2594 +#: catalog/heap.c:1212 catalog/pg_type.c:434 catalog/pg_type.c:805 catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 commands/typecmds.c:758 commands/typecmds.c:1213 commands/typecmds.c:1439 commands/typecmds.c:1626 commands/typecmds.c:2601 #, c-format msgid "type \"%s\" already exists" msgstr "型\"%s\"はすでに存在します" -#: catalog/heap.c:1196 +#: catalog/heap.c:1213 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "リレーションは同じ名前の関連する型を持ちます。このため既存の型と競合しない名前である必要があります。" -#: catalog/heap.c:1236 +#: catalog/heap.c:1253 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にTOASTのrelfilenumberの値が設定されていません" -#: catalog/heap.c:1247 +#: catalog/heap.c:1264 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_classのヒープOIDが設定されていません" -#: catalog/heap.c:1257 +#: catalog/heap.c:1274 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にrelfilenumberの値が設定されていません" -#: catalog/heap.c:2202 +#: catalog/heap.c:2219 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"に NO INHERIT 制約は追加できません" -#: catalog/heap.c:2525 +#: catalog/heap.c:2542 #, c-format msgid "check constraint \"%s\" already exists" msgstr "検査制約\"%s\"はすでに存在します" -#: catalog/heap.c:2626 catalog/heap.c:2947 +#: catalog/heap.c:2643 catalog/heap.c:2966 #, c-format msgid "cannot add not-null constraint on system column \"%s\"" msgstr "システム列\"%s\"に対して非NULL制約を追加することはできません" -#: catalog/heap.c:2654 catalog/heap.c:2780 catalog/heap.c:3031 catalog/index.c:915 catalog/pg_constraint.c:1025 commands/tablecmds.c:9821 +#: catalog/heap.c:2671 catalog/heap.c:2797 catalog/heap.c:3050 catalog/index.c:915 catalog/pg_constraint.c:1025 commands/tablecmds.c:9831 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "すでに制約\"%s\"はリレーション\"%s\"に存在します" -#: catalog/heap.c:2787 +#: catalog/heap.c:2804 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承されていない制約と競合します" -#: catalog/heap.c:2798 +#: catalog/heap.c:2815 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承された制約と競合します" -#: catalog/heap.c:2808 +#: catalog/heap.c:2825 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の NOT VALID 制約と競合します" -#: catalog/heap.c:2820 +#: catalog/heap.c:2837 #, c-format msgid "constraint \"%s\" conflicts with NOT ENFORCED constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の \\NOT ENFORCED制約と競合します" -#: catalog/heap.c:2825 +#: catalog/heap.c:2842 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "継承された定義により制約\"%s\"をマージしています" -#: catalog/heap.c:2849 catalog/pg_constraint.c:803 catalog/pg_constraint.c:1154 commands/tablecmds.c:3179 commands/tablecmds.c:3499 commands/tablecmds.c:7286 commands/tablecmds.c:7967 commands/tablecmds.c:17583 commands/tablecmds.c:17765 +#: catalog/heap.c:2866 catalog/pg_constraint.c:803 catalog/pg_constraint.c:1154 commands/tablecmds.c:3189 commands/tablecmds.c:3509 commands/tablecmds.c:7296 commands/tablecmds.c:7977 commands/tablecmds.c:17604 commands/tablecmds.c:17786 #, c-format msgid "too many inheritance parents" msgstr "継承の親テーブルが多すぎます" -#: catalog/heap.c:2966 parser/parse_utilcmd.c:2655 +#: catalog/heap.c:2985 parser/parse_utilcmd.c:2659 #, c-format msgid "conflicting NO INHERIT declaration for not-null constraint on column \"%s\"" msgstr "列\"%s\"に対する非NULL制約にNO INHERIT宣言が競合しています" -#: catalog/heap.c:2980 +#: catalog/heap.c:2999 #, c-format msgid "conflicting not-null constraint names \"%s\" and \"%s\"" msgstr "非NULL制約の名前\"%s\"と\"%s\"が競合しています" -#: catalog/heap.c:3010 +#: catalog/heap.c:3029 #, c-format msgid "cannot define not-null constraint with NO INHERIT on column \"%s\"" msgstr "列\"%s\"に対して非NULL制約をNO INHERITと同時に定義することはできません" -#: catalog/heap.c:3012 +#: catalog/heap.c:3031 #, c-format msgid "The column has an inherited not-null constraint." msgstr "この列には継承された非NULL制約が存在します。" -#: catalog/heap.c:3202 +#: catalog/heap.c:3221 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "生成カラム\"%s\"はカラム生成式中では使用できません" -#: catalog/heap.c:3204 +#: catalog/heap.c:3223 #, c-format msgid "A generated column cannot reference another generated column." msgstr "生成カラムは他の生成カラムを参照できません。" -#: catalog/heap.c:3210 +#: catalog/heap.c:3229 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "列生成式内では行全体参照は使用できません" -#: catalog/heap.c:3211 +#: catalog/heap.c:3230 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "これは生成列を自身の値に依存させることにつながります。" -#: catalog/heap.c:3278 +#: catalog/heap.c:3297 #, c-format msgid "generation expression uses user-defined function" msgstr "生成式でユーザー定義関数が使用されています" -#: catalog/heap.c:3279 +#: catalog/heap.c:3298 #, c-format msgid "Virtual generated columns that make use of user-defined functions are not yet supported." msgstr "ユーザー定義関数を使用した仮想生成列は未サポートです。" -#: catalog/heap.c:3294 +#: catalog/heap.c:3313 #, c-format msgid "generation expression uses user-defined type" msgstr "生成式でユーザー定義型が使用されています" -#: catalog/heap.c:3346 +#: catalog/heap.c:3365 #, c-format msgid "generation expression is not immutable" msgstr "生成式は不変ではありません" -#: catalog/heap.c:3378 rewrite/rewriteHandler.c:1288 +#: catalog/heap.c:3397 rewrite/rewriteHandler.c:1321 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "列\"%s\"の型は%sですが、デフォルト式の型は%sです" -#: catalog/heap.c:3383 commands/prepare.c:334 parser/analyze.c:2906 parser/parse_target.c:595 parser/parse_target.c:885 parser/parse_target.c:895 rewrite/rewriteHandler.c:1293 +#: catalog/heap.c:3402 commands/prepare.c:334 parser/analyze.c:2922 parser/parse_target.c:595 parser/parse_target.c:885 parser/parse_target.c:895 rewrite/rewriteHandler.c:1326 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "式を書き換えるかキャストする必要があります。" -#: catalog/heap.c:3430 +#: catalog/heap.c:3449 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "検査制約ではテーブル\"%s\"のみを参照することができます" -#: catalog/heap.c:3736 +#: catalog/heap.c:3755 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "ON COMMITと外部キーの組み合わせはサポートされていません" -#: catalog/heap.c:3737 +#: catalog/heap.c:3756 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "テーブル\"%s\"は\"%s\"を参照します。しかし、これらのON COMMIT設定は同一ではありません。" -#: catalog/heap.c:3742 +#: catalog/heap.c:3761 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "外部キー制約で参照されているテーブルを削除できません" -#: catalog/heap.c:3743 +#: catalog/heap.c:3762 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "テーブル\"%s\"は\"%s\"を参照します。" -#: catalog/heap.c:3745 +#: catalog/heap.c:3764 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "同時にテーブル\"%s\"がtruncateされました。TRUNCATE ... CASCADEを使用してください。" -#: catalog/index.c:220 parser/parse_utilcmd.c:2352 +#: catalog/index.c:220 parser/parse_utilcmd.c:2356 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "テーブル\"%s\"に複数のプライマリキーを持たせることはできません" @@ -4799,12 +4823,12 @@ msgstr "DROP INDEX CONCURRENTLYはトランザクション内で最初の操作 msgid "cannot reindex temporary tables of other sessions" msgstr "他のセッションの一時テーブルはインデクス再構築できません" -#: catalog/index.c:3740 commands/indexcmds.c:3791 +#: catalog/index.c:3740 commands/indexcmds.c:3793 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "TOASTテーブルの無効なインデックスの再作成はできません" -#: catalog/index.c:3756 commands/indexcmds.c:3669 commands/indexcmds.c:3815 commands/tablecmds.c:3703 +#: catalog/index.c:3756 commands/indexcmds.c:3671 commands/indexcmds.c:3817 commands/tablecmds.c:3713 #, c-format msgid "cannot move system relation \"%s\"" msgstr "システムリレーション\"%s\"を移動できません" @@ -4839,12 +4863,12 @@ msgstr "リレーション\"%s.%s\"のロックを取得できませんでした msgid "could not obtain lock on relation \"%s\"" msgstr "リレーション\"%s\"のロックを取得できませんでした" -#: catalog/namespace.c:633 parser/parse_relation.c:1447 +#: catalog/namespace.c:633 parser/parse_relation.c:1479 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "リレーション\"%s.%s\"は存在しません" -#: catalog/namespace.c:638 parser/parse_relation.c:1460 parser/parse_relation.c:1468 utils/adt/regproc.c:913 +#: catalog/namespace.c:638 parser/parse_relation.c:1492 parser/parse_relation.c:1500 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "リレーション\"%s\"は存在しません" @@ -4914,7 +4938,7 @@ msgstr "一時スキーマへ、または一時スキーマからオブジェク msgid "cannot move objects into or out of TOAST schema" msgstr "TOASTスキーマへ、またはTOASTスキーマからオブジェクトを移動できません" -#: catalog/namespace.c:3547 commands/schemacmds.c:264 commands/schemacmds.c:344 commands/tablecmds.c:1464 utils/adt/regproc.c:1688 +#: catalog/namespace.c:3547 commands/schemacmds.c:264 commands/schemacmds.c:344 commands/tablecmds.c:1474 utils/adt/regproc.c:1688 #, c-format msgid "schema \"%s\" does not exist" msgstr "スキーマ\"%s\"は存在しません" @@ -4949,22 +4973,22 @@ msgstr "リカバリ中は一時テーブルを作成できません" msgid "cannot create temporary tables during a parallel operation" msgstr "並行処理中は一時テーブルを作成できません" -#: catalog/objectaddress.c:1376 commands/policy.c:93 commands/policy.c:373 commands/tablecmds.c:260 commands/tablecmds.c:302 commands/tablecmds.c:2387 commands/tablecmds.c:14535 +#: catalog/objectaddress.c:1376 commands/policy.c:93 commands/policy.c:373 commands/tablecmds.c:260 commands/tablecmds.c:302 commands/tablecmds.c:2397 commands/tablecmds.c:14556 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\"はテーブルではありません" -#: catalog/objectaddress.c:1383 commands/tablecmds.c:272 commands/tablecmds.c:19644 commands/view.c:113 +#: catalog/objectaddress.c:1383 commands/tablecmds.c:272 commands/tablecmds.c:19665 commands/view.c:113 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\"はビューではありません" -#: catalog/objectaddress.c:1390 commands/matview.c:201 commands/tablecmds.c:278 commands/tablecmds.c:19649 +#: catalog/objectaddress.c:1390 commands/matview.c:201 commands/tablecmds.c:278 commands/tablecmds.c:19670 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\"は実体化ビューではありません" -#: catalog/objectaddress.c:1397 commands/tablecmds.c:296 commands/tablecmds.c:19654 +#: catalog/objectaddress.c:1397 commands/tablecmds.c:296 commands/tablecmds.c:19675 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\"は外部テーブルではありません" @@ -4984,7 +5008,7 @@ msgstr "列名を修飾する必要があります" msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の列\"%1$s\"に対するデフォルト値が存在しません" -#: catalog/objectaddress.c:1623 commands/functioncmds.c:132 commands/tablecmds.c:288 commands/typecmds.c:278 commands/typecmds.c:3842 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 utils/adt/acl.c:4575 +#: catalog/objectaddress.c:1623 commands/functioncmds.c:132 commands/tablecmds.c:288 commands/typecmds.c:278 commands/typecmds.c:3849 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 utils/adt/acl.c:4575 #, c-format msgid "type \"%s\" does not exist" msgstr "型\"%s\"は存在しません" @@ -5009,7 +5033,7 @@ msgstr "%4$s の関数 %1$d (%2$s, %3$s) がありません" msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "ユーザー\"%s\"に対するユーザーマッピングがサーバー\"%s\"には存在しません" -#: catalog/objectaddress.c:1839 commands/foreigncmds.c:441 commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 foreign/foreign.c:714 +#: catalog/objectaddress.c:1839 commands/foreigncmds.c:441 commands/foreigncmds.c:1009 commands/foreigncmds.c:1372 foreign/foreign.c:714 #, c-format msgid "server \"%s\" does not exist" msgstr "サーバー\"%s\"は存在しません" @@ -5247,7 +5271,7 @@ msgstr "テキスト検索設定%s" msgid "role %s" msgstr "ロール%s" -#: catalog/objectaddress.c:3665 catalog/objectaddress.c:5589 +#: catalog/objectaddress.c:3665 #, c-format msgid "membership of role %s in role %s" msgstr "ロール%sのロール%sへの所属" @@ -5470,7 +5494,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:3057 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3105 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "集約の前進と反転の遷移関数のSTRICT属性は一致している必要があります" @@ -5545,8 +5569,8 @@ msgstr "\"%s\"は仮説集合集約です。" msgid "cannot change number of direct arguments of an aggregate function" msgstr "集約関数の直接引数の数は変更できません" -#: catalog/pg_aggregate.c:859 commands/functioncmds.c:701 commands/typecmds.c:2023 commands/typecmds.c:2069 commands/typecmds.c:2121 commands/typecmds.c:2158 commands/typecmds.c:2192 commands/typecmds.c:2226 commands/typecmds.c:2260 commands/typecmds.c:2289 commands/typecmds.c:2376 commands/typecmds.c:2418 parser/parse_func.c:417 parser/parse_func.c:448 parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 parser/parse_func.c:631 -#: parser/parse_func.c:2172 parser/parse_func.c:2445 +#: catalog/pg_aggregate.c:859 commands/functioncmds.c:701 commands/typecmds.c:2030 commands/typecmds.c:2076 commands/typecmds.c:2128 commands/typecmds.c:2165 commands/typecmds.c:2199 commands/typecmds.c:2233 commands/typecmds.c:2267 commands/typecmds.c:2296 commands/typecmds.c:2383 commands/typecmds.c:2425 parser/parse_func.c:417 parser/parse_func.c:448 parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 parser/parse_func.c:631 +#: parser/parse_func.c:2170 parser/parse_func.c:2443 #, c-format msgid "function %s does not exist" msgstr "関数%sは存在しません" @@ -5641,22 +5665,22 @@ msgstr "照合順序\"%s\"はすでに存在します" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "エンコーディング\"%2$s\"の照合順序\"%1$s\"はすでに存在します" -#: catalog/pg_constraint.c:764 commands/tablecmds.c:7952 +#: catalog/pg_constraint.c:764 commands/tablecmds.c:7962 #, c-format msgid "cannot change NO INHERIT status of NOT NULL constraint \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"の非NULL制約\"%1$s\"のNO INHERIT設定は変更できません" -#: catalog/pg_constraint.c:766 commands/tablecmds.c:9584 +#: catalog/pg_constraint.c:766 commands/tablecmds.c:9594 #, c-format msgid "You might need to make the existing constraint inheritable using %s." msgstr "%s を用いて既存の制約を継承可能にする必要があるかもしれません。" -#: catalog/pg_constraint.c:776 commands/tablecmds.c:8301 +#: catalog/pg_constraint.c:776 commands/tablecmds.c:8311 #, c-format msgid "incompatible NOT VALID constraint \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"上の NOT VALID 制約\"%1$s\"は非互換です" -#: catalog/pg_constraint.c:778 commands/tablecmds.c:8303 commands/tablecmds.c:9596 +#: catalog/pg_constraint.c:778 commands/tablecmds.c:8313 commands/tablecmds.c:9606 #, c-format msgid "You might need to validate it using %s." msgstr "%s を用いてこの制約を検証する必要があるかもしれません。" @@ -5706,31 +5730,41 @@ msgstr "変換\"%s\"はすでに存在します" msgid "default conversion for %s to %s already exists" msgstr "%sから%sへのデフォルトの変換はすでに存在します" -#: catalog/pg_depend.c:225 commands/extension.c:3818 +#: catalog/pg_depend.c:236 commands/extension.c:3818 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%sはすでに機能拡張\"%s\"のメンバです" -#: catalog/pg_depend.c:232 catalog/pg_depend.c:283 commands/extension.c:3858 +#: catalog/pg_depend.c:243 catalog/pg_depend.c:294 commands/extension.c:3858 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s は機能拡張\"%s\"のメンバではありません" -#: catalog/pg_depend.c:235 +#: catalog/pg_depend.c:246 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "機能拡張は自身が所有していないオブジェクトを置き換えることができません。" -#: catalog/pg_depend.c:286 +#: catalog/pg_depend.c:297 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "機能拡張はCREATE ... IF NOT EXISTSを自身がすでに所有しているオブジェクトと競合するオブジェクトの生成をスキップするためにのみ使用することができます。" -#: catalog/pg_depend.c:649 +#: catalog/pg_depend.c:667 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "システムオブジェクトであるため、%sの依存関係を削除できません。" +#: catalog/pg_depend.c:812 +#, c-format +msgid "referenced %s was concurrently dropped" +msgstr "依存先の %s が並行して削除されました" + +#: catalog/pg_depend.c:844 +#, c-format +msgid "referenced relation was concurrently dropped" +msgstr "依存先のリレーションが並行して削除されました" + #: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 #, c-format msgid "invalid enum label \"%s\"" @@ -5776,7 +5810,7 @@ msgstr "パーティション\"%s\"を取り外せません" msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "このパーティションは今現在取り外し中であるか取り外し処理が未完了の状態です。" -#: catalog/pg_inherits.c:595 commands/tablecmds.c:4916 commands/tablecmds.c:17891 +#: catalog/pg_inherits.c:595 commands/tablecmds.c:4926 commands/tablecmds.c:17912 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "ALTER TABLE ... DETACH PARTITION ... FINALIZE を実行して保留中の取り外し処理を完了させてください。" @@ -5881,7 +5915,7 @@ msgstr "否定演算子 %s はすでに演算子 %u の否定子です" msgid "parameter ACL \"%s\" does not exist" msgstr "パラメータACL \"%s\"は存在しません" -#: catalog/pg_proc.c:158 parser/parse_func.c:2234 +#: catalog/pg_proc.c:158 parser/parse_func.c:2232 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" @@ -6143,7 +6177,7 @@ msgstr "値渡し型の場合、内部サイズ%dは不正です" msgid "alignment \"%c\" is invalid for variable-length type" msgstr "可変長型の場合、アラインメント\"%c\"は不正です" -#: catalog/pg_type.c:325 commands/typecmds.c:4362 +#: catalog/pg_type.c:325 commands/typecmds.c:4369 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "固定長型の場合はPLAIN格納方式でなければなりません" @@ -6158,7 +6192,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:549 storage/buffer/bufmgr.c:7338 +#: catalog/storage.c:549 storage/buffer/bufmgr.c:7347 #, c-format msgid "invalid page in block %u of relation \"%s\"" msgstr "リレーション\"%2$s\"のブロック%1$uに不正なページ" @@ -6263,7 +6297,7 @@ msgstr "イベントトリガ\"%s\"はすでに存在します" msgid "foreign-data wrapper \"%s\" already exists" msgstr "外部データラッパー\"%s\"はすでに存在します" -#: commands/alter.c:89 commands/foreigncmds.c:895 +#: commands/alter.c:89 commands/foreigncmds.c:900 #, c-format msgid "server \"%s\" already exists" msgstr "サーバー\"%s\"はすでに存在します" @@ -6278,7 +6312,7 @@ msgstr "言語\"%s\"はすでに存在します" msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"はすでに存在します" -#: commands/alter.c:98 commands/subscriptioncmds.c:629 +#: commands/alter.c:98 commands/subscriptioncmds.c:655 #, c-format msgid "subscription \"%s\" already exists" msgstr "サブスクリプション\"%s\"はすでに存在します" @@ -6318,12 +6352,12 @@ msgstr "テキスト検索設定\"%s\"はすでにスキーマ\"%s\"存在しま msgid "must be superuser to rename %s" msgstr "%sの名前を変更するにはスーパーユーザーである必要があります" -#: commands/alter.c:256 commands/subscriptioncmds.c:608 commands/subscriptioncmds.c:1147 commands/subscriptioncmds.c:1231 commands/subscriptioncmds.c:1991 +#: commands/alter.c:256 commands/subscriptioncmds.c:634 commands/subscriptioncmds.c:1173 commands/subscriptioncmds.c:1257 commands/subscriptioncmds.c:2019 #, c-format msgid "password_required=false is superuser-only" msgstr "password_required=falseはスーパーユーザーのみ可能です" -#: commands/alter.c:257 commands/subscriptioncmds.c:609 commands/subscriptioncmds.c:1148 commands/subscriptioncmds.c:1232 commands/subscriptioncmds.c:1992 +#: commands/alter.c:257 commands/subscriptioncmds.c:635 commands/subscriptioncmds.c:1174 commands/subscriptioncmds.c:1258 commands/subscriptioncmds.c:2020 #, 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に設定されたサブスクリプションはスーパーユーザのみ作成と変更が可能です。" @@ -6453,7 +6487,7 @@ msgstr "PID %d のサーバープロセスは、この中で最も古いトラ msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "このプロセスが現在のトランザクションを終了するまで NOTYFY キューを空にすることはできません" -#: commands/cluster.c:127 commands/dbcommands.c:2356 commands/explain_state.c:165 commands/indexcmds.c:2846 commands/vacuum.c:234 commands/vacuum.c:308 +#: commands/cluster.c:127 commands/dbcommands.c:2356 commands/explain_state.c:165 commands/indexcmds.c:2848 commands/vacuum.c:234 commands/vacuum.c:308 #, c-format msgid "unrecognized %s option \"%s\"" msgstr "%s のオプション\"%s\"が認識できません" @@ -6468,7 +6502,7 @@ msgstr "他のセッションの一時テーブルをクラスタ化できませ msgid "there is no previously clustered index for table \"%s\"" msgstr "テーブル\"%s\"には事前にクラスタ化されたインデックスはありません" -#: commands/cluster.c:190 commands/tablecmds.c:16447 commands/tablecmds.c:18513 +#: commands/cluster.c:190 commands/tablecmds.c:16468 commands/tablecmds.c:18534 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"にはインデックス\"%1$s\"は存在しません" @@ -6483,7 +6517,7 @@ msgstr "共有カタログをクラスタ化できません" msgid "cannot vacuum temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対してはVACUUMを実行できません" -#: commands/cluster.c:507 commands/tablecmds.c:18523 +#: commands/cluster.c:507 commands/tablecmds.c:18544 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\"はテーブル\"%s\"のインデックスではありません" @@ -6547,8 +6581,8 @@ msgstr "\"%s\"のクラスタ化を行う権限がありません、スキップ msgid "collation attribute \"%s\" not recognized" msgstr "照合順序の属性\"%s\"が認識できません" -#: commands/collationcmds.c:123 commands/collationcmds.c:129 commands/define.c:375 commands/tablecmds.c:8394 replication/pgoutput/pgoutput.c:321 replication/pgoutput/pgoutput.c:344 replication/pgoutput/pgoutput.c:362 replication/pgoutput/pgoutput.c:372 replication/pgoutput/pgoutput.c:382 replication/pgoutput/pgoutput.c:392 replication/pgoutput/pgoutput.c:404 replication/walsender.c:1137 replication/walsender.c:1159 replication/walsender.c:1169 -#: replication/walsender.c:1178 replication/walsender.c:1420 replication/walsender.c:1429 +#: commands/collationcmds.c:123 commands/collationcmds.c:129 commands/define.c:375 commands/tablecmds.c:8404 replication/pgoutput/pgoutput.c:321 replication/pgoutput/pgoutput.c:344 replication/pgoutput/pgoutput.c:362 replication/pgoutput/pgoutput.c:372 replication/pgoutput/pgoutput.c:382 replication/pgoutput/pgoutput.c:392 replication/pgoutput/pgoutput.c:404 replication/walsender.c:1159 replication/walsender.c:1181 replication/walsender.c:1191 +#: replication/walsender.c:1200 replication/walsender.c:1442 replication/walsender.c:1451 #, c-format msgid "conflicting or redundant options" msgstr "競合するオプション、あるいは余計なオプションがあります" @@ -6617,7 +6651,7 @@ msgstr "デフォルト照合順序のバーションはリフレッシュでき #. translator: %s is an SQL command #. translator: %s is an SQL ALTER command -#: commands/collationcmds.c:443 commands/subscriptioncmds.c:1445 commands/tablecmds.c:8146 commands/tablecmds.c:8156 commands/tablecmds.c:8158 commands/tablecmds.c:16149 commands/tablecmds.c:19677 commands/tablecmds.c:19698 commands/typecmds.c:3786 commands/typecmds.c:3871 commands/typecmds.c:4225 +#: commands/collationcmds.c:443 commands/subscriptioncmds.c:1471 commands/tablecmds.c:8156 commands/tablecmds.c:8166 commands/tablecmds.c:8168 commands/tablecmds.c:16170 commands/tablecmds.c:19698 commands/tablecmds.c:19719 commands/typecmds.c:3793 commands/typecmds.c:3878 commands/typecmds.c:4232 #, c-format msgid "Use %s instead." msgstr "代わりに%sを使用してください" @@ -6737,176 +6771,176 @@ msgstr "COPYでファイルへの出力を行う権限がありません" msgid "Only roles with privileges of the \"%s\" role may COPY to a file." msgstr "\"%s\"ロールの権限を持つロールのみがCOPYによるファイルへの出力を行うことができます。" -#: commands/copy.c:182 +#: commands/copy.c:183 #, c-format msgid "generated columns are not supported in COPY FROM WHERE conditions" msgstr "生成列は COPY FROM の WHERE 条件ではサポートされていません" -#: commands/copy.c:183 commands/tablecmds.c:14418 commands/tablecmds.c:19824 commands/tablecmds.c:19906 commands/trigger.c:660 rewrite/rewriteHandler.c:952 rewrite/rewriteHandler.c:987 +#: commands/copy.c:184 commands/tablecmds.c:14439 commands/tablecmds.c:19845 commands/tablecmds.c:19927 commands/trigger.c:660 rewrite/rewriteHandler.c:985 rewrite/rewriteHandler.c:1020 #, c-format msgid "Column \"%s\" is a generated column." msgstr "列\"%s\"は生成カラムです。" -#: commands/copy.c:232 +#: commands/copy.c:233 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM で行レベルセキュリティはサポートされていません" -#: commands/copy.c:233 +#: commands/copy.c:234 #, c-format msgid "Use INSERT statements instead." msgstr "代わりにINSERTを文使用してください。" -#: commands/copy.c:414 +#: commands/copy.c:415 #, c-format msgid "cannot use \"%s\" with HEADER in COPY TO" msgstr "COPY TO の HEADERで\"%s\"は使用できません" -#: commands/copy.c:423 +#: commands/copy.c:424 #, c-format msgid "%s requires a Boolean value or \"match\"" msgstr "パラメータ\"%s\"はBoolean値または\"match\"のみを取ります" #. translator: first %s is the name of a COPY option, e.g. ON_ERROR, #. second %s is a COPY with direction, e.g. COPY TO -#: commands/copy.c:441 commands/copy.c:857 commands/copy.c:873 commands/copy.c:890 commands/copy.c:916 commands/copy.c:926 +#: commands/copy.c:442 commands/copy.c:858 commands/copy.c:874 commands/copy.c:891 commands/copy.c:917 commands/copy.c:927 #, c-format msgid "COPY %s cannot be used with %s" msgstr "COPY %s は %s と同時には使えません" #. translator: first %s is the name of a COPY option, e.g. ON_ERROR -#: commands/copy.c:455 commands/copy.c:513 +#: commands/copy.c:456 commands/copy.c:514 #, c-format msgid "COPY %s \"%s\" not recognized" msgstr "COPY %s \"%s\"を認識できません" -#: commands/copy.c:475 commands/define.c:73 commands/define.c:84 commands/define.c:178 commands/define.c:196 commands/define.c:211 commands/define.c:229 +#: commands/copy.c:476 commands/define.c:73 commands/define.c:84 commands/define.c:178 commands/define.c:196 commands/define.c:211 commands/define.c:229 #, c-format msgid "%s requires a numeric value" msgstr "%sは数値が必要です" -#: commands/copy.c:485 +#: commands/copy.c:486 #, c-format msgid "REJECT_LIMIT (%) must be greater than zero" msgstr "REJECT_LIMIT (%)は0より大きくなければなりません" -#: commands/copy.c:575 +#: commands/copy.c:576 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "COPY フォーマット\"%s\"を認識できません" -#: commands/copy.c:633 commands/copy.c:648 commands/copy.c:663 commands/copy.c:682 +#: commands/copy.c:634 commands/copy.c:649 commands/copy.c:664 commands/copy.c:683 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "オプション\"%s\"の引数は列名のリストでなければなりません" -#: commands/copy.c:694 +#: commands/copy.c:695 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "オプション\"%s\"の引数は有効なエンコーディング名でなければなりません" -#: commands/copy.c:722 commands/dbcommands.c:880 commands/dbcommands.c:2421 +#: commands/copy.c:723 commands/dbcommands.c:880 commands/dbcommands.c:2421 #, c-format msgid "option \"%s\" not recognized" msgstr "タイムゾーン\"%s\"を認識できません" #. translator: %s is the name of a COPY option, e.g. ON_ERROR -#: commands/copy.c:735 commands/copy.c:740 commands/copy.c:745 commands/copy.c:815 +#: commands/copy.c:736 commands/copy.c:741 commands/copy.c:746 commands/copy.c:816 #, c-format msgid "cannot specify %s in BINARY mode" msgstr "BINARYモードでは%sを指定できません" -#: commands/copy.c:767 +#: commands/copy.c:768 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "COPYの区切り文字は単一の1バイト文字でなければなりません" -#: commands/copy.c:774 +#: commands/copy.c:775 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPYの区切り文字は改行や復帰記号とすることができません" -#: commands/copy.c:780 +#: commands/copy.c:781 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPYのNULL表現には改行や復帰記号を使用することはできません" -#: commands/copy.c:790 +#: commands/copy.c:791 #, c-format msgid "COPY default representation cannot use newline or carriage return" msgstr "COPYのデフォルト表現には改行や復帰記号を使用することはできません" -#: commands/copy.c:808 +#: commands/copy.c:809 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "COPYの区切り文字を\"%s\"とすることはできません" #. translator: %s is the name of a COPY option, e.g. ON_ERROR -#: commands/copy.c:822 commands/copy.c:839 commands/copy.c:851 commands/copy.c:866 commands/copy.c:882 +#: commands/copy.c:823 commands/copy.c:840 commands/copy.c:852 commands/copy.c:867 commands/copy.c:883 #, c-format msgid "COPY %s requires CSV mode" msgstr "COPY %s はCSVモードを要求します" -#: commands/copy.c:827 +#: commands/copy.c:828 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "COPYの引用符は単一の1バイト文字でなければなりません" -#: commands/copy.c:832 +#: commands/copy.c:833 #, c-format msgid "COPY delimiter and quote must be different" msgstr "COPYの区切り文字と引用符は異なる文字でなければなりません" -#: commands/copy.c:844 +#: commands/copy.c:845 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "COPYのエスケープは単一の1バイト文字でなければなりません" #. translator: %s is the name of a COPY option, e.g. NULL -#: commands/copy.c:898 commands/copy.c:934 +#: commands/copy.c:899 commands/copy.c:935 #, c-format msgid "COPY delimiter character must not appear in the %s specification" msgstr "COPYの区切り文字は%s指定では使用できません" #. translator: %s is the name of a COPY option, e.g. NULL -#: commands/copy.c:907 commands/copy.c:943 +#: commands/copy.c:908 commands/copy.c:944 #, c-format msgid "CSV quote character must not appear in the %s specification" msgstr "COPYの引用符は%s指定では使用できません" -#: commands/copy.c:952 +#: commands/copy.c:953 #, c-format msgid "NULL specification and DEFAULT specification cannot be the same" msgstr "NULL指定とDEFAULT指定は同じにはできません" -#: commands/copy.c:958 +#: commands/copy.c:959 #, c-format msgid "only ON_ERROR STOP is allowed in BINARY mode" msgstr "BINARYモードではN_ERROR STOPのみ使用可能です" #. translator: first and second %s are the names of COPY option, e.g. #. * ON_ERROR, third is the value of the COPY option, e.g. IGNORE -#: commands/copy.c:965 +#: commands/copy.c:966 #, c-format msgid "COPY %s requires %s to be set to %s" msgstr "COPY %s では %s が %s に設定されている必要があります" -#: commands/copy.c:1027 +#: commands/copy.c:1028 #, c-format msgid "column \"%s\" is a generated column" msgstr "列\"%s\"は生成カラムです" -#: commands/copy.c:1029 +#: commands/copy.c:1030 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "生成カラムはCOPYでは使えません。" -#: commands/copy.c:1044 commands/indexcmds.c:1959 commands/statscmds.c:260 commands/tablecmds.c:2593 commands/tablecmds.c:3101 commands/tablecmds.c:3930 parser/parse_relation.c:3798 parser/parse_relation.c:3808 parser/parse_relation.c:3826 parser/parse_relation.c:3833 parser/parse_relation.c:3847 utils/adt/tsvector_op.c:2857 +#: commands/copy.c:1045 commands/indexcmds.c:1961 commands/statscmds.c:260 commands/tablecmds.c:2603 commands/tablecmds.c:3111 commands/tablecmds.c:3940 parser/parse_relation.c:3830 parser/parse_relation.c:3840 parser/parse_relation.c:3858 parser/parse_relation.c:3865 parser/parse_relation.c:3879 utils/adt/tsvector_op.c:2830 #, c-format msgid "column \"%s\" does not exist" msgstr "列\"%s\"は存在しません" -#: commands/copy.c:1051 commands/tablecmds.c:2619 commands/trigger.c:957 parser/parse_target.c:1086 parser/parse_target.c:1097 +#: commands/copy.c:1052 commands/tablecmds.c:2629 commands/trigger.c:957 parser/parse_target.c:1086 parser/parse_target.c:1097 #, c-format msgid "column \"%s\" specified more than once" msgstr "列\"%s\"が複数指定されました" @@ -7064,7 +7098,7 @@ msgstr "COPYファイルのヘッダが不正です(サイズが不正です)" msgid "could not read from COPY file: %m" msgstr "COPYファイルから読み込めませんでした: %m" -#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 replication/walsender.c:746 replication/walsender.c:772 tcop/postgres.c:369 +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 replication/walsender.c:746 replication/walsender.c:772 tcop/postgres.c:370 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "トランザクションを実行中のクライアント接続で想定外のEOFがありました" @@ -7554,7 +7588,7 @@ msgstr "データベースOID %uはすでにデータベース\"%s\"で使用さ msgid "data directory with the specified OID %u already exists" msgstr "指定されたOID %uのデータディレクトリはすでに存在します" -#: commands/dbcommands.c:1610 commands/dbcommands.c:1625 utils/adt/pg_locale.c:1532 +#: commands/dbcommands.c:1610 commands/dbcommands.c:1625 utils/adt/pg_locale.c:1538 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "符号化方式\"%s\"がロケール\"%s\"に合いません" @@ -7728,12 +7762,12 @@ msgstr "\"%s\"は集約関数です" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "集約関数を削除するにはDROP AGGREGATEを使用してください" -#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:4014 commands/tablecmds.c:4175 commands/tablecmds.c:4227 commands/tablecmds.c:18954 tcop/utility.c:1328 +#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:4024 commands/tablecmds.c:4185 commands/tablecmds.c:4237 commands/tablecmds.c:18975 tcop/utility.c:1328 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "リレーション\"%s\"は存在しません、スキップします" -#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1469 +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1479 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "スキーマ\"%s\"は存在しません、スキップします" @@ -7853,7 +7887,7 @@ msgstr "リレーション\"%2$s\"のルール\"%1$s\"は存在しません、 msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" -#: commands/dropcmds.c:448 commands/foreigncmds.c:1371 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1376 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" @@ -7934,22 +7968,22 @@ msgstr "イベントトリガ\"%s\"の所有者を変更する権限がありま msgid "The owner of an event trigger must be a superuser." msgstr "イベントトリガの所有者はスーパーユーザーでなければなりません" -#: commands/event_trigger.c:1536 +#: commands/event_trigger.c:1544 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%sはsql_dropイベントトリガ関数内でのみ呼び出すことができます" -#: commands/event_trigger.c:1629 commands/event_trigger.c:1650 +#: commands/event_trigger.c:1637 commands/event_trigger.c:1658 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%sはtable_rewriteイベントトリガ関数でのみ呼び出すことができます" -#: commands/event_trigger.c:2063 +#: commands/event_trigger.c:2074 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%sはイベントトリガ関数でのみ呼び出すことができます" -#: commands/explain_state.c:133 commands/explain_state.c:158 replication/walsender.c:1151 +#: commands/explain_state.c:133 commands/explain_state.c:158 replication/walsender.c:1173 #, c-format msgid "unrecognized value for %s option \"%s\": \"%s\"" msgstr "%s のオプション\"%s\"に対する認識できない値: \"%s\"" @@ -8244,7 +8278,7 @@ msgstr "この型のオブジェクトは機能拡張に追加できません" msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "スキーマ\"%s\"を拡張\"%s\"に追加できません。そのスキーマにその拡張が含まれているためです" -#: commands/extension.c:3912 commands/typecmds.c:4041 utils/fmgr/funcapi.c:725 +#: commands/extension.c:3912 commands/typecmds.c:4048 utils/fmgr/funcapi.c:725 #, c-format msgid "could not find multirange type for data type %s" msgstr "データ型%sの複範囲型がありませんでした" @@ -8324,47 +8358,47 @@ msgstr "外部データラッパーを更新するにはスーパーユーザー msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "外部データラッパーのハンドラーを変更すると、既存の外部テーブルの振る舞いが変わることがあります" -#: commands/foreigncmds.c:756 +#: commands/foreigncmds.c:761 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "外部データラッパーのバリデータ(検証用関数)を変更すると、それに依存するオプションが不正になる場合があります" -#: commands/foreigncmds.c:887 +#: commands/foreigncmds.c:892 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "サーバー\"%s\"はすでに存在します、スキップします" -#: commands/foreigncmds.c:1155 +#: commands/foreigncmds.c:1160 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対してすでに存在します、スキップします" -#: commands/foreigncmds.c:1165 +#: commands/foreigncmds.c:1170 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対してすでに存在します" -#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 +#: commands/foreigncmds.c:1270 commands/foreigncmds.c:1390 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対しては存在しません" -#: commands/foreigncmds.c:1390 +#: commands/foreigncmds.c:1395 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対しては存在しません、スキップします" -#: commands/foreigncmds.c:1518 foreign/foreign.c:405 +#: commands/foreigncmds.c:1523 foreign/foreign.c:405 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "外部データラッパー\"%s\"にはハンドラがありません" -#: commands/foreigncmds.c:1524 +#: commands/foreigncmds.c:1529 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "外部データラッパー\"%s\"は IMPORT FOREIGN SCHEMA をサポートしていません" -#: commands/foreigncmds.c:1626 +#: commands/foreigncmds.c:1631 #, c-format msgid "importing foreign table \"%s\"" msgstr "外部テーブル\"%s\"をインポートします" @@ -8760,12 +8794,12 @@ msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENT msgid "cannot create indexes on temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対するインデックスを作成できません" -#: commands/indexcmds.c:786 commands/tablecmds.c:892 commands/tablespace.c:1178 +#: commands/indexcmds.c:786 commands/tablecmds.c:893 commands/tablespace.c:1178 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "パーティション親リレーションにはデフォルトテーブル空間は指定できません" -#: commands/indexcmds.c:818 commands/tablecmds.c:923 commands/tablecmds.c:3710 +#: commands/indexcmds.c:818 commands/tablecmds.c:924 commands/tablecmds.c:3720 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "共有リレーションのみをpg_globalテーブル空間に格納することができます" @@ -8810,12 +8844,12 @@ msgstr "パーティションキー定義では %s 制約はサポートして msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s 制約はパーティションキーが式を含む場合は使用できません" -#: commands/indexcmds.c:1056 commands/indexcmds.c:2469 commands/indexcmds.c:2488 executor/execReplication.c:329 parser/parse_cte.c:303 parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1410 utils/adt/array_userfuncs.c:1553 utils/adt/arrayfuncs.c:3870 utils/adt/arrayfuncs.c:4425 utils/adt/arrayfuncs.c:6446 utils/adt/rowtypes.c:1220 +#: commands/indexcmds.c:1056 commands/indexcmds.c:2471 commands/indexcmds.c:2490 executor/execReplication.c:329 parser/parse_cte.c:303 parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1419 utils/adt/array_userfuncs.c:1562 utils/adt/arrayfuncs.c:3870 utils/adt/arrayfuncs.c:4425 utils/adt/arrayfuncs.c:6453 utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" msgstr "型%sの等価演算子を特定できませんでした" -#: commands/indexcmds.c:1057 commands/indexcmds.c:2491 +#: commands/indexcmds.c:1057 commands/indexcmds.c:2493 #, c-format msgid "There is no suitable operator in operator family \"%s\" for access method \"%s\"." msgstr "アクセスメソッド\"%2$s\"に対する演算子族\"%1$s\"に適切な演算子がありません。" @@ -8835,232 +8869,232 @@ msgstr "パーティション親テーブル上のユニーク制約はすべて 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:1116 commands/indexcmds.c:1147 +#: commands/indexcmds.c:1116 commands/indexcmds.c:1148 #, c-format msgid "index creation on system columns is not supported" msgstr "システム列へのインデックス作成はサポートされていません" -#: commands/indexcmds.c:1123 +#: commands/indexcmds.c:1124 #, c-format msgid "primary keys on virtual generated columns are not supported" msgstr "仮想生成列に対する主キーはサポートされていません" -#: commands/indexcmds.c:1125 commands/indexcmds.c:1164 +#: commands/indexcmds.c:1126 commands/indexcmds.c:1166 #, c-format msgid "unique constraints on virtual generated columns are not supported" msgstr "一意性制約は仮想生成列ではサポートされていません" -#: commands/indexcmds.c:1126 commands/indexcmds.c:1165 +#: commands/indexcmds.c:1127 commands/indexcmds.c:1167 #, c-format msgid "indexes on virtual generated columns are not supported" msgstr "仮想生成列に対するインデックスはサポートされていません" -#: commands/indexcmds.c:1397 tcop/utility.c:1518 +#: commands/indexcmds.c:1399 tcop/utility.c:1518 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"にはユニークインデックスを構築できません" -#: commands/indexcmds.c:1399 tcop/utility.c:1520 +#: commands/indexcmds.c:1401 tcop/utility.c:1520 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "テーブル\"%s\"は外部テーブルを子テーブルとして含んでいます" -#: commands/indexcmds.c:1857 +#: commands/indexcmds.c:1859 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "インデックスの述部の関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:1954 parser/parse_utilcmd.c:2735 parser/parse_utilcmd.c:2918 +#: commands/indexcmds.c:1956 parser/parse_utilcmd.c:2739 parser/parse_utilcmd.c:2927 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "キーとして指名された列\"%s\"は存在しません" -#: commands/indexcmds.c:1978 parser/parse_utilcmd.c:1988 +#: commands/indexcmds.c:1980 parser/parse_utilcmd.c:1988 #, c-format msgid "expressions are not supported in included columns" msgstr "包含列では式はサポートされません" -#: commands/indexcmds.c:2019 +#: commands/indexcmds.c:2021 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "式インデックスの関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:2034 +#: commands/indexcmds.c:2036 #, c-format msgid "including column does not support a collation" msgstr "包含列は照合順序をサポートしません" -#: commands/indexcmds.c:2038 +#: commands/indexcmds.c:2040 #, c-format msgid "including column does not support an operator class" msgstr "包含列は演算子クラスをサポートしません" -#: commands/indexcmds.c:2042 +#: commands/indexcmds.c:2044 #, c-format msgid "including column does not support ASC/DESC options" msgstr "包含列は ASC/DESC オプションをサポートしません" -#: commands/indexcmds.c:2046 +#: commands/indexcmds.c:2048 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "包含列は NULLS FIRST/LAST オプションをサポートしません" -#: commands/indexcmds.c:2089 +#: commands/indexcmds.c:2091 #, c-format msgid "could not determine which collation to use for index expression" msgstr "インデックス式で使用する照合順序を特定できませんでした" -#: commands/indexcmds.c:2097 commands/tablecmds.c:19994 commands/typecmds.c:812 parser/parse_expr.c:2815 parser/parse_type.c:568 parser/parse_utilcmd.c:4064 utils/adt/misc.c:630 +#: commands/indexcmds.c:2099 commands/tablecmds.c:20015 commands/typecmds.c:812 parser/parse_expr.c:2815 parser/parse_type.c:568 parser/parse_utilcmd.c:4073 utils/adt/misc.c:630 #, c-format msgid "collations are not supported by type %s" msgstr "%s 型では照合順序はサポートされません" -#: commands/indexcmds.c:2164 +#: commands/indexcmds.c:2166 #, c-format msgid "operator %s is not commutative" msgstr "演算子 %s は可換ではありません" -#: commands/indexcmds.c:2166 +#: commands/indexcmds.c:2168 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "排除制約で使えるのは可換演算子だけです" -#: commands/indexcmds.c:2176 +#: commands/indexcmds.c:2178 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "演算子%sは演算子族\"%s\"のメンバーではありません" -#: commands/indexcmds.c:2179 +#: commands/indexcmds.c:2181 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "この排除に使用する演算子はこの制約に使用するインデックス演算子に関連付けられている必要があります。" -#: commands/indexcmds.c:2228 +#: commands/indexcmds.c:2230 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "アクセスメソッド\"%s\"はASC/DESCオプションをサポートしません" -#: commands/indexcmds.c:2233 +#: commands/indexcmds.c:2235 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "アクセスメソッド\"%s\"はNULLS FIRST/LASTオプションをサポートしません" -#: commands/indexcmds.c:2277 commands/tablecmds.c:20019 commands/tablecmds.c:20025 commands/typecmds.c:2349 +#: commands/indexcmds.c:2279 commands/tablecmds.c:20040 commands/tablecmds.c:20046 commands/typecmds.c:2356 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"にはデータ型%1$s用のデフォルトの演算子クラスがありません" -#: commands/indexcmds.c:2279 +#: commands/indexcmds.c:2281 #, 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:2308 commands/indexcmds.c:2316 commands/opclasscmds.c:205 +#: commands/indexcmds.c:2310 commands/indexcmds.c:2318 commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"用の演算子クラス\"%1$s\"は存在しません" -#: commands/indexcmds.c:2330 commands/typecmds.c:2337 +#: commands/indexcmds.c:2332 commands/typecmds.c:2344 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "演算子クラス\"%s\"はデータ型%sを受け付けません" -#: commands/indexcmds.c:2420 +#: commands/indexcmds.c:2422 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "データ型%sには複数のデフォルトの演算子クラスがあります" -#: commands/indexcmds.c:2470 commands/indexcmds.c:2489 +#: commands/indexcmds.c:2472 commands/indexcmds.c:2491 #, c-format msgid "could not identify an overlaps operator for type %s" msgstr "型%sの重複検出演算子を特定できませんでした" -#: commands/indexcmds.c:2471 commands/indexcmds.c:2490 +#: commands/indexcmds.c:2473 commands/indexcmds.c:2492 #, c-format msgid "could not identify a contained-by operator for type %s" msgstr "型%sの被包含演算子を特定できませんでした" -#: commands/indexcmds.c:2472 commands/tablecmds.c:10358 +#: commands/indexcmds.c:2474 commands/tablecmds.c:10368 #, c-format msgid "Could not translate compare type %d for operator family \"%s\" of access method \"%s\"." msgstr "アクセスメソッド\"%3$s\"の演算子ファミリー\"%2$s\"の比較方式%1$dを変換できませんでした。" -#: commands/indexcmds.c:3078 +#: commands/indexcmds.c:3080 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "テーブル\"%s\"には並行インデックス再作成が可能なインデックスがありません" -#: commands/indexcmds.c:3092 +#: commands/indexcmds.c:3094 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "テーブル\"%s\"には再構築すべきインデックスはありません" -#: commands/indexcmds.c:3139 commands/indexcmds.c:3650 commands/indexcmds.c:3780 +#: commands/indexcmds.c:3141 commands/indexcmds.c:3652 commands/indexcmds.c:3782 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "システムカタログではインデックスの並行再構築はできません" -#: commands/indexcmds.c:3163 +#: commands/indexcmds.c:3165 #, c-format msgid "can only reindex the currently open database" msgstr "現在オープンしているデータベースのみをインデックス再構築することができます" -#: commands/indexcmds.c:3255 +#: commands/indexcmds.c:3257 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "システムカタログではインデックスの並行再構築はできません、全てスキップします" -#: commands/indexcmds.c:3288 +#: commands/indexcmds.c:3290 #, c-format msgid "cannot move system relations, skipping all" msgstr "システムリレーションは移動できません、すべてスキップします" -#: commands/indexcmds.c:3334 +#: commands/indexcmds.c:3336 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "パーティションテーブル\"%s.%s\"のインデックス再構築中" -#: commands/indexcmds.c:3337 +#: commands/indexcmds.c:3339 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "パーティションインデックス\"%s.%s\"のインデックス再構築中" -#: commands/indexcmds.c:3530 commands/indexcmds.c:4422 +#: commands/indexcmds.c:3532 commands/indexcmds.c:4424 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "テーブル\"%s.%s\"のインデックス再構築が完了しました" -#: commands/indexcmds.c:3682 commands/indexcmds.c:3735 +#: commands/indexcmds.c:3684 commands/indexcmds.c:3737 #, c-format msgid "skipping reindex of invalid index \"%s.%s\"" msgstr "無効なインデックス\"%s.%s\"の再構築をスキップします" -#: commands/indexcmds.c:3685 commands/indexcmds.c:3738 +#: commands/indexcmds.c:3687 commands/indexcmds.c:3740 #, c-format msgid "Use DROP INDEX or REINDEX INDEX." msgstr "DROP INDEXあるいはREINDEX INDEXを使用してください。" -#: commands/indexcmds.c:3689 +#: commands/indexcmds.c:3691 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "排他制約インデックス\"%s.%s\"を並行再構築することはできません、スキップします " -#: commands/indexcmds.c:3845 +#: commands/indexcmds.c:3847 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "このタイプのリレーションでインデックス並列再構築はできません" -#: commands/indexcmds.c:3863 +#: commands/indexcmds.c:3865 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "テーブルスペース\"%s\"への非共有リレーションの移動はできません" -#: commands/indexcmds.c:4403 commands/indexcmds.c:4415 +#: commands/indexcmds.c:4405 commands/indexcmds.c:4417 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr " インデックス\"%s.%s\"の再構築が完了しました " -#: commands/indexcmds.c:4405 commands/indexcmds.c:4424 +#: commands/indexcmds.c:4407 commands/indexcmds.c:4426 #, c-format msgid "%s." msgstr "%s。" @@ -9415,7 +9449,7 @@ msgstr "演算子の属性\"%s\"は変更できません" msgid "operator attribute \"%s\" cannot be changed if it has already been set" msgstr "演算子の属性\"%s\"は、すでに設定されている場合には変更できません" -#: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:152 commands/tablecmds.c:1800 commands/tablecmds.c:2400 commands/tablecmds.c:3824 commands/tablecmds.c:6793 commands/tablecmds.c:10114 commands/tablecmds.c:19565 commands/tablecmds.c:19600 commands/trigger.c:319 commands/trigger.c:1338 commands/trigger.c:1448 rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 +#: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:152 commands/tablecmds.c:1810 commands/tablecmds.c:2410 commands/tablecmds.c:3834 commands/tablecmds.c:6803 commands/tablecmds.c:10124 commands/tablecmds.c:19586 commands/tablecmds.c:19621 commands/trigger.c:319 commands/trigger.c:1338 commands/trigger.c:1448 rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "権限がありません: \"%s\"はシステムカタログです" @@ -9510,7 +9544,7 @@ msgstr "準備された文\"%s\"は存在しません" msgid "must be superuser to create custom procedural language" msgstr "手続き言語を生成するためにはスーパーユーザーである必要があります" -#: commands/publicationcmds.c:135 libpq/auth-oauth.c:850 postmaster/postmaster.c:1130 postmaster/postmaster.c:1232 utils/init/miscinit.c:1871 +#: commands/publicationcmds.c:135 libpq/auth-oauth.c:850 postmaster/postmaster.c:1131 postmaster/postmaster.c:1233 utils/init/miscinit.c:1871 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "パラメータ\"%s\"のリスト構文が不正です" @@ -9649,7 +9683,7 @@ msgstr "FOR ALL TABLES指定のパブリケーションではスキーマの追 msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "FOR ALL TABLES指定のパブリケーションではテーブルの追加や削除はできません。" -#: commands/publicationcmds.c:1497 commands/publicationcmds.c:1536 commands/publicationcmds.c:2073 utils/cache/lsyscache.c:3774 +#: commands/publicationcmds.c:1497 commands/publicationcmds.c:1536 commands/publicationcmds.c:2073 utils/cache/lsyscache.c:3887 #, c-format msgid "publication \"%s\" does not exist" msgstr "パブリケーション\"%s\"は存在しません" @@ -9870,7 +9904,7 @@ msgstr "シーケンスは関連するテーブルと同じスキーマでなけ msgid "cannot change ownership of identity sequence" msgstr "識別シーケンスの所有者は変更できません" -#: commands/sequence.c:1671 commands/tablecmds.c:16136 commands/tablecmds.c:18974 +#: commands/sequence.c:1671 commands/tablecmds.c:16157 commands/tablecmds.c:18995 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "シーケンス\"%s\"はテーブル\"%s\"にリンクされています" @@ -9945,12 +9979,12 @@ msgstr "定形情報定義中の列名が重複しています" msgid "duplicate expression in statistics definition" msgstr "統計情報定義内に重複した式" -#: commands/statscmds.c:667 commands/tablecmds.c:8939 +#: commands/statscmds.c:667 commands/tablecmds.c:8949 #, c-format msgid "statistics target %d is too low" msgstr "統計情報目標%dは小さすぎます" -#: commands/statscmds.c:675 commands/tablecmds.c:8947 +#: commands/statscmds.c:675 commands/tablecmds.c:8957 #, c-format msgid "lowering statistics target to %d" msgstr "統計情報目標を%dに減らします" @@ -9987,221 +10021,221 @@ msgstr "%s と %s は排他なオプションです" msgid "subscription with %s must also set %s" msgstr "%s としたサブスクリプションでは %s を設定する必要があります" -#: commands/subscriptioncmds.c:466 +#: commands/subscriptioncmds.c:492 #, c-format msgid "could not receive list of publications from the publisher: %s" msgstr "パブリケーション一覧をパブリッシャから受け取れませんでした: %s" -#: commands/subscriptioncmds.c:498 +#: commands/subscriptioncmds.c:524 #, c-format msgid "publication %s does not exist on the publisher" msgid_plural "publications %s do not exist on the publisher" msgstr[0] "パブリケーション%sはパブリッシャ上には存在しません" -#: commands/subscriptioncmds.c:586 +#: commands/subscriptioncmds.c:612 #, c-format msgid "permission denied to create subscription" msgstr "サブスクリプションを作成する権限がありません" -#: commands/subscriptioncmds.c:587 +#: commands/subscriptioncmds.c:613 #, c-format msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "\"%s\"ロールの権限を持つロールのみがサブスクリプションを作成できます。" -#: commands/subscriptioncmds.c:718 commands/subscriptioncmds.c:852 commands/subscriptioncmds.c:1594 +#: commands/subscriptioncmds.c:744 commands/subscriptioncmds.c:878 commands/subscriptioncmds.c:1620 #, c-format msgid "subscription \"%s\" could not connect to the publisher: %s" msgstr "サブスクリプション\"%s\"はパブリッシャに接続できませんでした: %s" -#: commands/subscriptioncmds.c:790 +#: commands/subscriptioncmds.c:816 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "パブリッシャ上でレプリケーションスロット\"%s\"を作成しました" -#: commands/subscriptioncmds.c:802 +#: commands/subscriptioncmds.c:828 #, c-format msgid "subscription was created, but is not connected" msgstr "サブスクリプションは作成されましたが接続されていません" -#: commands/subscriptioncmds.c:803 +#: commands/subscriptioncmds.c:829 #, c-format msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." msgstr "レプリケーションを開始するにはレプリケーションスロットの作成、サブスクリプションの有効化そしてサブスクリプションのリフレッシュを手動で行う必要があります。" -#: commands/subscriptioncmds.c:1070 +#: commands/subscriptioncmds.c:1096 #, c-format msgid "cannot set option \"%s\" for enabled subscription" msgstr "有効にされているサブスクリプションにはオプション”%s”を指定できません" -#: commands/subscriptioncmds.c:1084 +#: commands/subscriptioncmds.c:1110 #, c-format msgid "cannot set option \"%s\" for a subscription that does not have a slot name" msgstr "スロット名を指定されていないサブスクリプションのオプション\"%s\"を設定することはできません" -#: commands/subscriptioncmds.c:1127 commands/subscriptioncmds.c:1665 commands/subscriptioncmds.c:2046 utils/cache/lsyscache.c:3824 +#: commands/subscriptioncmds.c:1153 commands/subscriptioncmds.c:1691 commands/subscriptioncmds.c:2074 utils/cache/lsyscache.c:3937 #, c-format msgid "subscription \"%s\" does not exist" msgstr "サブスクリプション\"%s\"は存在しません" -#: commands/subscriptioncmds.c:1185 +#: commands/subscriptioncmds.c:1211 #, c-format msgid "cannot set %s for enabled subscription" msgstr "有効にされているサブスクリプションには %s を指定できません" -#: commands/subscriptioncmds.c:1270 +#: commands/subscriptioncmds.c:1296 #, c-format msgid "\"slot_name\" and \"two_phase\" cannot be altered at the same time" msgstr "\"slot_name\"と\"two_phase\"は同時に変更できません" -#: commands/subscriptioncmds.c:1286 +#: commands/subscriptioncmds.c:1312 #, c-format msgid "cannot alter \"two_phase\" when logical replication worker is still running" msgstr "論理レプリケーションワーカーがまだ実行中のため\"two_phase\"は変更できません" -#: commands/subscriptioncmds.c:1287 +#: commands/subscriptioncmds.c:1313 #, c-format msgid "Try again after some time." msgstr "少し待ってから再試行してください。" -#: commands/subscriptioncmds.c:1300 +#: commands/subscriptioncmds.c:1326 #, c-format msgid "cannot disable \"two_phase\" when prepared transactions exist" msgstr "準備済みトランザクションが存在するため\"two_phase\"を無効にできません" -#: commands/subscriptioncmds.c:1301 +#: commands/subscriptioncmds.c:1327 #, c-format msgid "Resolve these transactions and try again." msgstr "トランザクションの解決後に再試行してください。" -#: commands/subscriptioncmds.c:1348 +#: commands/subscriptioncmds.c:1374 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "スロット名を指定されていないサブスクリプションを有効にはできません" -#: commands/subscriptioncmds.c:1392 commands/subscriptioncmds.c:1443 +#: commands/subscriptioncmds.c:1418 commands/subscriptioncmds.c:1469 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "refresh指定された ALTER SUBSCRIPTION は無効化されているサブスクリプションには実行できません" -#: commands/subscriptioncmds.c:1393 +#: commands/subscriptioncmds.c:1419 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false) を使ってください。" -#: commands/subscriptioncmds.c:1402 commands/subscriptioncmds.c:1457 +#: commands/subscriptioncmds.c:1428 commands/subscriptioncmds.c:1483 #, c-format msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" msgstr "two_phaseが有効である場合、refreshおよびcopy_data指定された ALTER SUBSCRIPTIONは実行できません" -#: commands/subscriptioncmds.c:1403 +#: commands/subscriptioncmds.c:1429 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "refresh = false または copy_data = false を指定してALTER SUBSCRIPTION ... SET PUBLICATIONを実行するか、DROP/CREATE SUBSCRIPTIONを実行してください。" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1459 +#: commands/subscriptioncmds.c:1485 #, c-format msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "refresh = false または copy_data = false を指定して%sを実行するか、DROP/CREATE SUBSCRIPTIONを実行してください。" -#: commands/subscriptioncmds.c:1481 +#: commands/subscriptioncmds.c:1507 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESHは無効化されているサブスクリプションには実行できません" -#: commands/subscriptioncmds.c:1506 +#: commands/subscriptioncmds.c:1532 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" msgstr "two_phaseが有効である場合、copy_data指定のALTER SUBSCRIPTION ... REFRESHは実行できません" -#: commands/subscriptioncmds.c:1507 +#: commands/subscriptioncmds.c:1533 #, c-format msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "ALTER SUBSCRIPTION ... REFRESH を copy_data = false を指定して実行するか、DROP/CREATE SUBSCRIPTIONを実行してください。" -#: commands/subscriptioncmds.c:1542 +#: commands/subscriptioncmds.c:1568 #, c-format msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" msgstr "WAL読み飛ばし位置(LSN %X/%X)は基点LSN %X/%Xより大きくなければなりません" -#: commands/subscriptioncmds.c:1669 +#: commands/subscriptioncmds.c:1695 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "サブスクリプション\"%s\"は存在しません、スキップします" -#: commands/subscriptioncmds.c:1936 +#: commands/subscriptioncmds.c:1964 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "パブリッシャ上でレプリケーションスロット\"%s\"を削除しました" -#: commands/subscriptioncmds.c:1945 commands/subscriptioncmds.c:1953 +#: commands/subscriptioncmds.c:1973 commands/subscriptioncmds.c:1981 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "パブリッシャ上でのレプリケーションスロット\"%s\"の削除に失敗しました: %s" -#: commands/subscriptioncmds.c:2078 +#: commands/subscriptioncmds.c:2106 #, c-format msgid "subscription with OID %u does not exist" msgstr "OID %uのサブスクリプションは存在しません" -#: commands/subscriptioncmds.c:2152 commands/subscriptioncmds.c:2276 +#: commands/subscriptioncmds.c:2185 commands/subscriptioncmds.c:2309 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "パブリッシャから複製テーブルの一覧を受け取れませんでした: %s" -#: commands/subscriptioncmds.c:2188 +#: commands/subscriptioncmds.c:2221 #, c-format msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" msgstr "サブスクリプション\"%s\"がcopy_dataをorigin = NONEで要求しましたが、異なる基点を持つデータをコピーする可能性があります" -#: commands/subscriptioncmds.c:2190 +#: commands/subscriptioncmds.c:2223 #, c-format msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." msgstr[0] "作成中のサブスクリプションは他のサブスクリプションによって書き込まれるテーブルを含むパブリケーション(%s)をサブスクライブします" -#: commands/subscriptioncmds.c:2193 +#: commands/subscriptioncmds.c:2226 #, c-format msgid "Verify that initial data copied from the publisher tables did not come from other origins." msgstr "パブリッシャテーブルからコピーされた初期データが異なる起源からのものでないことを確認してください。" -#: commands/subscriptioncmds.c:2298 replication/logical/tablesync.c:933 replication/pgoutput/pgoutput.c:1189 +#: commands/subscriptioncmds.c:2331 replication/logical/tablesync.c:933 replication/pgoutput/pgoutput.c:1189 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "テーブル\"%s.%s\"に対して、異なるパブリケーションで異なる列リストを使用することはできません" -#: commands/subscriptioncmds.c:2348 +#: commands/subscriptioncmds.c:2381 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を削除する際にパブリッシャへの接続に失敗しました: %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2351 +#: commands/subscriptioncmds.c:2384 #, c-format msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." msgstr "%s でサブスクリプションを無効化してから、%s でスロットとの関連付けを解除してください。" -#: commands/subscriptioncmds.c:2382 +#: commands/subscriptioncmds.c:2415 #, c-format msgid "publication name \"%s\" used more than once" msgstr "パブリケーション名\"%s\"が2回以上使われています" -#: commands/subscriptioncmds.c:2426 +#: commands/subscriptioncmds.c:2459 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にすでに存在します" -#: commands/subscriptioncmds.c:2440 +#: commands/subscriptioncmds.c:2473 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にはありません" -#: commands/subscriptioncmds.c:2451 +#: commands/subscriptioncmds.c:2484 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "サブスクリプションからすべてのパブリケーションを削除することはできません" -#: commands/subscriptioncmds.c:2508 +#: commands/subscriptioncmds.c:2541 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "パラメータ\"%s\"はBoolean値または\"parallel\"のみを取ります" @@ -10262,7 +10296,7 @@ msgstr "実体化ビュー\"%s\"は存在しません、スキップします" msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "実体化ビューを削除するにはDROP MATERIALIZED VIEWを使用してください。" -#: commands/tablecmds.c:282 commands/tablecmds.c:306 commands/tablecmds.c:21651 parser/parse_utilcmd.c:2428 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 commands/tablecmds.c:21672 parser/parse_utilcmd.c:2432 #, c-format msgid "index \"%s\" does not exist" msgstr "インデックス\"%s\"は存在しません" @@ -10285,7 +10319,7 @@ msgstr "\"%s\"は型ではありません" msgid "Use DROP TYPE to remove a type." msgstr "型を削除するにはDROP TYPEを使用してください" -#: commands/tablecmds.c:294 commands/tablecmds.c:15975 commands/tablecmds.c:18676 +#: commands/tablecmds.c:294 commands/tablecmds.c:15996 commands/tablecmds.c:18697 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "外部テーブル\"%s\"は存在しません" @@ -10299,1507 +10333,1512 @@ msgstr "外部テーブル\"%s\"は存在しません、スキップします" msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "外部テーブルを削除するには DROP FOREIGN TABLE を使用してください。" -#: commands/tablecmds.c:802 +#: commands/tablecmds.c:803 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMITは一時テーブルでのみ使用できます" -#: commands/tablecmds.c:819 +#: commands/tablecmds.c:820 #, c-format msgid "partitioned tables cannot be unlogged" msgstr "パーティションテーブルはログ非取得にはできません" -#: commands/tablecmds.c:839 +#: commands/tablecmds.c:840 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "セキュリティー制限操作中は、一時テーブルを作成できません" -#: commands/tablecmds.c:875 commands/tablecmds.c:17400 +#: commands/tablecmds.c:876 commands/tablecmds.c:17421 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "リレーション\"%s\"が複数回継承されました" -#: commands/tablecmds.c:1133 +#: commands/tablecmds.c:1134 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\"はパーティションされていません" -#: commands/tablecmds.c:1227 +#: commands/tablecmds.c:1228 #, c-format msgid "cannot partition using more than %d columns" msgstr "%d以上の列を使ったパーティションはできません" -#: commands/tablecmds.c:1283 +#: commands/tablecmds.c:1284 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "パーティションテーブル\"%s\"では外部子テーブルを作成できません" -#: commands/tablecmds.c:1285 +#: commands/tablecmds.c:1286 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "テーブル\"%s\"はユニークインデックスを持っています" -#: commands/tablecmds.c:1415 commands/tablecmds.c:14952 +#: commands/tablecmds.c:1425 commands/tablecmds.c:14973 #, c-format msgid "too many array dimensions" msgstr "配列の次元多すぎます" -#: commands/tablecmds.c:1420 parser/parse_clause.c:772 parser/parse_relation.c:1929 +#: commands/tablecmds.c:1430 parser/parse_clause.c:772 parser/parse_relation.c:1961 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "列\"%s\"はSETOFとして宣言できません" -#: commands/tablecmds.c:1549 +#: commands/tablecmds.c:1559 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLYは複数オブジェクトの削除をサポートしていません" -#: commands/tablecmds.c:1553 +#: commands/tablecmds.c:1563 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLYはCASCADEをサポートしません" -#: commands/tablecmds.c:1657 +#: commands/tablecmds.c:1667 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "パーティション親インデックス\"%s\"は並行的に削除することはできません" -#: commands/tablecmds.c:1945 +#: commands/tablecmds.c:1955 #, c-format msgid "cannot truncate only a partitioned table" msgstr "パーティションの親テーブルのみの切り詰めはできません" -#: commands/tablecmds.c:1946 +#: commands/tablecmds.c:1956 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "ONLY キーワードを指定しないでください、もしくは子テーブルに対して直接 TRUNCATE ONLY を実行してください。" -#: commands/tablecmds.c:2019 +#: commands/tablecmds.c:2029 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "テーブル\"%s\"へのカスケードを削除します" -#: commands/tablecmds.c:2380 +#: commands/tablecmds.c:2390 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "外部テーブル\"%s\"の切り詰めはできません" -#: commands/tablecmds.c:2437 +#: commands/tablecmds.c:2447 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "他のセッションの一時テーブルを削除できません" -#: commands/tablecmds.c:2675 commands/tablecmds.c:17297 +#: commands/tablecmds.c:2685 commands/tablecmds.c:17318 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"からの継承はできません" -#: commands/tablecmds.c:2680 +#: commands/tablecmds.c:2690 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "パーティション子テーブル\"%s\"からの継承はできません" -#: commands/tablecmds.c:2688 parser/parse_utilcmd.c:2699 parser/parse_utilcmd.c:2887 +#: commands/tablecmds.c:2698 parser/parse_utilcmd.c:2703 parser/parse_utilcmd.c:2896 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "継承しようとしたリレーション\"%s\"はテーブルまたは外部テーブルではありません" -#: commands/tablecmds.c:2700 +#: commands/tablecmds.c:2710 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "一時リレーションを永続リレーション\"%s\"のパーティション子テーブルとして作ることはできません" -#: commands/tablecmds.c:2709 commands/tablecmds.c:17276 +#: commands/tablecmds.c:2719 commands/tablecmds.c:17297 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "一時リレーション\"%s\"から継承することはできません" -#: commands/tablecmds.c:2719 commands/tablecmds.c:17284 +#: commands/tablecmds.c:2729 commands/tablecmds.c:17305 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "他のセッションの一時リレーションから継承することはできません" -#: commands/tablecmds.c:2874 commands/tablecmds.c:2928 commands/tablecmds.c:14635 parser/parse_utilcmd.c:1440 parser/parse_utilcmd.c:1484 parser/parse_utilcmd.c:1916 parser/parse_utilcmd.c:2024 +#: commands/tablecmds.c:2884 commands/tablecmds.c:2938 commands/tablecmds.c:14656 parser/parse_utilcmd.c:1440 parser/parse_utilcmd.c:1484 parser/parse_utilcmd.c:1916 parser/parse_utilcmd.c:2024 #, c-format msgid "cannot convert whole-row table reference" msgstr "行全体テーブル参照を変換できません" -#: commands/tablecmds.c:2875 parser/parse_utilcmd.c:1441 +#: commands/tablecmds.c:2885 parser/parse_utilcmd.c:1441 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "制約\"%s\"はテーブル\"%s\"への行全体参照を含みます。" -#: commands/tablecmds.c:2929 parser/parse_utilcmd.c:1485 +#: commands/tablecmds.c:2939 parser/parse_utilcmd.c:1485 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "制約\"%s\"はテーブル\"%s\"への行全体参照を含みます。" -#: commands/tablecmds.c:3051 commands/tablecmds.c:3345 +#: commands/tablecmds.c:3061 commands/tablecmds.c:3355 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "列\"%s\"は生成列を継承しますが、default 指定がされています" -#: commands/tablecmds.c:3056 commands/tablecmds.c:3350 +#: commands/tablecmds.c:3066 commands/tablecmds.c:3360 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "列\"%s\"は生成列を継承しますが、識別列と指定されています" -#: commands/tablecmds.c:3064 commands/tablecmds.c:3358 +#: commands/tablecmds.c:3074 commands/tablecmds.c:3368 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "子テーブルの列\"%s\"は生成式を指定しています" -#: commands/tablecmds.c:3066 commands/tablecmds.c:3360 +#: commands/tablecmds.c:3076 commands/tablecmds.c:3370 #, c-format msgid "A child table column cannot be generated unless its parent column is." msgstr "子テーブルの列は、親となる列が生成列でなければ生成列にはできません。" -#: commands/tablecmds.c:3072 commands/tablecmds.c:3366 commands/tablecmds.c:17562 +#: commands/tablecmds.c:3082 commands/tablecmds.c:3376 commands/tablecmds.c:17583 #, c-format msgid "column \"%s\" inherits from generated column of different kind" msgstr "列\"%s\"は異なる種類の生成列を継承しています" -#: commands/tablecmds.c:3074 commands/tablecmds.c:3368 commands/tablecmds.c:17563 +#: commands/tablecmds.c:3084 commands/tablecmds.c:3378 commands/tablecmds.c:17584 #, c-format msgid "Parent column is %s, child column is %s." msgstr "親の列は %s、子の列は %s です。" -#: commands/tablecmds.c:3121 +#: commands/tablecmds.c:3131 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "列\"%s\"は競合する生成式を継承します" -#: commands/tablecmds.c:3123 +#: commands/tablecmds.c:3133 #, c-format msgid "To resolve the conflict, specify a generation expression explicitly." msgstr "この競合を解消するには明示的に生成式を指定してください。" -#: commands/tablecmds.c:3127 +#: commands/tablecmds.c:3137 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "列\"%s\"は競合するデフォルト値を継承します" -#: commands/tablecmds.c:3129 +#: commands/tablecmds.c:3139 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "競合を解消するには明示的にデフォルトを指定してください" -#: commands/tablecmds.c:3196 +#: commands/tablecmds.c:3206 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "異なる式を持つ検査制約名\"%s\"が複数あります。" -#: commands/tablecmds.c:3249 +#: commands/tablecmds.c:3259 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "継承される定義で列\"%s\"をマージしています" -#: commands/tablecmds.c:3253 +#: commands/tablecmds.c:3263 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "継承される定義で列\"%s\"を移動してマージします" -#: commands/tablecmds.c:3254 +#: commands/tablecmds.c:3264 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "ユーザーが指定した列が継承した列の位置に移動されました。" -#: commands/tablecmds.c:3266 +#: commands/tablecmds.c:3276 #, c-format msgid "column \"%s\" has a type conflict" msgstr "列\"%s\"の型が競合しています" -#: commands/tablecmds.c:3268 commands/tablecmds.c:3302 commands/tablecmds.c:3318 commands/tablecmds.c:3434 commands/tablecmds.c:3462 commands/tablecmds.c:3478 parser/parse_coerce.c:2190 parser/parse_coerce.c:2210 parser/parse_coerce.c:2230 parser/parse_coerce.c:2251 parser/parse_coerce.c:2306 parser/parse_coerce.c:2340 parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 parser/parse_coerce.c:2486 parser/parse_coerce.c:2553 parser/parse_param.c:224 +#: commands/tablecmds.c:3278 commands/tablecmds.c:3312 commands/tablecmds.c:3328 commands/tablecmds.c:3444 commands/tablecmds.c:3472 commands/tablecmds.c:3488 parser/parse_coerce.c:2189 parser/parse_coerce.c:2209 parser/parse_coerce.c:2229 parser/parse_coerce.c:2250 parser/parse_coerce.c:2305 parser/parse_coerce.c:2339 parser/parse_coerce.c:2415 parser/parse_coerce.c:2446 parser/parse_coerce.c:2485 parser/parse_coerce.c:2552 parser/parse_param.c:224 #, c-format msgid "%s versus %s" msgstr "%s対%s" -#: commands/tablecmds.c:3280 +#: commands/tablecmds.c:3290 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "列\"%s\"の照合順序が競合しています" -#: commands/tablecmds.c:3282 commands/tablecmds.c:3448 commands/tablecmds.c:7277 parser/parse_expr.c:4792 +#: commands/tablecmds.c:3292 commands/tablecmds.c:3458 commands/tablecmds.c:7287 parser/parse_expr.c:4802 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\"対\"%s\"" -#: commands/tablecmds.c:3300 +#: commands/tablecmds.c:3310 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "列\"%s\"でストレージパラメータが競合しています" -#: commands/tablecmds.c:3316 commands/tablecmds.c:3476 +#: commands/tablecmds.c:3326 commands/tablecmds.c:3486 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "列\"%s\"で圧縮方式が競合しています" -#: commands/tablecmds.c:3420 +#: commands/tablecmds.c:3430 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "複数の継承される列\"%s\"の定義をマージしています" -#: commands/tablecmds.c:3432 +#: commands/tablecmds.c:3442 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "継承される列\"%s\"の型が競合しています" -#: commands/tablecmds.c:3446 +#: commands/tablecmds.c:3456 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "継承される列 \"%s\"の照合順序が競合しています" -#: commands/tablecmds.c:3460 +#: commands/tablecmds.c:3470 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "継承される列\"%s\"でストレージパラメータが競合しています" -#: commands/tablecmds.c:3488 +#: commands/tablecmds.c:3498 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "継承された列 \"%s\"の生成が競合しています" -#: commands/tablecmds.c:3719 +#: commands/tablecmds.c:3729 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "他のセッションの一時テーブルを移動できません" -#: commands/tablecmds.c:3792 +#: commands/tablecmds.c:3802 #, c-format msgid "cannot rename column of typed table" msgstr "型付けされたテーブルの列をリネームできません" -#: commands/tablecmds.c:3811 +#: commands/tablecmds.c:3821 #, c-format msgid "cannot rename columns of relation \"%s\"" msgstr "リレーション\"%s\"の列名は変更できません" -#: commands/tablecmds.c:3906 +#: commands/tablecmds.c:3916 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "継承される列\"%s\"の名前を子テーブルでも変更する必要があります" -#: commands/tablecmds.c:3938 +#: commands/tablecmds.c:3948 #, c-format msgid "cannot rename system column \"%s\"" msgstr "システム列%s\"の名前を変更できません" -#: commands/tablecmds.c:3953 +#: commands/tablecmds.c:3963 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "継承される列\"%s\"の名前を変更できません" -#: commands/tablecmds.c:4108 +#: commands/tablecmds.c:4118 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "継承される制約\"%s\"の名前を子テーブルでも変更する必要があります" -#: commands/tablecmds.c:4115 +#: commands/tablecmds.c:4125 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "継承される制約\"%s\"の名前を変更できません" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4415 +#: commands/tablecmds.c:4425 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "このセッションで実行中の問い合わせで使用されているため\"%2$s\"を%1$sできません" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4424 +#: commands/tablecmds.c:4434 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "保留中のトリガイベントがあるため\"%2$s\"を%1$sできません" -#: commands/tablecmds.c:4450 +#: commands/tablecmds.c:4460 #, c-format msgid "cannot alter temporary tables of other sessions" msgstr "他のセッションの一時テーブルは変更できません" -#: commands/tablecmds.c:4914 +#: commands/tablecmds.c:4924 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "パーティション子テーブル\"%s\"は不完全な取り外し状態であるため変更できません" -#: commands/tablecmds.c:5143 +#: commands/tablecmds.c:5153 #, c-format msgid "cannot change persistence setting twice" msgstr "永続性設定の変更は2度はできません" -#: commands/tablecmds.c:5160 +#: commands/tablecmds.c:5170 #, c-format msgid "cannot have multiple SET ACCESS METHOD subcommands" msgstr "SET ACCESS METHODサブコマンドを複数指定できません" -#: commands/tablecmds.c:5894 +#: commands/tablecmds.c:5904 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "システムリレーション\"%sを書き換えられません" -#: commands/tablecmds.c:5900 +#: commands/tablecmds.c:5910 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "カタログテーブルとして使用されているテーブル\"%s\"は書き換えられません" -#: commands/tablecmds.c:5912 +#: commands/tablecmds.c:5922 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "他のセッションの一時テーブルを書き換えられません" -#: commands/tablecmds.c:6448 commands/tablecmds.c:6468 +#: commands/tablecmds.c:6458 commands/tablecmds.c:6478 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "リレーション\"%2$s\"の列\"%1$s\"にNULL値があります" -#: commands/tablecmds.c:6485 +#: commands/tablecmds.c:6495 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "一部の行がリレーション\"%2$s\"の検査制約\"%1$s\"に違反してます" -#: commands/tablecmds.c:6505 partitioning/partbounds.c:3387 +#: commands/tablecmds.c:6515 partitioning/partbounds.c:3387 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "デフォルトパーティション\"%s\"の一部の行が更新後のパーティション制約に違反しています" -#: commands/tablecmds.c:6511 +#: commands/tablecmds.c:6521 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "一部の行がリレーション\"%s\"のパーティション制約に違反しています" #. translator: %s is a group of some SQL keywords -#: commands/tablecmds.c:6776 +#: commands/tablecmds.c:6786 #, c-format msgid "ALTER action %s cannot be performed on relation \"%s\"" msgstr "ALTERのアクション%sはリレーション\"%s\"では実行できません" -#: commands/tablecmds.c:7031 commands/tablecmds.c:7038 +#: commands/tablecmds.c:7041 commands/tablecmds.c:7048 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "型\"%s\"を変更できません。列\"%s\".\"%s\"でその型を使用しているためです" -#: commands/tablecmds.c:7045 +#: commands/tablecmds.c:7055 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "列%2$s\".\"%3$s\"がその行型を使用しているため、外部テーブル\"%1$s\"を変更できません。" -#: commands/tablecmds.c:7052 +#: commands/tablecmds.c:7062 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "テーブル\"%s\"を変更できません。その行型を列\"%s\".\"%s\"で使用しているためです" -#: commands/tablecmds.c:7108 +#: commands/tablecmds.c:7118 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "型付けされたテーブルの型であるため、外部テーブル\"%s\"を変更できません。" -#: commands/tablecmds.c:7110 +#: commands/tablecmds.c:7120 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "型付けされたテーブルを変更する場合も ALTER .. CASCADE を使用してください" -#: commands/tablecmds.c:7156 +#: commands/tablecmds.c:7166 #, c-format msgid "type %s is the row type of another table" msgstr "型\"%s\"は他のテーブルの行型です" -#: commands/tablecmds.c:7158 +#: commands/tablecmds.c:7168 #, c-format msgid "A typed table must use a stand-alone composite type created with CREATE TYPE." msgstr "型付きテーブルは、CREATE TYPEで作成された独立した複合型を使用する必要があります。" -#: commands/tablecmds.c:7163 +#: commands/tablecmds.c:7173 #, c-format msgid "type %s is not a composite type" msgstr "型 %s は複合型ではありません" -#: commands/tablecmds.c:7190 +#: commands/tablecmds.c:7200 #, c-format msgid "cannot add column to typed table" msgstr "型付けされたテーブルに列を追加できません" -#: commands/tablecmds.c:7240 +#: commands/tablecmds.c:7250 #, c-format msgid "cannot add column to a partition" msgstr "パーティションに列は追加できません" -#: commands/tablecmds.c:7269 commands/tablecmds.c:17518 +#: commands/tablecmds.c:7279 commands/tablecmds.c:17539 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "子テーブル\"%s\"に異なる型の列\"%s\"があります" -#: commands/tablecmds.c:7275 commands/tablecmds.c:17524 +#: commands/tablecmds.c:7285 commands/tablecmds.c:17545 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "子テーブル\"%s\"に異なる照合順序の列\"%s\"があります" -#: commands/tablecmds.c:7293 +#: commands/tablecmds.c:7303 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "子\"%2$s\"の列\"%1$s\"の定義をマージしています" -#: commands/tablecmds.c:7346 +#: commands/tablecmds.c:7356 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "子テーブルを持つテーブルに識別列を再帰的に追加することはできません" -#: commands/tablecmds.c:7593 +#: commands/tablecmds.c:7603 #, c-format msgid "column must be added to child tables too" msgstr "列は子テーブルでも追加する必要があります" -#: commands/tablecmds.c:7671 +#: commands/tablecmds.c:7681 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します、スキップします" -#: commands/tablecmds.c:7678 +#: commands/tablecmds.c:7688 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します" -#: commands/tablecmds.c:7769 commands/tablecmds.c:7936 commands/tablecmds.c:8137 commands/tablecmds.c:8268 commands/tablecmds.c:8422 commands/tablecmds.c:8516 commands/tablecmds.c:8619 commands/tablecmds.c:8815 commands/tablecmds.c:8981 commands/tablecmds.c:9072 commands/tablecmds.c:9206 commands/tablecmds.c:14407 commands/tablecmds.c:15998 commands/tablecmds.c:18765 +#: commands/tablecmds.c:7779 commands/tablecmds.c:7946 commands/tablecmds.c:8147 commands/tablecmds.c:8278 commands/tablecmds.c:8432 commands/tablecmds.c:8526 commands/tablecmds.c:8629 commands/tablecmds.c:8825 commands/tablecmds.c:8991 commands/tablecmds.c:9082 commands/tablecmds.c:9216 commands/tablecmds.c:14428 commands/tablecmds.c:16019 commands/tablecmds.c:18786 #, c-format msgid "cannot alter system column \"%s\"" msgstr "システム列\"%s\"を変更できません" -#: commands/tablecmds.c:7775 commands/tablecmds.c:8143 commands/tablecmds.c:14168 +#: commands/tablecmds.c:7785 commands/tablecmds.c:8153 commands/tablecmds.c:14189 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は識別列です" -#: commands/tablecmds.c:7792 +#: commands/tablecmds.c:7802 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "列\"%s\"は親テーブルでNOT NULL指定されています" -#: commands/tablecmds.c:8014 commands/tablecmds.c:10013 +#: commands/tablecmds.c:8024 commands/tablecmds.c:10023 #, c-format msgid "constraint must be added to child tables too" msgstr "制約は子テーブルにも追加する必要があります" -#: commands/tablecmds.c:8015 commands/tablecmds.c:8246 commands/tablecmds.c:8378 commands/tablecmds.c:8495 commands/tablecmds.c:9379 commands/tablecmds.c:12207 +#: commands/tablecmds.c:8025 commands/tablecmds.c:8256 commands/tablecmds.c:8388 commands/tablecmds.c:8505 commands/tablecmds.c:9389 commands/tablecmds.c:12217 #, c-format msgid "Do not specify the ONLY keyword." msgstr "ONLYキーワードを指定しないでください。" -#: commands/tablecmds.c:8152 +#: commands/tablecmds.c:8162 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は生成カラムです" -#: commands/tablecmds.c:8245 +#: commands/tablecmds.c:8255 #, c-format msgid "cannot add identity to a column of only the partitioned table" msgstr "パーティション親テーブルのみで列を識別列とすることはできません" -#: commands/tablecmds.c:8251 +#: commands/tablecmds.c:8261 #, c-format msgid "cannot add identity to a column of a partition" msgstr "パーティション子テーブルの列を識別列とすることはできません" -#: commands/tablecmds.c:8279 +#: commands/tablecmds.c:8289 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "識別列を追加するにはリレーション\"%s\"の列\"%s\"はNOT NULLと宣言されている必要があります" -#: commands/tablecmds.c:8310 +#: commands/tablecmds.c:8320 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに識別列です" -#: commands/tablecmds.c:8316 +#: commands/tablecmds.c:8326 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでにデフォルト値が指定されています" -#: commands/tablecmds.c:8377 +#: commands/tablecmds.c:8387 #, c-format msgid "cannot change identity column of only the partitioned table" msgstr "パーティション親テーブルのみで列の識別列属性を変更することはできません" -#: commands/tablecmds.c:8383 +#: commands/tablecmds.c:8393 #, c-format msgid "cannot change identity column of a partition" msgstr "パーティション子テーブルの列の識別列属性を変更することはできません" -#: commands/tablecmds.c:8428 commands/tablecmds.c:8524 +#: commands/tablecmds.c:8438 commands/tablecmds.c:8534 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は識別列ではありません" -#: commands/tablecmds.c:8494 +#: commands/tablecmds.c:8504 #, c-format msgid "cannot drop identity from a column of only the partitioned table" msgstr "パーティション親テーブルのみで列の識別列属性を削除することはできません" -#: commands/tablecmds.c:8500 +#: commands/tablecmds.c:8510 #, c-format msgid "cannot drop identity from a column of a partition" msgstr "パーティション子テーブルの列の識別列属性を削除することはできません" -#: commands/tablecmds.c:8529 +#: commands/tablecmds.c:8539 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は識別列ではありません、スキップします" -#: commands/tablecmds.c:8626 commands/tablecmds.c:8836 +#: commands/tablecmds.c:8636 commands/tablecmds.c:8846 #, c-format msgid "column \"%s\" of relation \"%s\" is not a generated column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は生成列ではありません" -#: commands/tablecmds.c:8637 +#: commands/tablecmds.c:8647 #, c-format msgid "ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns in tables with check constraints" msgstr "ALTER TABLE / SET EXPRESSION は、チェック制約のあるテーブルの仮想生成列ではサポートされていません" -#: commands/tablecmds.c:8638 commands/tablecmds.c:8656 commands/tablecmds.c:8828 +#: commands/tablecmds.c:8648 commands/tablecmds.c:8666 commands/tablecmds.c:8838 #, c-format msgid "Column \"%s\" of relation \"%s\" is a virtual generated column." msgstr "リレーション\"%2$s\"の列\"%1$s\"は仮想生成列です。" -#: commands/tablecmds.c:8655 +#: commands/tablecmds.c:8665 #, c-format msgid "ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns in tables that are part of a publication" msgstr "ALTER TABLE / SET EXPRESSION は、パブリケーションに含まれるテーブルの仮想生成列ではサポートされていません" -#: commands/tablecmds.c:8762 +#: commands/tablecmds.c:8772 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSIONは子テーブルに対しても適用されなくてはなりません" -#: commands/tablecmds.c:8784 +#: commands/tablecmds.c:8794 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "継承列から生成式を削除することはできません" -#: commands/tablecmds.c:8827 +#: commands/tablecmds.c:8837 #, c-format msgid "ALTER TABLE / DROP EXPRESSION is not supported for virtual generated columns" msgstr "ALTER TABLE / DROP EXPRESSIONは仮想生成列ではサポートされていません" -#: commands/tablecmds.c:8841 +#: commands/tablecmds.c:8851 #, c-format msgid "column \"%s\" of relation \"%s\" is not a generated column, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は生成列ではありません、スキップします" -#: commands/tablecmds.c:8919 +#: commands/tablecmds.c:8929 #, c-format msgid "cannot refer to non-index column by number" msgstr "非インデックス列を番号で参照することはできません" -#: commands/tablecmds.c:8971 +#: commands/tablecmds.c:8981 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "リレーション \"%2$s\"の列 %1$d は存在しません" -#: commands/tablecmds.c:8991 +#: commands/tablecmds.c:9001 #, c-format msgid "cannot alter statistics on virtual generated column \"%s\"" msgstr "仮想生成列\"%s\"の統計情報は変更できません" -#: commands/tablecmds.c:9000 +#: commands/tablecmds.c:9010 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "インデックス\"%2$s\"の包含列\"%1$s\"への統計情報の変更はできません" -#: commands/tablecmds.c:9005 +#: commands/tablecmds.c:9015 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "インデックス \"%2$s\"の非式列\"%1$s\"の統計情報の変更はできません" -#: commands/tablecmds.c:9007 +#: commands/tablecmds.c:9017 #, c-format msgid "Alter statistics on table column instead." msgstr "代わりにテーブルカラムの統計情報を変更してください。" -#: commands/tablecmds.c:9253 +#: commands/tablecmds.c:9263 #, c-format msgid "cannot drop column from typed table" msgstr "型付けされたテーブルから列を削除できません" -#: commands/tablecmds.c:9317 +#: commands/tablecmds.c:9327 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は存在しません、スキップします" -#: commands/tablecmds.c:9330 +#: commands/tablecmds.c:9340 #, c-format msgid "cannot drop system column \"%s\"" msgstr "システム列\"%s\"を削除できません" -#: commands/tablecmds.c:9340 +#: commands/tablecmds.c:9350 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "継承される列\"%s\"を削除できません" -#: commands/tablecmds.c:9353 +#: commands/tablecmds.c:9363 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"はリレーション\"%s\"のパーティションキーの一部であるため、削除できません" -#: commands/tablecmds.c:9378 +#: commands/tablecmds.c:9388 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "子テーブルが存在する場合にはパーティション親テーブルのみから列を削除することはできません" -#: commands/tablecmds.c:9543 +#: commands/tablecmds.c:9553 #, c-format msgid "column \"%s\" of table \"%s\" is not marked NOT NULL" msgstr "テーブル\"%2$s\"の列\"%1$s\"は非NULLに設定されていません" -#: commands/tablecmds.c:9579 commands/tablecmds.c:9591 +#: commands/tablecmds.c:9589 commands/tablecmds.c:9601 #, c-format msgid "cannot create primary key on column \"%s\"" msgstr "列%s\"に主キーを作成することはできません" #. translator: fourth %s is a constraint characteristic such as NOT VALID -#: commands/tablecmds.c:9581 commands/tablecmds.c:9593 +#: commands/tablecmds.c:9591 commands/tablecmds.c:9603 #, c-format msgid "The constraint \"%s\" on column \"%s\" of table \"%s\", marked %s, is incompatible with a primary key." msgstr " %4$s とマークされているテーブル \"%3$s\"の列 \"%2$s\" への制約 \"%1$s\" は、主キーの要件を満たしていません。" -#: commands/tablecmds.c:9717 +#: commands/tablecmds.c:9727 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX はパーティションテーブルではサポートされていません" -#: commands/tablecmds.c:9742 +#: commands/tablecmds.c:9752 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX はインデックス\"%s\"を\"%s\"にリネームします" -#: commands/tablecmds.c:10100 +#: commands/tablecmds.c:10110 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "パーティションテーブル\"%s\"上のリレーション\"%s\"を参照する外部キー定義ではONLY指定はできません " -#: commands/tablecmds.c:10108 commands/tablecmds.c:10735 +#: commands/tablecmds.c:10118 commands/tablecmds.c:10745 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "参照先のリレーション\"%s\"はテーブルではありません" -#: commands/tablecmds.c:10131 +#: commands/tablecmds.c:10141 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "永続テーブルの制約は永続テーブルだけを参照できます" -#: commands/tablecmds.c:10138 +#: commands/tablecmds.c:10148 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "UNLOGGEDテーブルに対する制約は、永続テーブルまたはUNLOGGEDテーブルだけを参照する場合があります" -#: commands/tablecmds.c:10144 +#: commands/tablecmds.c:10154 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "一時テーブルに対する制約は一時テーブルだけを参照する場合があります" -#: commands/tablecmds.c:10148 +#: commands/tablecmds.c:10158 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "一時テーブルに対する制約にはこのセッションの一時テーブルを加える必要があります" -#: commands/tablecmds.c:10163 commands/tablecmds.c:10191 +#: commands/tablecmds.c:10173 commands/tablecmds.c:10201 #, c-format msgid "foreign key uses PERIOD on the referenced table but not the referencing table" msgstr "外部キーが参照先テーブル上ではPERIODを使用していますが、参照元テーブルでは使用していません" -#: commands/tablecmds.c:10203 +#: commands/tablecmds.c:10213 #, c-format msgid "foreign key uses PERIOD on the referencing table but not the referenced table" msgstr "外部キーが参照元テーブル上ではPERIODを使用していますが、参照先テーブルでは使用していません" -#: commands/tablecmds.c:10217 +#: commands/tablecmds.c:10227 #, c-format msgid "foreign key must use PERIOD when referencing a primary key using WITHOUT OVERLAPS" msgstr "主キーがWITHOUT OVERLAPSを使用している場合は外部キーはPERIODを使用する必要があります" -#: commands/tablecmds.c:10241 commands/tablecmds.c:10247 +#: commands/tablecmds.c:10251 commands/tablecmds.c:10257 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "生成カラムを含む外部キー制約に対する不正な %s 処理" -#: commands/tablecmds.c:10262 +#: commands/tablecmds.c:10272 #, c-format msgid "foreign key constraints on virtual generated columns are not supported" msgstr "外部キー制約は仮想生成列ではサポートされていません" -#: commands/tablecmds.c:10276 commands/tablecmds.c:10285 +#: commands/tablecmds.c:10286 commands/tablecmds.c:10295 #, c-format msgid "unsupported %s action for foreign key constraint using PERIOD" msgstr "PERIODを使用する外部キー制約に対するサポートされない %s 処理" -#: commands/tablecmds.c:10300 +#: commands/tablecmds.c:10310 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "外部キーの参照列数と被参照列数が合いません" -#: commands/tablecmds.c:10356 +#: commands/tablecmds.c:10366 #, c-format msgid "could not identify an overlaps operator for foreign key" msgstr "外部キーに使用する重複検出演算子を特定できませんでした" -#: commands/tablecmds.c:10357 +#: commands/tablecmds.c:10367 #, c-format msgid "could not identify an equality operator for foreign key" msgstr "外部キーに使用する等価演算子を特定できませんでした" -#: commands/tablecmds.c:10422 commands/tablecmds.c:10456 +#: commands/tablecmds.c:10432 commands/tablecmds.c:10466 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "外部キー制約\"%sは実装されていません" -#: commands/tablecmds.c:10424 +#: commands/tablecmds.c:10434 #, c-format msgid "Key columns \"%s\" of the referencing table and \"%s\" of the referenced table are of incompatible types: %s and %s." msgstr "キー列である参照元テーブルの\"%1$s\"と参照先テーブルの\"%2$s\"の型に互換性がありません: %3$sと%4$s。" -#: commands/tablecmds.c:10457 +#: commands/tablecmds.c:10467 #, c-format msgid "Key columns \"%s\" of the referencing table and \"%s\" of the referenced table have incompatible collations: \"%s\" and \"%s\". If either collation is nondeterministic, then both collations have to be the same." msgstr "キー列である参照元テーブルの\"%1$s\"と参照先テーブルの\"%2$s\"の照合順序に互換性がありません: %3$sと%4$s。いずれかの照合順序が非決定的である場合は両方の照合順序が同一である必要があります。" -#: commands/tablecmds.c:10663 +#: commands/tablecmds.c:10673 #, c-format msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "ON DELETE SETアクションで参照されている列\"%s\"は外部キーの一部である必要があります" -#: commands/tablecmds.c:11047 commands/tablecmds.c:11480 parser/parse_utilcmd.c:941 parser/parse_utilcmd.c:1086 +#: commands/tablecmds.c:11057 commands/tablecmds.c:11490 parser/parse_utilcmd.c:941 parser/parse_utilcmd.c:1086 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "外部テーブルでは外部キー制約はサポートされていません" -#: commands/tablecmds.c:11463 +#: commands/tablecmds.c:11473 #, c-format msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" msgstr "外部キー\"%2$s\"で参照されているため、テーブル\"%1$s\"を子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:11744 +#: commands/tablecmds.c:11754 #, c-format msgid "constraint \"%s\" enforceability conflicts with constraint \"%s\" on relation \"%s\"" msgstr "制約\"%1$s\"の強制性が、リレーション\"%3$s\"上の制約\"%2$s\"と競合しています" -#: commands/tablecmds.c:12206 +#: commands/tablecmds.c:12216 #, c-format msgid "constraint must be altered in child tables too" msgstr "制約は子テーブルでも変更される必要があります" -#: commands/tablecmds.c:12235 commands/tablecmds.c:12932 commands/tablecmds.c:14047 commands/tablecmds.c:14276 +#: commands/tablecmds.c:12245 commands/tablecmds.c:12950 commands/tablecmds.c:14068 commands/tablecmds.c:14297 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません" -#: commands/tablecmds.c:12242 +#: commands/tablecmds.c:12252 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は外部キー制約ではありません" -#: commands/tablecmds.c:12247 +#: commands/tablecmds.c:12257 #, c-format msgid "cannot alter enforceability of constraint \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の制約\"%1$s\"の強制性を変更できません" -#: commands/tablecmds.c:12253 +#: commands/tablecmds.c:12263 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a not-null constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は非NULL制約ではありません" -#: commands/tablecmds.c:12261 +#: commands/tablecmds.c:12269 +#, c-format +msgid "not-null constraint \"%s\" on partitioned table \"%s\" cannot be NO INHERIT" +msgstr "パーティション親テーブル\"%2$s\"に対する非NULL制約\"%1$s\"はNO INHERIT指定できません" + +#: commands/tablecmds.c:12277 #, c-format msgid "cannot alter inherited constraint \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"の継承された制約\"%1$s\"を変更できません" -#: commands/tablecmds.c:12301 +#: commands/tablecmds.c:12317 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"の制約\"%1$s\"を変更できません" -#: commands/tablecmds.c:12304 +#: commands/tablecmds.c:12320 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "制約\"%1$s\"は、リレーション\"%3$s\"上の制約\"%2$s\"から派生しています。" -#: commands/tablecmds.c:12306 +#: commands/tablecmds.c:12322 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "この制約の代わりに派生元の制約を変更することは可能です。" -#: commands/tablecmds.c:12941 +#: commands/tablecmds.c:12959 #, c-format msgid "cannot validate constraint \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の制約\"%1$s\"を検証できません" -#: commands/tablecmds.c:12943 +#: commands/tablecmds.c:12961 #, c-format msgid "This operation is not supported for this type of constraint." msgstr "この操作はこのタイプの制約に対してはサポートされていません。" -#: commands/tablecmds.c:12948 +#: commands/tablecmds.c:12966 #, c-format msgid "cannot validate NOT ENFORCED constraint" msgstr "NOT ENFORCED制約は検証できません" -#: commands/tablecmds.c:13157 commands/tablecmds.c:13257 +#: commands/tablecmds.c:13178 commands/tablecmds.c:13278 #, c-format msgid "constraint must be validated on child tables too" msgstr "制約は子テーブルでも検証される必要があります" -#: commands/tablecmds.c:13334 +#: commands/tablecmds.c:13355 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "外部キー制約で参照される列\"%s\"が存在しません" -#: commands/tablecmds.c:13340 +#: commands/tablecmds.c:13361 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "システム列は外部キーに使用できません" -#: commands/tablecmds.c:13344 +#: commands/tablecmds.c:13365 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "外部キーでは%dを超えるキーを持つことができません" -#: commands/tablecmds.c:13412 +#: commands/tablecmds.c:13433 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"には遅延可能プライマリキーは使用できません" -#: commands/tablecmds.c:13429 +#: commands/tablecmds.c:13450 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"にはプライマリキーがありません" -#: commands/tablecmds.c:13502 +#: commands/tablecmds.c:13523 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "外部キーの被参照列リストには重複があってはなりません" -#: commands/tablecmds.c:13605 +#: commands/tablecmds.c:13626 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"に対しては、遅延可能な一意性制約は使用できません" -#: commands/tablecmds.c:13610 +#: commands/tablecmds.c:13631 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"に、指定したキーに一致する一意性制約がありません" -#: commands/tablecmds.c:14051 +#: commands/tablecmds.c:14072 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/tablecmds.c:14096 +#: commands/tablecmds.c:14117 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承された制約\"%1$s\"を削除できません" -#: commands/tablecmds.c:14148 +#: commands/tablecmds.c:14169 #, c-format msgid "column \"%s\" is in a primary key" msgstr "列\"%s\"はプライマリキーで使用しています" -#: commands/tablecmds.c:14156 +#: commands/tablecmds.c:14177 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "列\"%s\"は複製識別として使用中のインデックスに含まれています" -#: commands/tablecmds.c:14389 +#: commands/tablecmds.c:14410 #, c-format msgid "cannot alter column type of typed table" msgstr "型付けされたテーブルの列の型を変更できません" -#: commands/tablecmds.c:14417 +#: commands/tablecmds.c:14438 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "生成列の型変更の際にはUSINGを指定することはできません" -#: commands/tablecmds.c:14429 +#: commands/tablecmds.c:14450 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "継承される列\"%s\"を変更できません" -#: commands/tablecmds.c:14438 +#: commands/tablecmds.c:14459 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"はリレーション\"%s\"のパーティションキーの一部であるため、変更できません" -#: commands/tablecmds.c:14493 +#: commands/tablecmds.c:14514 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"に対するUSING句の結果は自動的に%s型に型変換できません" -#: commands/tablecmds.c:14496 +#: commands/tablecmds.c:14517 #, c-format msgid "You might need to add an explicit cast." msgstr "必要に応じて明示的な型変換を追加してください。" -#: commands/tablecmds.c:14500 +#: commands/tablecmds.c:14521 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"は型%sには自動的に型変換できません" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:14504 +#: commands/tablecmds.c:14525 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "必要に応じて\"USING %s::%s\"を追加してください。" -#: commands/tablecmds.c:14607 +#: commands/tablecmds.c:14628 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承列\"%1$s\"は変更できません" -#: commands/tablecmds.c:14636 +#: commands/tablecmds.c:14657 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING式が行全体テーブル参照を含んでいます。" -#: commands/tablecmds.c:14647 +#: commands/tablecmds.c:14668 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "継承される列\"%s\"の型を子テーブルで変更しなければなりません" -#: commands/tablecmds.c:14772 +#: commands/tablecmds.c:14793 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "列\"%s\"の型を2回変更することはできません" -#: commands/tablecmds.c:14810 +#: commands/tablecmds.c:14831 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "カラム\"%s\"に対する生成式は自動的に%s型にキャストできません" -#: commands/tablecmds.c:14815 +#: commands/tablecmds.c:14836 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"のデフォルト値を自動的に%s型にキャストできません" -#: commands/tablecmds.c:15119 +#: commands/tablecmds.c:15140 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "関数またはプロシージャで使用される列の型は変更できません" -#: commands/tablecmds.c:15120 commands/tablecmds.c:15135 commands/tablecmds.c:15155 commands/tablecmds.c:15174 commands/tablecmds.c:15233 +#: commands/tablecmds.c:15141 commands/tablecmds.c:15156 commands/tablecmds.c:15176 commands/tablecmds.c:15195 commands/tablecmds.c:15254 #, c-format msgid "%s depends on column \"%s\"" msgstr "%sは列\"%s\"に依存しています" -#: commands/tablecmds.c:15134 +#: commands/tablecmds.c:15155 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "ビューまたはルールで使用される列の型は変更できません" -#: commands/tablecmds.c:15154 +#: commands/tablecmds.c:15175 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "トリガー定義で使用される列の型は変更できません" -#: commands/tablecmds.c:15173 +#: commands/tablecmds.c:15194 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "ポリシ定義で使用されている列の型は変更できません" -#: commands/tablecmds.c:15204 +#: commands/tablecmds.c:15225 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "生成カラムで使用される列の型は変更できません" -#: commands/tablecmds.c:15205 +#: commands/tablecmds.c:15226 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "カラム\"%s\"は生成カラム\"%s\"で使われています。" -#: commands/tablecmds.c:15232 +#: commands/tablecmds.c:15253 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "パブリケーションのWHERE句で使用される列の型は変更できません" -#: commands/tablecmds.c:16106 commands/tablecmds.c:16118 +#: commands/tablecmds.c:16127 commands/tablecmds.c:16139 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "インデックス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:16108 commands/tablecmds.c:16120 +#: commands/tablecmds.c:16129 commands/tablecmds.c:16141 #, c-format msgid "Change the ownership of the index's table instead." msgstr "代わりにインデックスのテーブルの所有者を変更してください。" -#: commands/tablecmds.c:16134 +#: commands/tablecmds.c:16155 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "シーケンス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:16159 +#: commands/tablecmds.c:16180 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "リレーション\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:16626 +#: commands/tablecmds.c:16647 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "SET TABLESPACEサブコマンドを複数指定できません" -#: commands/tablecmds.c:16705 +#: commands/tablecmds.c:16726 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "リレーション\"%s\"のオプションは設定できません" -#: commands/tablecmds.c:16739 commands/view.c:440 +#: commands/tablecmds.c:16760 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTIONは自動更新可能ビューでのみサポートされます" -#: commands/tablecmds.c:16992 +#: commands/tablecmds.c:17013 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "テーブルスペースにはテーブル、インデックスおよび実体化ビューしかありません" -#: commands/tablecmds.c:17004 +#: commands/tablecmds.c:17025 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "pg_globalテーブルスペースとの間のリレーションの移動はできません" -#: commands/tablecmds.c:17096 +#: commands/tablecmds.c:17117 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "リレーション\"%s.%s\"のロックが獲得できなかったため中断します" -#: commands/tablecmds.c:17112 +#: commands/tablecmds.c:17133 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "テーブルスペース\"%s\"には合致するリレーションはありませんでした" -#: commands/tablecmds.c:17234 +#: commands/tablecmds.c:17255 #, c-format msgid "cannot change inheritance of typed table" msgstr "型付けされたテーブルの継承を変更できません" -#: commands/tablecmds.c:17239 commands/tablecmds.c:17823 +#: commands/tablecmds.c:17260 commands/tablecmds.c:17844 #, c-format msgid "cannot change inheritance of a partition" msgstr "パーティションの継承は変更できません" -#: commands/tablecmds.c:17244 +#: commands/tablecmds.c:17265 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "パーティションテーブルの継承は変更できません" -#: commands/tablecmds.c:17291 +#: commands/tablecmds.c:17312 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "他のセッションの一時テーブルを継承できません" -#: commands/tablecmds.c:17304 +#: commands/tablecmds.c:17325 #, c-format msgid "cannot inherit from a partition" msgstr "パーティションからの継承はできません" -#: commands/tablecmds.c:17326 commands/tablecmds.c:20347 +#: commands/tablecmds.c:17347 commands/tablecmds.c:20368 #, c-format msgid "circular inheritance not allowed" msgstr "循環継承を行うことはできません" -#: commands/tablecmds.c:17327 commands/tablecmds.c:20348 +#: commands/tablecmds.c:17348 commands/tablecmds.c:20369 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\"はすでに\"%s\"の子です" -#: commands/tablecmds.c:17340 +#: commands/tablecmds.c:17361 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "トリガ\"%s\"によってテーブル\"%s\"が継承子テーブルになることができません" -#: commands/tablecmds.c:17342 +#: commands/tablecmds.c:17363 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "遷移テーブルを使用したROWトリガは継承関係ではサポートされていません。" -#: commands/tablecmds.c:17543 commands/tablecmds.c:17792 +#: commands/tablecmds.c:17564 commands/tablecmds.c:17813 #, c-format msgid "column \"%s\" in child table \"%s\" must be marked NOT NULL" msgstr "子テーブル\"%2$s\"の列\"%1$s\"は非NULLに設定されていません" -#: commands/tablecmds.c:17553 +#: commands/tablecmds.c:17574 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "子テーブルの列\"%s\"は生成列である必要があります" -#: commands/tablecmds.c:17557 +#: commands/tablecmds.c:17578 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "子テーブルの列\"%s\"は生成列であってはなりません" -#: commands/tablecmds.c:17603 +#: commands/tablecmds.c:17624 #, c-format msgid "child table is missing column \"%s\"" msgstr "子テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:17720 +#: commands/tablecmds.c:17741 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "子テーブル\"%s\"では検査制約\"%s\"に異なった定義がされています" -#: commands/tablecmds.c:17729 +#: commands/tablecmds.c:17750 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"上の継承されない制約と競合します" -#: commands/tablecmds.c:17740 +#: commands/tablecmds.c:17761 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"のNOT VALID制約と衝突しています" -#: commands/tablecmds.c:17751 +#: commands/tablecmds.c:17772 #, c-format msgid "constraint \"%s\" conflicts with NOT ENFORCED constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"のNOT ENFORCED制約と衝突しています" -#: commands/tablecmds.c:17800 +#: commands/tablecmds.c:17821 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "子テーブルには制約\"%s\"がありません" -#: commands/tablecmds.c:17887 +#: commands/tablecmds.c:17908 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "パーティション\"%s\"はすでにパーティションテーブル\"%s.%s\"からの取り外し保留中です" -#: commands/tablecmds.c:17916 commands/tablecmds.c:17964 +#: commands/tablecmds.c:17937 commands/tablecmds.c:17985 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "リレーション\"%s\"はリレーション\"%s\"のパーティション子テーブルではありません" -#: commands/tablecmds.c:17970 +#: commands/tablecmds.c:17991 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "リレーション\"%s\"はリレーション\"%s\"の親ではありません" -#: commands/tablecmds.c:18241 +#: commands/tablecmds.c:18262 #, c-format msgid "typed tables cannot inherit" msgstr "型付けされたテーブルは継承できません" -#: commands/tablecmds.c:18271 +#: commands/tablecmds.c:18292 #, c-format msgid "table is missing column \"%s\"" msgstr "テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:18282 +#: commands/tablecmds.c:18303 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "テーブルには列\"%s\"がありますが型は\"%s\"を必要としています" -#: commands/tablecmds.c:18291 +#: commands/tablecmds.c:18312 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "テーブル\"%s\"では列\"%s\"の型が異なっています" -#: commands/tablecmds.c:18305 +#: commands/tablecmds.c:18326 #, c-format msgid "table has extra column \"%s\"" msgstr "テーブルに余分な列\"%s\"があります" -#: commands/tablecmds.c:18357 +#: commands/tablecmds.c:18378 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\"は型付けされたテーブルではありません" -#: commands/tablecmds.c:18537 +#: commands/tablecmds.c:18558 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "非ユニークインデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:18543 +#: commands/tablecmds.c:18564 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "一意性を即時検査しないインデックス\"%s\"は複製識別には使用できません" -#: commands/tablecmds.c:18549 +#: commands/tablecmds.c:18570 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "式インデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:18555 +#: commands/tablecmds.c:18576 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "部分インデックス\"%s\"を複製識別としては使用できません" -#: commands/tablecmds.c:18572 +#: commands/tablecmds.c:18593 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "列%2$dはシステム列であるためインデックス\"%1$s\"は複製識別には使えません" -#: commands/tablecmds.c:18579 +#: commands/tablecmds.c:18600 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "列\"%2$s\"はnull可であるためインデックス\"%1$s\"は複製識別には使えません" -#: commands/tablecmds.c:18828 +#: commands/tablecmds.c:18849 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "テーブル\"%s\"は一時テーブルであるため、ログ出力設定を変更できません" -#: commands/tablecmds.c:18852 +#: commands/tablecmds.c:18873 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "テーブル\"%s\"はパブリケーションの一部であるため、UNLOGGEDに変更できません" -#: commands/tablecmds.c:18854 +#: commands/tablecmds.c:18875 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "UNLOGGEDリレーションはレプリケーションできません。" -#: commands/tablecmds.c:18899 +#: commands/tablecmds.c:18920 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "テーブル\"%s\"はUNLOGGEDテーブル\"%s\"を参照しているためLOGGEDには設定できません" -#: commands/tablecmds.c:18909 +#: commands/tablecmds.c:18930 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "テーブル\"%s\"はLOGGEDテーブル\"%s\"を参照しているためUNLOGGEDには設定できません" -#: commands/tablecmds.c:18973 +#: commands/tablecmds.c:18994 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "所有するシーケンスを他のスキーマに移動することができません" -#: commands/tablecmds.c:19081 +#: commands/tablecmds.c:19102 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "リレーション\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/tablecmds.c:19506 +#: commands/tablecmds.c:19527 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\"はテーブルや実体化ビューではありません" -#: commands/tablecmds.c:19659 +#: commands/tablecmds.c:19680 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\"は複合型ではありません" -#: commands/tablecmds.c:19689 +#: commands/tablecmds.c:19710 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "インデックス\"%s\"のスキーマを変更できません" -#: commands/tablecmds.c:19691 commands/tablecmds.c:19705 +#: commands/tablecmds.c:19712 commands/tablecmds.c:19726 #, c-format msgid "Change the schema of the table instead." msgstr "代わりにこのテーブルのスキーマを変更してください。" -#: commands/tablecmds.c:19695 +#: commands/tablecmds.c:19716 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "複合型%sのスキーマは変更できません" -#: commands/tablecmds.c:19703 +#: commands/tablecmds.c:19724 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "TOASTテーブル\"%s\"のスキーマは変更できません" -#: commands/tablecmds.c:19735 +#: commands/tablecmds.c:19756 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "\"list\"パーティションストラテジは2つ以上の列に対しては使えません" -#: commands/tablecmds.c:19801 +#: commands/tablecmds.c:19822 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "パーティションキーに指定されている列\"%s\"は存在しません" -#: commands/tablecmds.c:19809 +#: commands/tablecmds.c:19830 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "パーティションキーでシステム列\"%s\"は使用できません" -#: commands/tablecmds.c:19823 commands/tablecmds.c:19905 +#: commands/tablecmds.c:19844 commands/tablecmds.c:19926 #, c-format msgid "cannot use generated column in partition key" msgstr "パーティションキーで生成カラムは使用できません" -#: commands/tablecmds.c:19892 +#: commands/tablecmds.c:19913 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "パーティションキー式はシステム列への参照を含むことができません" -#: commands/tablecmds.c:19956 +#: commands/tablecmds.c:19977 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "パーティションキー式で使われる関数はIMMUTABLE指定されている必要があります" -#: commands/tablecmds.c:19965 +#: commands/tablecmds.c:19986 #, c-format msgid "cannot use constant expression as partition key" msgstr "定数式をパーティションキーとして使うことはできません" -#: commands/tablecmds.c:19986 +#: commands/tablecmds.c:20007 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "パーティション式で使用する照合順序を特定できませんでした" -#: commands/tablecmds.c:20021 +#: commands/tablecmds.c:20042 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "ハッシュ演算子クラスを指定するか、もしくはこのデータ型にデフォルトのハッシュ演算子クラスを定義する必要があります。" -#: commands/tablecmds.c:20027 +#: commands/tablecmds.c:20048 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "btree演算子クラスを指定するか、もしくはこのデータ型にデフォルトのbtree演算子クラスを定義するかする必要があります。" -#: commands/tablecmds.c:20287 +#: commands/tablecmds.c:20308 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\"はすでパーティションです" -#: commands/tablecmds.c:20293 +#: commands/tablecmds.c:20314 #, c-format msgid "cannot attach a typed table as partition" msgstr "型付けされたテーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:20309 +#: commands/tablecmds.c:20330 #, c-format msgid "cannot attach inheritance child as partition" msgstr "継承子テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:20323 +#: commands/tablecmds.c:20344 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "継承親テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:20357 +#: commands/tablecmds.c:20378 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "一時リレーションを永続リレーション \"%s\" のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:20365 +#: commands/tablecmds.c:20386 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "永続リレーションを一時リレーション\"%s\"のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:20373 +#: commands/tablecmds.c:20394 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "他セッションの一時リレーションのパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:20380 +#: commands/tablecmds.c:20401 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "他セッションの一時リレーションにパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:20400 +#: commands/tablecmds.c:20421 #, c-format msgid "table \"%s\" being attached contains an identity column \"%s\"" msgstr "アタッチ対象のテーブル\"%s\"には識別列\"%s\"が含まれています" -#: commands/tablecmds.c:20402 +#: commands/tablecmds.c:20423 #, c-format msgid "The new partition may not contain an identity column." msgstr "新しいパーティションは識別列を含むことはできません" -#: commands/tablecmds.c:20410 +#: commands/tablecmds.c:20431 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "テーブル\"%1$s\"は親テーブル\"%3$s\"にない列\"%2$s\"を含んでいます" -#: commands/tablecmds.c:20413 +#: commands/tablecmds.c:20434 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "新しいパーティションは親に存在する列のみを含むことができます。" -#: commands/tablecmds.c:20425 +#: commands/tablecmds.c:20446 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "トリガ\"%s\"のため、テーブル\"%s\"はパーティション子テーブルにはなれません" -#: commands/tablecmds.c:20427 +#: commands/tablecmds.c:20448 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "遷移テーブルを使用するROWトリガはパーティションではサポートされません。" -#: commands/tablecmds.c:20609 +#: commands/tablecmds.c:20630 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "外部テーブル\"%s\"はパーティションテーブル\"%s\"の子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:20612 +#: commands/tablecmds.c:20633 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "パーティション親テーブル\"%s\"はユニークインデックスを持っています。" -#: commands/tablecmds.c:20936 +#: commands/tablecmds.c:20957 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "デフォルトパーティションを持つパーティションは並列的に取り外しはできません" -#: commands/tablecmds.c:21048 +#: commands/tablecmds.c:21069 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" -#: commands/tablecmds.c:21054 +#: commands/tablecmds.c:21075 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "パーティション子テーブル\\\"%s\\\"は同時に削除されました" -#: commands/tablecmds.c:21685 commands/tablecmds.c:21705 commands/tablecmds.c:21726 commands/tablecmds.c:21745 commands/tablecmds.c:21794 +#: commands/tablecmds.c:21709 commands/tablecmds.c:21729 commands/tablecmds.c:21750 commands/tablecmds.c:21769 commands/tablecmds.c:21826 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "インデックス\"%s\"をインデックス\"%s\"の子インデックスとしてアタッチすることはできません" -#: commands/tablecmds.c:21688 +#: commands/tablecmds.c:21712 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "インデックス\"%s\"はすでに別のインデックスにアタッチされています。" -#: commands/tablecmds.c:21708 +#: commands/tablecmds.c:21732 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "インデックス\"%s\"はテーブル\"%s\"のどの子テーブルのインデックスでもありません。" -#: commands/tablecmds.c:21729 +#: commands/tablecmds.c:21753 #, c-format msgid "The index definitions do not match." msgstr "インデックス定義が合致しません。" -#: commands/tablecmds.c:21748 +#: commands/tablecmds.c:21772 #, 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:21797 +#: commands/tablecmds.c:21829 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "子テーブル\"%s\"にはすでに他のインデックスがアタッチされています。" -#: commands/tablecmds.c:21920 +#: commands/tablecmds.c:21952 #, c-format msgid "invalid primary key definition" msgstr "不正な主キー定義" -#: commands/tablecmds.c:21921 +#: commands/tablecmds.c:21953 #, c-format msgid "Column \"%s\" of relation \"%s\" is not marked NOT NULL." msgstr "リレーション\"%2$s\"の列\"%1$s\"は非NULLに設定されていません。" -#: commands/tablecmds.c:22056 +#: commands/tablecmds.c:22088 #, c-format msgid "column data type %s does not support compression" msgstr "列データ型%sは圧縮をサポートしていません" -#: commands/tablecmds.c:22063 +#: commands/tablecmds.c:22095 #, c-format msgid "invalid compression method \"%s\"" msgstr "無効な圧縮方式\"%s\"" -#: commands/tablecmds.c:22089 +#: commands/tablecmds.c:22121 #, c-format msgid "invalid storage type \"%s\"" msgstr "不正な格納タイプ\"%s\"" -#: commands/tablecmds.c:22099 +#: commands/tablecmds.c:22131 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "列のデータ型%sは格納タイプPLAINしか取ることができません" @@ -12169,12 +12208,12 @@ msgstr "トリガ\"%s\"の実行前には、この行はパーティション\"% msgid "cannot collect transition tuples from child foreign tables" msgstr "外部子テーブルからは遷移タプルを収集できません" -#: commands/trigger.c:3402 executor/nodeModifyTable.c:1687 executor/nodeModifyTable.c:1761 executor/nodeModifyTable.c:2569 executor/nodeModifyTable.c:2659 executor/nodeModifyTable.c:3322 executor/nodeModifyTable.c:3514 +#: commands/trigger.c:3402 executor/nodeModifyTable.c:1687 executor/nodeModifyTable.c:1761 executor/nodeModifyTable.c:2569 executor/nodeModifyTable.c:2659 executor/nodeModifyTable.c:3322 executor/nodeModifyTable.c:3519 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "他の行への変更を伝搬させるためにBEFOREトリガではなくAFTERトリガの使用を検討してください" -#: commands/trigger.c:3444 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:389 executor/nodeModifyTable.c:1703 executor/nodeModifyTable.c:2585 executor/nodeModifyTable.c:2810 +#: commands/trigger.c:3444 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:389 executor/nodeModifyTable.c:1703 executor/nodeModifyTable.c:2585 executor/nodeModifyTable.c:2810 executor/nodeModifyTable.c:3360 #, c-format msgid "could not serialize access due to concurrent update" msgstr "更新が同時に行われたためアクセスの直列化ができませんでした" @@ -12304,7 +12343,7 @@ msgstr "基本型を作成するにはスーパーユーザーである必要が msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "最初に型をシェル型として生成して、続いてI/O関数を生成した後に完全な CREATE TYPE を実行してください。" -#: commands/typecmds.c:331 commands/typecmds.c:1494 commands/typecmds.c:4479 +#: commands/typecmds.c:331 commands/typecmds.c:1501 commands/typecmds.c:4486 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "型の属性\"%s\"は不明です" @@ -12324,7 +12363,7 @@ msgstr "%sを配列要素の型にすることはできません" msgid "alignment \"%s\" not recognized" msgstr "アライメント\"%s\"は不明です" -#: commands/typecmds.c:454 commands/typecmds.c:4353 +#: commands/typecmds.c:454 commands/typecmds.c:4360 #, c-format msgid "storage \"%s\" not recognized" msgstr "格納方式\"%s\"は不明です" @@ -12414,247 +12453,247 @@ msgstr "ドメインではGENERATEDの指定はサポートしていません" msgid "specifying constraint enforceability not supported for domains" msgstr "ドメインでは制約の強制性指定はサポートしていません" -#: commands/typecmds.c:1361 utils/cache/typcache.c:2757 +#: commands/typecmds.c:1361 utils/cache/typcache.c:2750 #, c-format msgid "%s is not an enum" msgstr "%s は数値ではありません" -#: commands/typecmds.c:1502 +#: commands/typecmds.c:1509 #, c-format msgid "type attribute \"subtype\" is required" msgstr "型の属性\"subtype\"が必要です" -#: commands/typecmds.c:1507 +#: commands/typecmds.c:1514 #, c-format msgid "range subtype cannot be %s" msgstr "範囲の派生元型を%sにすることはできません" -#: commands/typecmds.c:1526 +#: commands/typecmds.c:1533 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "範囲の照合順序が指定されましたが、派生もと型が照合順序をサポートしていません" -#: commands/typecmds.c:1536 +#: commands/typecmds.c:1543 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "事前にシェル型を生成せずに正規化関数を指定することはできません" -#: commands/typecmds.c:1537 +#: commands/typecmds.c:1544 #, c-format msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "最初に型をシェル型として生成して、続いて正規化関数を生成した後に完全な CREATE TYPE を実行してください。" -#: commands/typecmds.c:2013 +#: commands/typecmds.c:2020 #, c-format msgid "type input function %s has multiple matches" msgstr "型の入力関数%sが複数合致します" -#: commands/typecmds.c:2031 +#: commands/typecmds.c:2038 #, c-format msgid "type input function %s must return type %s" msgstr "型の入力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2047 +#: commands/typecmds.c:2054 #, c-format msgid "type input function %s should not be volatile" msgstr "型の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2075 +#: commands/typecmds.c:2082 #, c-format msgid "type output function %s must return type %s" msgstr "型の出力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2082 +#: commands/typecmds.c:2089 #, c-format msgid "type output function %s should not be volatile" msgstr "型の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2111 +#: commands/typecmds.c:2118 #, c-format msgid "type receive function %s has multiple matches" msgstr "型の受信関数 %s が複数合致しました" -#: commands/typecmds.c:2129 +#: commands/typecmds.c:2136 #, c-format msgid "type receive function %s must return type %s" msgstr "型の受信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2136 +#: commands/typecmds.c:2143 #, c-format msgid "type receive function %s should not be volatile" msgstr "型の受信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2164 +#: commands/typecmds.c:2171 #, c-format msgid "type send function %s must return type %s" msgstr "型の送信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2171 +#: commands/typecmds.c:2178 #, c-format msgid "type send function %s should not be volatile" msgstr "型の送信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2198 +#: commands/typecmds.c:2205 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2205 +#: commands/typecmds.c:2212 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "型修正子の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2232 +#: commands/typecmds.c:2239 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2239 +#: commands/typecmds.c:2246 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "型修正子の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2266 +#: commands/typecmds.c:2273 #, c-format msgid "type analyze function %s must return type %s" msgstr "型のANALYZE関数%sは%s型を返す必要があります" -#: commands/typecmds.c:2295 +#: commands/typecmds.c:2302 #, c-format msgid "type subscripting function %s must return type %s" msgstr "型の添字処理関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2305 +#: commands/typecmds.c:2312 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "ユーザー定義型は添字処理関数%sを使用できません" -#: commands/typecmds.c:2351 +#: commands/typecmds.c:2358 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "この範囲型に演算子クラスを指定するか、派生元の型でデフォルト演算子クラスを定義する必要があります。" -#: commands/typecmds.c:2382 +#: commands/typecmds.c:2389 #, c-format msgid "range canonical function %s must return range type" msgstr "範囲の正規化関数 %s は範囲型を返す必要があります" -#: commands/typecmds.c:2388 +#: commands/typecmds.c:2395 #, c-format msgid "range canonical function %s must be immutable" msgstr "範囲の正規化関数 %s は不変関数でなければなりません" -#: commands/typecmds.c:2424 +#: commands/typecmds.c:2431 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "範囲の派生元の型の差分関数 %s は %s型を返す必要があります" -#: commands/typecmds.c:2431 +#: commands/typecmds.c:2438 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "範囲の派生元の型の差分関数 %s は不変関数である必要があります" -#: commands/typecmds.c:2458 +#: commands/typecmds.c:2465 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_typeの配列型OIDが設定されていません" -#: commands/typecmds.c:2491 +#: commands/typecmds.c:2498 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_typeの複範囲型OIDの値が設定されていません" -#: commands/typecmds.c:2524 +#: commands/typecmds.c:2531 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_typeの複範囲配列型OIDの値が設定されていません" -#: commands/typecmds.c:2906 commands/typecmds.c:3088 +#: commands/typecmds.c:2913 commands/typecmds.c:3095 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は存在しません" -#: commands/typecmds.c:2910 +#: commands/typecmds.c:2917 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/typecmds.c:3095 +#: commands/typecmds.c:3102 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は検査制約ではありません" -#: commands/typecmds.c:3175 +#: commands/typecmds.c:3182 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "テーブル\"%2$s\"の列\"%1$s\"にNULL値があります" -#: commands/typecmds.c:3264 +#: commands/typecmds.c:3271 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "テーブル\"%2$s\"の列\"%1$s\"に新しい制約に違反する値があります" -#: commands/typecmds.c:3493 commands/typecmds.c:3771 commands/typecmds.c:3856 commands/typecmds.c:4072 +#: commands/typecmds.c:3500 commands/typecmds.c:3778 commands/typecmds.c:3863 commands/typecmds.c:4079 #, c-format msgid "%s is not a domain" msgstr "%s はドメインではありません" -#: commands/typecmds.c:3527 commands/typecmds.c:3683 +#: commands/typecmds.c:3534 commands/typecmds.c:3690 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"はすでに存在します" -#: commands/typecmds.c:3578 +#: commands/typecmds.c:3585 #, c-format msgid "cannot use table references in domain check constraint" msgstr "ドメインの検査制約ではテーブル参照を使用できません" -#: commands/typecmds.c:3783 commands/typecmds.c:3868 commands/typecmds.c:4222 +#: commands/typecmds.c:3790 commands/typecmds.c:3875 commands/typecmds.c:4229 #, c-format msgid "%s is a table's row type" msgstr "%sはテーブルの行型です" -#: commands/typecmds.c:3793 commands/typecmds.c:3878 commands/typecmds.c:4120 +#: commands/typecmds.c:3800 commands/typecmds.c:3885 commands/typecmds.c:4127 #, c-format msgid "cannot alter array type %s" msgstr "配列型%sを変更できません" -#: commands/typecmds.c:3795 commands/typecmds.c:3880 commands/typecmds.c:4122 +#: commands/typecmds.c:3802 commands/typecmds.c:3887 commands/typecmds.c:4129 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "型%sを変更することができます。これは同時にその配列型も変更します。" -#: commands/typecmds.c:3891 +#: commands/typecmds.c:3898 #, c-format msgid "cannot alter multirange type %s" msgstr "複範囲型%sを変更できません" -#: commands/typecmds.c:3894 +#: commands/typecmds.c:3901 #, c-format msgid "You can alter type %s, which will alter the multirange type as well." msgstr "型%sを変更することができます。これは同時にその複範囲型も変更します。" -#: commands/typecmds.c:4201 +#: commands/typecmds.c:4208 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "型\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/typecmds.c:4381 +#: commands/typecmds.c:4388 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "型の格納方式をPLAINには変更できません" -#: commands/typecmds.c:4474 +#: commands/typecmds.c:4481 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "型の属性\"%s\"は変更できません" -#: commands/typecmds.c:4492 +#: commands/typecmds.c:4499 #, c-format msgid "must be superuser to alter a type" msgstr "型の変更を行うにはスーパーユーザーである必要があります" -#: commands/typecmds.c:4513 commands/typecmds.c:4522 +#: commands/typecmds.c:4520 commands/typecmds.c:4529 #, c-format msgid "%s is not a base type" msgstr "\"%s\"は基本型ではありません" @@ -13068,20 +13107,29 @@ msgstr "パーティション親テーブル\"%s\"に対する VACUUM ONLY は msgid "cutoff for removing and freezing tuples is far in the past" msgstr "タプルの削除およびフリーズのカットオフ値が古すぎます" -#: commands/vacuum.c:1184 commands/vacuum.c:1189 +#: commands/vacuum.c:1184 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "" "周回問題を回避するためにすぐに実行中のトランザクションを終了してください。\n" -"古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除が必要な場合もあります。" +"古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除も必要かもしれません。" #: commands/vacuum.c:1188 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "マルチトランザクションのフリーズのカットオフ値が古すぎます" +#: commands/vacuum.c:1189 +#, c-format +msgid "" +"Close open transactions soon to avoid wraparound problems.\n" +"You might also need to commit or roll back old prepared transactions." +msgstr "" +"周回問題を回避するためにすぐに実行中のトランザクションを終了してください。\n" +"古い準備済みトランザクションのコミットまたはロールバックも必要かもしれません。" + #: commands/vacuum.c:1950 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" @@ -13335,17 +13383,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:3093 +#: executor/execCurrent.c:280 executor/execExprInterp.c:3101 #, 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:3105 +#: executor/execCurrent.c:292 executor/execExprInterp.c:3113 #, c-format msgid "no value found for parameter %d" msgstr "パラメータ%dの値がありません" -#: executor/execExpr.c:667 executor/execExpr.c:674 executor/execExpr.c:680 executor/execExprInterp.c:5439 executor/execExprInterp.c:5456 executor/execExprInterp.c:5555 executor/nodeModifyTable.c:211 executor/nodeModifyTable.c:230 executor/nodeModifyTable.c:247 executor/nodeModifyTable.c:257 executor/nodeModifyTable.c:267 +#: executor/execExpr.c:667 executor/execExpr.c:674 executor/execExpr.c:680 executor/execExprInterp.c:5510 executor/execExprInterp.c:5527 executor/execExprInterp.c:5626 executor/nodeModifyTable.c:211 executor/nodeModifyTable.c:230 executor/nodeModifyTable.c:247 executor/nodeModifyTable.c:257 executor/nodeModifyTable.c:267 #, c-format msgid "table row type and query-specified row type do not match" msgstr "テーブルの行型と問い合わせで指定した行型が一致しません" @@ -13360,7 +13408,7 @@ msgstr "問い合わせの列が多すぎます" msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "問い合わせで %d 番目に削除される列の値を指定しています。" -#: executor/execExpr.c:681 executor/execExprInterp.c:5457 executor/nodeModifyTable.c:258 +#: executor/execExpr.c:681 executor/execExprInterp.c:5528 executor/nodeModifyTable.c:258 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "テーブルでは %2$d 番目の型は %1$s ですが、問い合わせでは %3$s を想定しています。" @@ -13401,135 +13449,135 @@ msgstr "添字をサポートしないため、型%sには添字をつけられ msgid "type %s does not support subscripted assignment" msgstr "型%sは添字を使った代入をサポートしません" -#: executor/execExprInterp.c:2415 +#: executor/execExprInterp.c:2423 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "%2$s型の属性%1$dが削除されています" -#: executor/execExprInterp.c:2421 +#: executor/execExprInterp.c:2429 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "型%2$sの属性%1$dの型が間違っています" -#: executor/execExprInterp.c:2423 executor/execExprInterp.c:3782 executor/execExprInterp.c:3828 +#: executor/execExprInterp.c:2431 executor/execExprInterp.c:3790 executor/execExprInterp.c:3836 #, c-format msgid "Table has type %s, but query expects %s." msgstr "テーブルの型は%sですが、問い合わせでは%sを想定しています。" -#: executor/execExprInterp.c:2503 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1841 utils/cache/typcache.c:2000 utils/cache/typcache.c:2147 utils/fmgr/funcapi.c:569 +#: executor/execExprInterp.c:2511 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1834 utils/cache/typcache.c:1993 utils/cache/typcache.c:2140 utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" msgstr "型%sは複合型ではありません" -#: executor/execExprInterp.c:3266 +#: executor/execExprInterp.c:3274 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "このタイプのテーブルではWHERE CURRENT OFをサポートしません" -#: executor/execExprInterp.c:3479 +#: executor/execExprInterp.c:3487 #, c-format msgid "cannot merge incompatible arrays" msgstr "互換性がない配列をマージできません" -#: executor/execExprInterp.c:3480 +#: executor/execExprInterp.c:3488 #, 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:3501 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3515 utils/adt/arrayfuncs.c:5611 utils/adt/arrayfuncs.c:6130 utils/adt/arraysubs.c:151 utils/adt/arraysubs.c:489 +#: executor/execExprInterp.c:3509 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3515 utils/adt/arrayfuncs.c:5620 utils/adt/arrayfuncs.c:6137 utils/adt/arraysubs.c:151 utils/adt/arraysubs.c:489 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "配列の次数(%d)が上限(%d)を超えています" -#: executor/execExprInterp.c:3521 executor/execExprInterp.c:3556 +#: executor/execExprInterp.c:3529 executor/execExprInterp.c:3564 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "多次元配列の配列式の次数があっていなければなりません" -#: executor/execExprInterp.c:3533 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 utils/adt/arrayfuncs.c:2618 utils/adt/arrayfuncs.c:2634 utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 utils/adt/arrayfuncs.c:3545 utils/adt/arrayfuncs.c:5383 -#: utils/adt/arrayfuncs.c:6222 utils/adt/arrayfuncs.c:6566 utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 utils/adt/arrayutils.c:99 +#: executor/execExprInterp.c:3541 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 utils/adt/arrayfuncs.c:2618 utils/adt/arrayfuncs.c:2634 utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 utils/adt/arrayfuncs.c:3545 utils/adt/arrayfuncs.c:5383 +#: utils/adt/arrayfuncs.c:6229 utils/adt/arrayfuncs.c:6573 utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 utils/adt/arrayutils.c:99 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "配列の次数が上限(%d)を超えています" -#: executor/execExprInterp.c:3781 executor/execExprInterp.c:3827 +#: executor/execExprInterp.c:3789 executor/execExprInterp.c:3835 #, c-format msgid "attribute %d has wrong type" msgstr "属性%dの型が間違っています" -#: executor/execExprInterp.c:4413 utils/adt/domains.c:158 +#: executor/execExprInterp.c:4484 utils/adt/domains.c:158 #, c-format msgid "domain %s does not allow null values" msgstr "ドメイン%sはnull値を許しません" -#: executor/execExprInterp.c:4428 utils/adt/domains.c:196 +#: executor/execExprInterp.c:4499 utils/adt/domains.c:196 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "ドメイン%sの値が検査制約\"%s\"に違反しています" -#: executor/execExprInterp.c:5003 +#: executor/execExprInterp.c:5074 #, c-format msgid "no SQL/JSON item found for specified path of column \"%s\"" msgstr "列\"%s\"の指定されたパスに対応するSQL/JSON項目が見つかりません" -#: executor/execExprInterp.c:5008 +#: executor/execExprInterp.c:5079 #, c-format msgid "no SQL/JSON item found for specified path" msgstr "指定されたパスに対応するSQL/JSON項目が見つかりません" #. translator: first %s is a SQL/JSON clause (e.g. ON ERROR) -#: executor/execExprInterp.c:5208 executor/execExprInterp.c:5216 +#: executor/execExprInterp.c:5279 executor/execExprInterp.c:5287 #, c-format msgid "could not coerce %s expression (%s) to the RETURNING type" msgstr "%s式(%s)をRETURNING型に強制変換できませんでした" -#: executor/execExprInterp.c:5440 +#: executor/execExprInterp.c:5511 #, 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:5556 executor/execSRF.c:977 +#: executor/execExprInterp.c:5627 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "序数位置%dの削除された属性における物理格納形式が一致しません。" -#: executor/execIndexing.c:608 +#: executor/execIndexing.c:609 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT は遅延可なユニーク制約/排除制約の調停主体としての指定をサポートしません" -#: executor/execIndexing.c:911 +#: executor/execIndexing.c:919 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "排除制約\"%s\"を作成できませんでした" -#: executor/execIndexing.c:914 +#: executor/execIndexing.c:922 #, c-format msgid "Key %s conflicts with key %s." msgstr "キー %s がキー %s と競合しています" -#: executor/execIndexing.c:916 +#: executor/execIndexing.c:924 #, c-format msgid "Key conflicts exist." msgstr "キーの競合が存在します" -#: executor/execIndexing.c:922 +#: executor/execIndexing.c:930 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "重複キーの値が排除制約\"%s\"に違反しています" -#: executor/execIndexing.c:925 +#: executor/execIndexing.c:933 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "キー %s が既存のキー %s と競合しています" -#: executor/execIndexing.c:927 +#: executor/execIndexing.c:935 #, c-format msgid "Key conflicts with existing key." msgstr "キーが既存のキーと衝突しています" -#: executor/execIndexing.c:1172 +#: executor/execIndexing.c:1180 #, c-format msgid "empty WITHOUT OVERLAPS value found in column \"%s\" in relation \"%s\"" msgstr "リレーション\"%2$s\"の列\"%1$s\"に空のWITHOUT OVERLAPS値が見つかりました" @@ -13887,7 +13935,7 @@ msgstr "最後のステートメントが返す列が少なすぎます。" msgid "return type %s is not supported for SQL functions" msgstr "戻り値型%sはSQL関数でサポートされていません" -#: executor/nodeAgg.c:4039 executor/nodeWindowAgg.c:3041 +#: executor/nodeAgg.c:4039 executor/nodeWindowAgg.c:3089 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "集約%uは入力データ型と遷移用の型間で互換性が必要です" @@ -13973,7 +14021,7 @@ msgid "Consider defining the foreign key on table \"%s\"." msgstr "テーブル\"%s\"上に外部キー制約を定義することを検討してください。" #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2788 executor/nodeModifyTable.c:3328 executor/nodeModifyTable.c:3520 +#: executor/nodeModifyTable.c:2788 executor/nodeModifyTable.c:3328 executor/nodeModifyTable.c:3525 #, c-format msgid "%s command cannot affect row a second time" msgstr "%sコマンドは単一の行に2度は適用できません" @@ -13983,17 +14031,17 @@ msgstr "%sコマンドは単一の行に2度は適用できません" msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "同じコマンドでの挿入候補の行が同じ制約値を持つことがないようにしてください" -#: executor/nodeModifyTable.c:3321 executor/nodeModifyTable.c:3513 +#: executor/nodeModifyTable.c:3321 executor/nodeModifyTable.c:3518 #, c-format msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" msgstr "更新または削除対象のタプルは、現在のコマンドによって発火した操作トリガーによってすでに更新されています" -#: executor/nodeModifyTable.c:3330 executor/nodeModifyTable.c:3522 +#: executor/nodeModifyTable.c:3330 executor/nodeModifyTable.c:3527 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "ソース行が2行以上ターゲット行に合致しないようにしてください。" -#: executor/nodeModifyTable.c:3399 +#: executor/nodeModifyTable.c:3404 #, c-format msgid "tuple to be merged was already moved to another partition due to concurrent update" msgstr "マージ対象のタプルは同時に行われた更新によってすでに他の子テーブルに移動されています" @@ -14038,32 +14086,32 @@ msgstr "列\"%s\"のフィルタがnullです。" msgid "null is not allowed in column \"%s\"" msgstr "列\"%s\"でnullは許可されません" -#: executor/nodeWindowAgg.c:356 +#: executor/nodeWindowAgg.c:357 #, c-format msgid "moving-aggregate transition function must not return null" msgstr "移動集約の推移関数はnullを返却してはなりません" -#: executor/nodeWindowAgg.c:2106 +#: executor/nodeWindowAgg.c:2154 #, c-format msgid "frame starting offset must not be null" msgstr "フレームの開始オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2120 +#: executor/nodeWindowAgg.c:2168 #, c-format msgid "frame starting offset must not be negative" msgstr "フレームの開始オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2133 +#: executor/nodeWindowAgg.c:2181 #, c-format msgid "frame ending offset must not be null" msgstr "フレームの終了オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2147 +#: executor/nodeWindowAgg.c:2195 #, c-format msgid "frame ending offset must not be negative" msgstr "フレームの終了オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2957 +#: executor/nodeWindowAgg.c:3005 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "集約関数 %s はウィンドウ関数としての使用をサポートしていません" @@ -14114,7 +14162,7 @@ msgstr "カーソルで%s問い合わせを開くことができません" msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHAREはサポートされていません" -#: executor/spi.c:1719 parser/analyze.c:3077 +#: executor/spi.c:1719 parser/analyze.c:3093 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "スクロール可能カーソルは読み取り専用である必要があります。" @@ -14294,7 +14342,7 @@ msgstr "CREATE OR REPLACE CONSTRAINT TRIGGERはサポートされません" msgid "duplicate trigger events specified" msgstr "重複したトリガーイベントが指定されました" -#: gram.y:6229 parser/parse_utilcmd.c:3946 parser/parse_utilcmd.c:3972 +#: gram.y:6229 parser/parse_utilcmd.c:3955 parser/parse_utilcmd.c:3981 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "INITIALLY DEFERREDと宣言された制約はDEFERRABLEでなければなりません" @@ -14468,7 +14516,7 @@ msgstr "WITH TIESはORDER BY句なしでは指定できません" msgid "improper use of \"*\"" msgstr "\"*\"の使い方が不適切です" -#: gram.y:18905 gram.y:18922 tsearch/spell.c:963 tsearch/spell.c:979 tsearch/spell.c:995 tsearch/spell.c:1011 tsearch/spell.c:1076 +#: gram.y:18905 gram.y:18922 tsearch/spell.c:972 tsearch/spell.c:989 tsearch/spell.c:1006 tsearch/spell.c:1023 tsearch/spell.c:1088 #, c-format msgid "syntax error" msgstr "構文エラー" @@ -14613,7 +14661,7 @@ msgstr "ファイル\"%s\"の行%uのトークン\"%s\"近辺で構文エラー msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "多くの構文エラーがありました。ファイル\"%s\"を断念します" -#: jsonpath_gram.y:268 jsonpath_gram.y:600 jsonpath_scan.l:617 jsonpath_scan.l:628 jsonpath_scan.l:638 jsonpath_scan.l:690 utils/adt/encode.c:513 utils/adt/encode.c:578 utils/adt/jsonfuncs.c:661 utils/adt/varlena.c:341 utils/adt/varlena.c:382 +#: jsonpath_gram.y:268 jsonpath_gram.y:600 jsonpath_scan.l:617 jsonpath_scan.l:628 jsonpath_scan.l:638 jsonpath_scan.l:690 utils/adt/encode.c:513 utils/adt/encode.c:578 utils/adt/jsonfuncs.c:661 utils/adt/varlena.c:342 utils/adt/varlena.c:383 #, c-format msgid "invalid input syntax for type %s" msgstr "%s型に対する不正な入力構文" @@ -14650,7 +14698,7 @@ msgstr "不正な16進文字列" msgid "unexpected end after backslash" msgstr "バックスラッシュの後の想定外の終了" -#: jsonpath_scan.l:201 repl_scanner.l:217 scan.l:742 +#: jsonpath_scan.l:201 repl_scanner.l:221 scan.l:742 msgid "unterminated quoted string" msgstr "文字列の引用符が閉じていません" @@ -15959,12 +16007,12 @@ msgstr "他のパスワードタイプへの移行の詳細についてはPostgr msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "ユーザー\"%s\"のパスワードはMD5認証で使用不能です。" -#: libpq/crypt.c:237 libpq/crypt.c:279 libpq/crypt.c:299 +#: libpq/crypt.c:238 libpq/crypt.c:280 libpq/crypt.c:301 #, c-format msgid "Password does not match for user \"%s\"." msgstr "ユーザー\"%s\"のパスワードが合致しません。" -#: libpq/crypt.c:318 +#: libpq/crypt.c:320 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "ユーザー\"%s\"のパスワードは識別不能な形式です。" @@ -16443,7 +16491,7 @@ msgstr "クライアント接続がありません" msgid "could not receive data from client: %m" msgstr "クライアントからデータを受信できませんでした: %m" -#: libpq/pqcomm.c:1151 tcop/postgres.c:4500 +#: libpq/pqcomm.c:1151 tcop/postgres.c:4504 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "プロトコルの同期が失われたためコネクションを終了します" @@ -16488,7 +16536,7 @@ msgstr "%s(%s)はサポートされていません" msgid "no data left in message" msgstr "メッセージ内にデータが残っていません" -#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 utils/adt/array_userfuncs.c:873 utils/adt/arrayfuncs.c:1481 utils/adt/rowtypes.c:613 +#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 utils/adt/array_userfuncs.c:874 utils/adt/arrayfuncs.c:1481 utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" msgstr "メッセージ内に残るデータが不十分です" @@ -16797,12 +16845,12 @@ msgstr "拡張可能ノードタイプ\"%s\"はすでに存在します" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\"は登録されていません" -#: nodes/makefuncs.c:154 nodes/makefuncs.c:180 statistics/extended_stats.c:2286 +#: nodes/makefuncs.c:154 nodes/makefuncs.c:180 statistics/extended_stats.c:2296 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "リレーション\"%s\"は複合型を持っていません" -#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2602 parser/parse_coerce.c:2740 parser/parse_coerce.c:2787 parser/parse_expr.c:2130 parser/parse_func.c:710 parser/parse_oper.c:869 utils/adt/array_userfuncs.c:1950 utils/fmgr/funcapi.c:669 +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2601 parser/parse_coerce.c:2739 parser/parse_coerce.c:2786 parser/parse_expr.c:2130 parser/parse_func.c:710 parser/parse_oper.c:869 utils/adt/array_userfuncs.c:1959 utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "データ型%sの配列型がありませんでした" @@ -16822,54 +16870,54 @@ msgstr "パラメータを持つ無名ポータル: %s" msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN はマージ結合可能もしくはハッシュ結合可能な場合のみサポートされています" -#: optimizer/plan/createplan.c:7321 parser/parse_merge.c:203 rewrite/rewriteHandler.c:1692 +#: optimizer/plan/createplan.c:7321 parser/parse_merge.c:203 rewrite/rewriteHandler.c:1725 #, c-format msgid "cannot execute MERGE on relation \"%s\"" msgstr "リレーション\"%s\"に対してMERGEは実行できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1755 +#: optimizer/plan/initsplan.c:1806 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "外部結合のNULL可な側では%sを適用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1512 parser/analyze.c:1815 parser/analyze.c:2074 parser/analyze.c:3396 +#: optimizer/plan/planner.c:1754 parser/analyze.c:1823 parser/analyze.c:2082 parser/analyze.c:3412 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "UNION/INTERSECT/EXCEPTでは%sを使用できません" -#: optimizer/plan/planner.c:2258 optimizer/plan/planner.c:4144 +#: optimizer/plan/planner.c:2500 optimizer/plan/planner.c:4386 #, c-format msgid "could not implement GROUP BY" msgstr "GROUP BY を実行できませんでした" -#: optimizer/plan/planner.c:2259 optimizer/plan/planner.c:4145 optimizer/plan/planner.c:4826 optimizer/prep/prepunion.c:1073 +#: optimizer/plan/planner.c:2501 optimizer/plan/planner.c:4387 optimizer/plan/planner.c:5068 optimizer/prep/prepunion.c:1073 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "一部のデータ型がハッシュのみをサポートする一方で、別の型はソートのみをサポートしています。" -#: optimizer/plan/planner.c:4825 +#: optimizer/plan/planner.c:5067 #, c-format msgid "could not implement DISTINCT" msgstr "DISTINCTを実行できませんでした" -#: optimizer/plan/planner.c:6322 +#: optimizer/plan/planner.c:6564 #, c-format msgid "could not implement window PARTITION BY" msgstr "ウィンドウの PARTITION BY を実行できませんでした" -#: optimizer/plan/planner.c:6323 +#: optimizer/plan/planner.c:6565 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "ウィンドウ分割に使用する列は、ソート可能なデータ型でなければなりません。" -#: optimizer/plan/planner.c:6327 +#: optimizer/plan/planner.c:6569 #, c-format msgid "could not implement window ORDER BY" msgstr "ウィンドウの ORDER BY を実行できませんでした" -#: optimizer/plan/planner.c:6328 +#: optimizer/plan/planner.c:6570 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "ウィンドウの順序付けをする列は、ソート可能なデータ型でなければなりません。" @@ -16900,7 +16948,7 @@ msgstr "リレーション\"%2$s\"の属性\"%1$s\"は親での型と一致し msgid "attribute \"%s\" of relation \"%s\" does not match parent's collation" msgstr "リレーション\"%2$s\"の属性\"%1$s\"は親での照合順序と一致していません" -#: optimizer/util/clauses.c:4965 +#: optimizer/util/clauses.c:4968 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL関数\"%s\"のインライン化処理中" @@ -16930,232 +16978,237 @@ msgstr "ON CONFLICT DO UPDATEでの排除制約の使用はサポートされて msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "ON CONFLICT 指定に合致するユニーク制約または排除制約がありません" -#: parser/analyze.c:869 parser/analyze.c:1594 +#: parser/analyze.c:582 parser/analyze.c:2501 +#, c-format +msgid "WHERE CURRENT OF on a view is not implemented" +msgstr "ビューに対するWHERE CURRENT OFは実装されていません" + +#: parser/analyze.c:877 parser/analyze.c:1602 #, c-format msgid "VALUES lists must all be the same length" msgstr "VALUESリストはすべて同じ長さでなければなりません" -#: parser/analyze.c:1071 +#: parser/analyze.c:1079 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERTに対象列よりも多くの式があります" -#: parser/analyze.c:1089 +#: parser/analyze.c:1097 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERTに式よりも多くの対象列があります" -#: parser/analyze.c:1093 +#: parser/analyze.c:1101 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "挿入ソースがINSERTが期待するのと同じ列数を含む行表現になっています。うっかり余計なカッコをつけたりしませんでしたか?" -#: parser/analyze.c:1401 parser/analyze.c:1788 +#: parser/analyze.c:1409 parser/analyze.c:1796 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "ここではSELECT ... INTOは許可されません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1717 parser/analyze.c:3628 +#: parser/analyze.c:1725 parser/analyze.c:3644 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%sをVALUESに使用できません" -#: parser/analyze.c:1955 +#: parser/analyze.c:1963 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "不正なUNION/INTERSECT/EXCEPT ORDER BY句です" -#: parser/analyze.c:1956 +#: parser/analyze.c:1964 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "式や関数ではなく、結果列の名前のみが使用できます。" -#: parser/analyze.c:1957 +#: parser/analyze.c:1965 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "式/関数をすべてのSELECTにつけてください。またはこのUNIONをFROM句に移動してください。" -#: parser/analyze.c:2064 +#: parser/analyze.c:2072 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTOはUNION/INTERSECT/EXCEPTの最初のSELECTでのみ使用できます" -#: parser/analyze.c:2136 +#: parser/analyze.c:2144 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "UNION/INTERSECT/EXCEPTの要素となる文では同一問い合わせレベルの他のリレーションを参照できません" -#: parser/analyze.c:2223 +#: parser/analyze.c:2231 #, c-format msgid "each %s query must have the same number of columns" msgstr "すべての%s問い合わせは同じ列数を返す必要があります" -#: parser/analyze.c:2580 +#: parser/analyze.c:2596 #, c-format msgid "SET target columns cannot be qualified with the relation name." msgstr "SETの対象列はリレーション名で修飾することはできません。" #. translator: %s is OLD or NEW -#: parser/analyze.c:2668 parser/analyze.c:2678 +#: parser/analyze.c:2684 parser/analyze.c:2694 #, c-format msgid "%s cannot be specified multiple times" msgstr "%s は複数回指定できません" -#: parser/analyze.c:2690 parser/parse_relation.c:473 +#: parser/analyze.c:2706 parser/parse_relation.c:473 #, c-format msgid "table name \"%s\" specified more than once" msgstr "テーブル名\"%s\"が複数指定されました" -#: parser/analyze.c:2738 +#: parser/analyze.c:2754 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNINGには少なくとも1つの列が必要です" -#: parser/analyze.c:2840 +#: parser/analyze.c:2856 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "代入元が%d個の列を返しました" -#: parser/analyze.c:2901 +#: parser/analyze.c:2917 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "変数\"%s\"は型%sですが、式は型%sでした" #. translator: %s is a SQL keyword -#: parser/analyze.c:3027 parser/analyze.c:3035 +#: parser/analyze.c:3043 parser/analyze.c:3051 #, c-format msgid "cannot specify both %s and %s" msgstr "%sと%sの両方を同時には指定できません" -#: parser/analyze.c:3055 +#: parser/analyze.c:3071 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR では WITH にデータを変更する文を含んではなりません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3063 +#: parser/analyze.c:3079 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %sはサポートされていません" -#: parser/analyze.c:3066 +#: parser/analyze.c:3082 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "保持可能カーソルは読み取り専用である必要があります。" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3074 +#: parser/analyze.c:3090 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %sはサポートされていません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3085 +#: parser/analyze.c:3101 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %sはが不正です" -#: parser/analyze.c:3088 +#: parser/analyze.c:3104 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "INSENSITIVEカーソルは読み取り専用である必要があります。" -#: parser/analyze.c:3182 +#: parser/analyze.c:3198 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "実体化ビューではWITH句にデータを変更する文を含んではなりません" -#: parser/analyze.c:3192 +#: parser/analyze.c:3208 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "実体化ビューでは一時テーブルやビューを使用してはいけません" -#: parser/analyze.c:3202 +#: parser/analyze.c:3218 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "実体化ビューは境界パラメータを用いて定義してはなりません" -#: parser/analyze.c:3214 +#: parser/analyze.c:3230 #, c-format msgid "materialized views cannot be unlogged" msgstr "実体化ビューをログ非取得にはできません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3403 +#: parser/analyze.c:3419 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "DISTINCT句では%sを使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3410 +#: parser/analyze.c:3426 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "GROUP BY句で%sを使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3417 +#: parser/analyze.c:3433 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "HAVING 句では%sを使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3424 +#: parser/analyze.c:3440 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "集約関数では%sは使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3431 +#: parser/analyze.c:3447 #, c-format msgid "%s is not allowed with window functions" msgstr "ウィンドウ関数では%sは使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3438 +#: parser/analyze.c:3454 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "ターゲットリストの中では%sを集合返却関数と一緒に使うことはできません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3537 +#: parser/analyze.c:3553 #, c-format msgid "%s must specify unqualified relation names" msgstr "%sでは非修飾のリレーション名を指定してください" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3601 +#: parser/analyze.c:3617 #, c-format msgid "%s cannot be applied to a join" msgstr "%sを結合に使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3610 +#: parser/analyze.c:3626 #, c-format msgid "%s cannot be applied to a function" msgstr "%sを関数に使用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3619 +#: parser/analyze.c:3635 #, c-format msgid "%s cannot be applied to a table function" msgstr "%sはテーブル関数には適用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3637 +#: parser/analyze.c:3653 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%sはWITH問い合わせには適用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3646 +#: parser/analyze.c:3662 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%sは名前付きタプルストアには適用できません" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3666 +#: parser/analyze.c:3682 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "%2$s句のリレーション\"%1$s\"はFROM句にありません" @@ -17473,27 +17526,27 @@ msgstr "ウィンドウ\"%s\"は存在しません" msgid "too many grouping sets present (maximum 4096)" msgstr "グルーピングセットの数が多すぎます (最大4096)" -#: parser/parse_agg.c:1329 +#: parser/parse_agg.c:1331 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "再帰問い合わせの再帰項では集約関数を使用できません" -#: parser/parse_agg.c:1552 +#: parser/parse_agg.c:1554 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "列\"%s.%s\"はGROUP BY句で指定するか、集約関数内で使用しなければなりません" -#: parser/parse_agg.c:1555 +#: parser/parse_agg.c:1557 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "順序集合集約の直接引数はグルーピングされた列のみを使用しなければなりません。" -#: parser/parse_agg.c:1560 +#: parser/parse_agg.c:1562 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "外部問い合わせから副問い合わせがグループ化されていない列\"%s.%s\"を使用しています" -#: parser/parse_agg.c:1725 +#: parser/parse_agg.c:1727 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "GROUPINGの引数は関連するクエリレベルのグルーピング式でなければなりません" @@ -17503,7 +17556,7 @@ msgstr "GROUPINGの引数は関連するクエリレベルのグルーピング msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "リレーション\"%s\"は更新文の対象にはなれません" -#: parser/parse_clause.c:567 parser/parse_clause.c:595 parser/parse_func.c:2553 +#: parser/parse_clause.c:567 parser/parse_clause.c:595 parser/parse_func.c:2551 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "集合返却関数はFROMの最上位レベルにある必要があります" @@ -17768,148 +17821,148 @@ msgstr "offset PRECEDING/FOLLOWING を伴った RANGE は列型 %s とオフセ msgid "Cast the offset value to the exact intended type." msgstr "オフセット値を意図した型そのものにキャストしてください。" -#: parser/parse_coerce.c:1048 parser/parse_coerce.c:1086 parser/parse_coerce.c:1104 parser/parse_coerce.c:1119 parser/parse_expr.c:2164 parser/parse_expr.c:2784 parser/parse_expr.c:3435 parser/parse_expr.c:3664 parser/parse_target.c:1001 +#: parser/parse_coerce.c:1047 parser/parse_coerce.c:1085 parser/parse_coerce.c:1103 parser/parse_coerce.c:1118 parser/parse_expr.c:2164 parser/parse_expr.c:2784 parser/parse_expr.c:3435 parser/parse_expr.c:3664 parser/parse_expr.c:4100 parser/parse_target.c:1001 #, c-format msgid "cannot cast type %s to %s" msgstr "型%sから%sへの型変換ができません" -#: parser/parse_coerce.c:1089 +#: parser/parse_coerce.c:1088 #, c-format msgid "Input has too few columns." msgstr "入力列が少なすぎます。" -#: parser/parse_coerce.c:1107 +#: parser/parse_coerce.c:1106 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "列%3$dで型%1$sから%2$sへの型変換ができません。" -#: parser/parse_coerce.c:1122 +#: parser/parse_coerce.c:1121 #, c-format msgid "Input has too many columns." msgstr "入力列が多すぎます。" #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1177 parser/parse_coerce.c:1225 +#: parser/parse_coerce.c:1176 parser/parse_coerce.c:1224 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "%1$sの引数は型%3$sではなく%2$s型でなければなりません" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1188 parser/parse_coerce.c:1237 +#: parser/parse_coerce.c:1187 parser/parse_coerce.c:1236 #, c-format 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:1418 +#: parser/parse_coerce.c:1417 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%sの型%sと%sを一致させることができません" -#: parser/parse_coerce.c:1534 +#: parser/parse_coerce.c:1533 #, 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:1586 +#: parser/parse_coerce.c:1585 #, c-format msgid "%s could not convert type %s to %s" msgstr "%sで型%sから%sへ変換できませんでした" -#: parser/parse_coerce.c:2189 parser/parse_coerce.c:2209 parser/parse_coerce.c:2229 parser/parse_coerce.c:2250 parser/parse_coerce.c:2305 parser/parse_coerce.c:2339 +#: parser/parse_coerce.c:2188 parser/parse_coerce.c:2208 parser/parse_coerce.c:2228 parser/parse_coerce.c:2249 parser/parse_coerce.c:2304 parser/parse_coerce.c:2338 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "\"%s\"と宣言された引数が全て同じでありません" -#: parser/parse_coerce.c:2284 parser/parse_coerce.c:2397 utils/fmgr/funcapi.c:600 +#: parser/parse_coerce.c:2283 parser/parse_coerce.c:2396 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:2317 parser/parse_coerce.c:2467 utils/fmgr/funcapi.c:614 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2466 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:2351 parser/parse_coerce.c:2431 parser/parse_coerce.c:2564 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 +#: parser/parse_coerce.c:2350 parser/parse_coerce.c:2430 parser/parse_coerce.c:2563 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:2388 +#: parser/parse_coerce.c:2387 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "\"anyarray\"型の引数の要素型を決定できません" -#: parser/parse_coerce.c:2414 parser/parse_coerce.c:2445 parser/parse_coerce.c:2484 parser/parse_coerce.c:2550 +#: parser/parse_coerce.c:2413 parser/parse_coerce.c:2444 parser/parse_coerce.c:2483 parser/parse_coerce.c:2549 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "%sと宣言された引数と%sと宣言された引数とで整合性がありません" -#: parser/parse_coerce.c:2509 +#: parser/parse_coerce.c:2508 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "入力型が%sであったため多様型が特定できませんでした" -#: parser/parse_coerce.c:2523 +#: parser/parse_coerce.c:2522 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "anynonarrayと照合されたは配列型です: %s" -#: parser/parse_coerce.c:2533 +#: parser/parse_coerce.c:2532 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "anyenumと照合された型は列挙型ではありません: %s" -#: parser/parse_coerce.c:2594 +#: parser/parse_coerce.c:2593 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "anycompatible系の引数を共通の型にキャストできません" -#: parser/parse_coerce.c:2612 parser/parse_coerce.c:2633 parser/parse_coerce.c:2683 parser/parse_coerce.c:2688 parser/parse_coerce.c:2752 parser/parse_coerce.c:2764 +#: parser/parse_coerce.c:2611 parser/parse_coerce.c:2632 parser/parse_coerce.c:2682 parser/parse_coerce.c:2687 parser/parse_coerce.c:2751 parser/parse_coerce.c:2763 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "入力型が%2$sであるため多様型%1$sが特定できませんでした" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2621 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "anycompatiblerange型%sはanycompatiblerange型%sと合致しません" -#: parser/parse_coerce.c:2643 +#: parser/parse_coerce.c:2642 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "anycompatiblemultirange型%sはanycompatible型%sと合致しません" -#: parser/parse_coerce.c:2657 +#: parser/parse_coerce.c:2656 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "anycompatiblenonarrayに対応する型が配列型です: %s" -#: parser/parse_coerce.c:2892 +#: parser/parse_coerce.c:2891 #, 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:2909 +#: parser/parse_coerce.c:2908 #, 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:2921 +#: parser/parse_coerce.c:2920 #, 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:2933 +#: parser/parse_coerce.c:2932 #, 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:2963 +#: parser/parse_coerce.c:2962 msgid "A result of type internal requires at least one input of type internal." msgstr "internal型の返却値には少なくとも1つのinternal型の入力が必要です。" @@ -18103,7 +18156,7 @@ msgstr "問い合わせ\"%s\"への再帰参照が2回以上現れてはなり msgid "DEFAULT is not allowed in this context" msgstr "この文脈ではDEFAULTは使えません" -#: parser/parse_expr.c:405 parser/parse_relation.c:3797 parser/parse_relation.c:3807 parser/parse_relation.c:3825 parser/parse_relation.c:3832 parser/parse_relation.c:3846 +#: parser/parse_expr.c:405 parser/parse_relation.c:3829 parser/parse_relation.c:3839 parser/parse_relation.c:3857 parser/parse_relation.c:3864 parser/parse_relation.c:3878 #, c-format msgid "column %s.%s does not exist" msgstr "列%s.%sは存在しません" @@ -18136,7 +18189,7 @@ msgstr "列参照はDEFAULT式では使用できません" msgid "cannot use column reference in partition bound expression" msgstr "列参照はパーティション境界式では使用できません" -#: parser/parse_expr.c:845 parser/parse_relation.c:848 parser/parse_relation.c:930 parser/parse_target.c:1241 +#: parser/parse_expr.c:845 parser/parse_relation.c:880 parser/parse_relation.c:962 parser/parse_target.c:1241 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "列参照\"%s\"は曖昧です" @@ -18174,7 +18227,7 @@ msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() ex msgstr "複数列のUPDATE項目のソースは副問合せまたはROW()式でなければなりません" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1770 parser/parse_expr.c:2263 parser/parse_func.c:2679 +#: parser/parse_expr.c:1770 parser/parse_expr.c:2263 parser/parse_func.c:2677 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "集合返却関数は%sでは使用できません" @@ -18371,55 +18424,55 @@ msgstr "SQL/JSON関数では疑似型の返却はサポートされていませ msgid "aggregate ORDER BY is not implemented for window functions" msgstr "ウィンドウ関数に対する集約の ORDER BY は実装されていません" -#: parser/parse_expr.c:4102 +#: parser/parse_expr.c:4112 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" msgstr "bytrea以外の入力型に対しては JSON FORMAT ENCODING句は使用できません" -#: parser/parse_expr.c:4122 +#: parser/parse_expr.c:4132 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "JSON述語では型%sを使用できません" -#: parser/parse_expr.c:4148 parser/parse_expr.c:4269 +#: parser/parse_expr.c:4158 parser/parse_expr.c:4279 #, c-format msgid "cannot use type %s in RETURNING clause of %s" msgstr "%s()のRETURNING節では型%sは指定できません" -#: parser/parse_expr.c:4150 +#: parser/parse_expr.c:4160 #, c-format msgid "Try returning json or jsonb." msgstr "jsonまたはjsonbでの返却を試してください。" -#: parser/parse_expr.c:4198 +#: parser/parse_expr.c:4208 #, c-format msgid "cannot use non-string types with WITH UNIQUE KEYS clause" msgstr "非文字列型はWITH UNIQUE KEYS句とともには使用できません" -#: parser/parse_expr.c:4272 +#: parser/parse_expr.c:4282 #, c-format msgid "Try returning a string type or bytea." msgstr "文字列型またはBYTEA型での返却を試してください。" -#: parser/parse_expr.c:4340 +#: parser/parse_expr.c:4350 #, c-format msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" msgstr "%s()のRETURNING節ではFORMAT JSONは指定できません" -#: parser/parse_expr.c:4353 +#: parser/parse_expr.c:4363 #, c-format msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" msgstr "WITH WRAPPERが使われてるときにはSQL/JSONのQUOTESの挙動は指定できまえん" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4367 parser/parse_expr.c:4396 parser/parse_expr.c:4427 parser/parse_expr.c:4453 parser/parse_expr.c:4479 parser/parse_jsontable.c:92 +#: parser/parse_expr.c:4377 parser/parse_expr.c:4406 parser/parse_expr.c:4437 parser/parse_expr.c:4463 parser/parse_expr.c:4489 parser/parse_jsontable.c:92 #, c-format msgid "invalid %s behavior" msgstr "不正な%s挙動指定" #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), #. second %s is a SQL/JSON function name (e.g. JSON_QUERY) -#: parser/parse_expr.c:4370 parser/parse_expr.c:4399 +#: parser/parse_expr.c:4380 parser/parse_expr.c:4409 #, c-format msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s." msgstr "%2$sに対する%1$s句ではERROR, NULL, EMPTY ARRAY, EMPTY OBJECTまたはDEFAULT式のみが使用可能です。" @@ -18427,72 +18480,72 @@ msgstr "%2$sに対する%1$s句ではERROR, NULL, EMPTY ARRAY, EMPTY OBJECTま #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) #. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4377 parser/parse_expr.c:4406 parser/parse_expr.c:4435 parser/parse_expr.c:4463 parser/parse_expr.c:4489 +#: parser/parse_expr.c:4387 parser/parse_expr.c:4416 parser/parse_expr.c:4445 parser/parse_expr.c:4473 parser/parse_expr.c:4499 #, c-format msgid "invalid %s behavior for column \"%s\"" msgstr "列\"%s\"に対する不正な%s挙動指定" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4380 parser/parse_expr.c:4409 +#: parser/parse_expr.c:4390 parser/parse_expr.c:4419 #, c-format msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns." msgstr "フォーマット化対象列に対する%s句ではERROR, NULL, EMPTY ARRAY, EMPTY OBJECTまたはDEFAULT式のみが使用可能です。" -#: parser/parse_expr.c:4428 +#: parser/parse_expr.c:4438 #, c-format msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." msgstr "%2$sに対する%1$s句ではERROR, TRUE, FALSEまたはUNKNOWNのみが使用可能です。" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4438 +#: parser/parse_expr.c:4448 #, c-format msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." msgstr "EXIST列に対する%s句ではERROR, TRUE, FALSEまたはUNKNOWNのみが使用可能です。" #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), #. second %s is a SQL/JSON function name (e.g. JSON_QUERY) -#: parser/parse_expr.c:4456 parser/parse_expr.c:4482 +#: parser/parse_expr.c:4466 parser/parse_expr.c:4492 #, c-format msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." msgstr "%2$sに対する%1$s句ではERROR, NULLまたはDEFAULT式のみが使用可能です。" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4466 parser/parse_expr.c:4492 +#: parser/parse_expr.c:4476 parser/parse_expr.c:4502 #, c-format msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." msgstr "スカラー列に対する%s句ではERROR, NULLまたはDEFAULT式のみが使用可能です。" -#: parser/parse_expr.c:4526 +#: parser/parse_expr.c:4536 #, c-format msgid "JSON path expression must be of type %s, not of type %s" msgstr "JSONパス式は型%2$sではなく%1$s型でなければなりません" -#: parser/parse_expr.c:4766 +#: parser/parse_expr.c:4776 #, c-format msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" msgstr "DEFAULTには定数、非集約関数、および演算子式のみ指定可能です" -#: parser/parse_expr.c:4771 +#: parser/parse_expr.c:4781 #, c-format msgid "DEFAULT expression must not contain column references" msgstr "DEFAULT式は列参照を含むことができません" -#: parser/parse_expr.c:4776 +#: parser/parse_expr.c:4786 #, c-format msgid "DEFAULT expression must not return a set" msgstr "DEFAULT式は集合を返してはなりません" -#: parser/parse_expr.c:4791 +#: parser/parse_expr.c:4801 #, c-format msgid "collation of DEFAULT expression conflicts with RETURNING clause" msgstr "DEFAULT式の照合順序がRETURNING句と競合しています" -#: parser/parse_expr.c:4870 parser/parse_expr.c:4879 +#: parser/parse_expr.c:4880 parser/parse_expr.c:4889 #, c-format msgid "cannot cast behavior expression of type %s to %s" msgstr "型%sの挙動式の%sへの型変換はできません" -#: parser/parse_expr.c:4873 +#: parser/parse_expr.c:4883 #, c-format msgid "You will need to explicitly cast the expression to type %s." msgstr "式を%s型に明示的にキャストする必要があります。" @@ -18507,7 +18560,7 @@ msgstr "引数名\"%s\"が複数回指定されました" msgid "positional argument cannot follow named argument" msgstr "位置パラメーターの次には名前付きの引数を指定できません。" -#: parser/parse_func.c:287 parser/parse_func.c:2368 +#: parser/parse_func.c:287 parser/parse_func.c:2366 #, c-format msgid "%s is not a procedure" msgstr "%sはプロシージャではありません" @@ -18624,7 +18677,7 @@ msgstr "最善の候補関数を選択できませんでした。明示的な型 msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "指定した名前と引数型に合致する集約関数がありません。おそらく ORDER BY の位置に誤りがあります。ORDER BY は集約関数のすべての通常の引数の後になければなりません。" -#: parser/parse_func.c:622 parser/parse_func.c:2411 +#: parser/parse_func.c:622 parser/parse_func.c:2409 #, c-format msgid "procedure %s does not exist" msgstr "プロシージャ %s は存在しません" @@ -18679,152 +18732,152 @@ msgstr "集約関数の呼び出しに集合返却関数の呼び出しを含む msgid "window functions cannot return sets" msgstr "ウィンドウ関数は集合を返すことができません" -#: parser/parse_func.c:2167 parser/parse_func.c:2440 +#: parser/parse_func.c:2165 parser/parse_func.c:2438 #, c-format msgid "could not find a function named \"%s\"" msgstr "\"%s\"という名前の関数は見つかりませんでした" -#: parser/parse_func.c:2181 parser/parse_func.c:2458 +#: parser/parse_func.c:2179 parser/parse_func.c:2456 #, c-format msgid "function name \"%s\" is not unique" msgstr "関数名\"%s\"は一意ではありません" -#: parser/parse_func.c:2183 parser/parse_func.c:2461 +#: parser/parse_func.c:2181 parser/parse_func.c:2459 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "関数を曖昧さなく選択するには引数リストを指定してください。" -#: parser/parse_func.c:2227 +#: parser/parse_func.c:2225 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "プロシージャは%d個以上の引数を取ることはできません" -#: parser/parse_func.c:2358 +#: parser/parse_func.c:2356 #, c-format msgid "%s is not a function" msgstr "%s は関数ではありません" -#: parser/parse_func.c:2378 +#: parser/parse_func.c:2376 #, c-format msgid "function %s is not an aggregate" msgstr "関数%sは集約ではありません" -#: parser/parse_func.c:2406 +#: parser/parse_func.c:2404 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "\"%s\"という名前のプロシージャは見つかりませんでした" -#: parser/parse_func.c:2420 +#: parser/parse_func.c:2418 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "\"%s\"という名前の集約は見つかりませんでした" -#: parser/parse_func.c:2425 +#: parser/parse_func.c:2423 #, c-format msgid "aggregate %s(*) does not exist" msgstr "集約%s(*)は存在しません" -#: parser/parse_func.c:2430 +#: parser/parse_func.c:2428 #, c-format msgid "aggregate %s does not exist" msgstr "集約%sは存在しません" -#: parser/parse_func.c:2466 +#: parser/parse_func.c:2464 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "プロシージャ名\"%s\"は一意ではありません" -#: parser/parse_func.c:2469 +#: parser/parse_func.c:2467 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "プロシージャを曖昧さなく選択するには引数リストを指定してください。" -#: parser/parse_func.c:2474 +#: parser/parse_func.c:2472 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "集約名\"%s\"は一意ではありません" -#: parser/parse_func.c:2477 +#: parser/parse_func.c:2475 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "集約を曖昧さなく選択するには引数リストを指定してください。" -#: parser/parse_func.c:2482 +#: parser/parse_func.c:2480 #, c-format msgid "routine name \"%s\" is not unique" msgstr "ルーチン名\"%s\"は一意ではありません" -#: parser/parse_func.c:2485 +#: parser/parse_func.c:2483 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "ルーチンを曖昧さなく選択するには引数リストを指定してください。" -#: parser/parse_func.c:2540 +#: parser/parse_func.c:2538 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "集合返却関数はJOIN条件では使用できません" -#: parser/parse_func.c:2561 +#: parser/parse_func.c:2559 msgid "set-returning functions are not allowed in policy expressions" msgstr "集合返却関数はポリシ式では使用できません" -#: parser/parse_func.c:2577 +#: parser/parse_func.c:2575 msgid "set-returning functions are not allowed in window definitions" msgstr "ウィンドウ定義では集合返却関数は使用できません" -#: parser/parse_func.c:2615 +#: parser/parse_func.c:2613 msgid "set-returning functions are not allowed in MERGE WHEN conditions" msgstr "集合返却関数はMERGE WHEN条件では使用できません" -#: parser/parse_func.c:2619 +#: parser/parse_func.c:2617 msgid "set-returning functions are not allowed in check constraints" msgstr "集合返却関数は検査制約の中では使用できません" -#: parser/parse_func.c:2623 +#: parser/parse_func.c:2621 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "集合返却関数はDEFAULT式の中では使用できません" -#: parser/parse_func.c:2626 +#: parser/parse_func.c:2624 msgid "set-returning functions are not allowed in index expressions" msgstr "集合返却関数はインデックス式では使用できません" -#: parser/parse_func.c:2629 +#: parser/parse_func.c:2627 msgid "set-returning functions are not allowed in index predicates" msgstr "集合返却関数はインデックス述語では使用できません" -#: parser/parse_func.c:2632 +#: parser/parse_func.c:2630 msgid "set-returning functions are not allowed in statistics expressions" msgstr "集合返却関数は統計情報式では使用できません" -#: parser/parse_func.c:2635 +#: parser/parse_func.c:2633 msgid "set-returning functions are not allowed in transform expressions" msgstr "集合返却関数は変換式では使用できません" -#: parser/parse_func.c:2638 +#: parser/parse_func.c:2636 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "集合返却関数はEXECUTEパラメータでは使用できません" -#: parser/parse_func.c:2641 +#: parser/parse_func.c:2639 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "集合返却関数はトリガのWHEN条件では使用できません" -#: parser/parse_func.c:2644 +#: parser/parse_func.c:2642 msgid "set-returning functions are not allowed in partition bound" msgstr "集合返却関数はパーティション境界では使用できません" -#: parser/parse_func.c:2647 +#: parser/parse_func.c:2645 msgid "set-returning functions are not allowed in partition key expressions" msgstr "集合返却関数はパーティションキー式では使用できません" -#: parser/parse_func.c:2650 +#: parser/parse_func.c:2648 msgid "set-returning functions are not allowed in CALL arguments" msgstr "CALLの引数に集合返却関数は使用できません" -#: parser/parse_func.c:2653 +#: parser/parse_func.c:2651 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "集合返却関数は COPY FROM の WHERE条件では使用できません" -#: parser/parse_func.c:2656 +#: parser/parse_func.c:2654 msgid "set-returning functions are not allowed in column generation expressions" msgstr "集合返却関数はカラム生成式では使用できません" @@ -18918,7 +18971,7 @@ msgstr "演算子 ANY/ALL (配列) 集合を返してはなりません" msgid "inconsistent types deduced for parameter $%d" msgstr "パラメータ$%dについて推定された型が不整合です" -#: parser/parse_param.c:310 tcop/postgres.c:734 +#: parser/parse_param.c:310 tcop/postgres.c:735 #, c-format msgid "could not determine data type of parameter $%d" msgstr "パラメータ$%dのデータ型が特定できませんでした" @@ -18933,12 +18986,12 @@ msgstr "テーブル参照\"%s\"は曖昧です" msgid "table reference %u is ambiguous" msgstr "テーブル参照%uは曖昧です" -#: parser/parse_relation.c:502 parser/parse_relation.c:3739 parser/parse_relation.c:3748 +#: parser/parse_relation.c:502 parser/parse_relation.c:3771 parser/parse_relation.c:3780 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "テーブル\"%s\"用のFROM句に対する不正な参照" -#: parser/parse_relation.c:506 parser/parse_relation.c:3750 +#: parser/parse_relation.c:506 parser/parse_relation.c:3782 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "テーブル\"%s\"の項目がありますが、問い合わせのこの部分からは参照できません。\"" @@ -18948,142 +19001,142 @@ msgstr "テーブル\"%s\"の項目がありますが、問い合わせのこの msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "LATERAL参照では組み合わせる結合のタイプはINNERまたはLEFTでなければなりません" -#: parser/parse_relation.c:711 +#: parser/parse_relation.c:743 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "検査制約で参照されるシステム列\"%s\"は不正です" -#: parser/parse_relation.c:724 +#: parser/parse_relation.c:756 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "カラム生成式ではシステム列\"%s\"は使用できません" -#: parser/parse_relation.c:735 +#: parser/parse_relation.c:767 #, c-format msgid "cannot use system column \"%s\" in MERGE WHEN condition" msgstr "MERGE WHEN条件ではシステム列\"%s\"は使用できません" -#: parser/parse_relation.c:1251 parser/parse_relation.c:1708 parser/parse_relation.c:2402 +#: parser/parse_relation.c:1283 parser/parse_relation.c:1740 parser/parse_relation.c:2434 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "テーブル\"%s\"では%d列使用できますが、%d列指定されました" -#: parser/parse_relation.c:1462 +#: parser/parse_relation.c:1494 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "\"%s\"というWITH項目はありますが、これは問い合わせのこの部分からは参照できません。" -#: parser/parse_relation.c:1464 +#: parser/parse_relation.c:1496 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "WITH RECURSIVE を使うか、もしくは WITH 項目の場所を変えて前方参照をなくしてください" -#: parser/parse_relation.c:1850 +#: parser/parse_relation.c:1882 #, c-format msgid "a column definition list is redundant for a function with OUT parameters" msgstr "OUTパラメータを持つ関数に対しては列定義リストは不要です" -#: parser/parse_relation.c:1856 +#: parser/parse_relation.c:1888 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" msgstr "名前付き複合型w返す関数に対しては列定義リストは不要です" -#: parser/parse_relation.c:1863 +#: parser/parse_relation.c:1895 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "列定義リストは\"record\"を返す関数でのみ使用できます" -#: parser/parse_relation.c:1874 +#: parser/parse_relation.c:1906 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "\"record\"を返す関数では列定義リストが必要です" -#: parser/parse_relation.c:1911 +#: parser/parse_relation.c:1943 #, c-format msgid "column definition lists can have at most %d entries" msgstr "列定義リストは最大でも%dエントリまでしか持てません" -#: parser/parse_relation.c:1971 +#: parser/parse_relation.c:2003 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "FROM句の関数\"%s\"の戻り値型%sはサポートされていません" -#: parser/parse_relation.c:1998 parser/parse_relation.c:2083 +#: parser/parse_relation.c:2030 parser/parse_relation.c:2115 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "FROM内の関数は最大%d列までしか返却できません" -#: parser/parse_relation.c:2113 +#: parser/parse_relation.c:2145 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "%s関数では%d列使用できますが、%d列指定されました" -#: parser/parse_relation.c:2194 +#: parser/parse_relation.c:2226 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUESリスト\"%s\"は%d列使用可能ですが、%d列が指定されました" -#: parser/parse_relation.c:2259 +#: parser/parse_relation.c:2291 #, c-format msgid "joins can have at most %d columns" msgstr "JOIN で指定できるのは、最大 %d 列です" -#: parser/parse_relation.c:2284 +#: parser/parse_relation.c:2316 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "結合式\"%s\"では%d列使用できますが、%d列指定されました" -#: parser/parse_relation.c:2375 +#: parser/parse_relation.c:2407 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH 問い合わせ\"%s\"にRETURNING句がありません" -#: parser/parse_relation.c:3741 +#: parser/parse_relation.c:3773 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "テーブル別名\"%s\"を参照しようとしていたようです。" -#: parser/parse_relation.c:3753 +#: parser/parse_relation.c:3785 #, c-format msgid "To reference that table, you must mark this subquery with LATERAL." msgstr "そのテーブルを参照するためには、この副問合せをLATERALとマークする必要があります。" -#: parser/parse_relation.c:3759 +#: parser/parse_relation.c:3791 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "テーブル\"%s\"用のFROM句エントリがありません" -#: parser/parse_relation.c:3799 +#: parser/parse_relation.c:3831 #, c-format msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." msgstr "\"%s\"という名前の列はありますが、問い合わせのこの部分からは参照できないテーブルに属しています。" -#: parser/parse_relation.c:3801 +#: parser/parse_relation.c:3833 #, c-format msgid "Try using a table-qualified name." msgstr "テーブル名で修飾した名前を試してください。" -#: parser/parse_relation.c:3809 +#: parser/parse_relation.c:3841 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "テーブル\"%2$s\"には\"%1$s\"という名前の列がありますが、問い合わせのこの部分からは参照できません。" -#: parser/parse_relation.c:3812 +#: parser/parse_relation.c:3844 #, c-format msgid "To reference that column, you must mark this subquery with LATERAL." msgstr "その列を参照するには、この副問合せをLATERALとマークする必要があります。" -#: parser/parse_relation.c:3814 +#: parser/parse_relation.c:3846 #, c-format msgid "To reference that column, you must use a table-qualified name." msgstr "その列を参照するには、テーブル名で修飾した名前を使う必要があります。" -#: parser/parse_relation.c:3834 +#: parser/parse_relation.c:3866 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "列\"%s.%s\"を参照しようとしていたようです。" -#: parser/parse_relation.c:3848 +#: parser/parse_relation.c:3880 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "列\"%s.%s\"または列\"%s.%s\"を参照しようとしていたようです。" @@ -19268,252 +19321,252 @@ msgstr "LIKE句ではリレーション\"%s\"は不正です" msgid "Index \"%s\" contains a whole-row table reference." msgstr "インデックス\"%s\"には行全体テーブル参照が含まれます" -#: parser/parse_utilcmd.c:2419 +#: parser/parse_utilcmd.c:2423 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "CREATE TABLE では既存のインデックスを使えません" -#: parser/parse_utilcmd.c:2439 +#: parser/parse_utilcmd.c:2443 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "インデックス\"%s\"はすでに1つの制約に割り当てられています" -#: parser/parse_utilcmd.c:2465 +#: parser/parse_utilcmd.c:2469 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\"はユニークインデックスではありません" -#: parser/parse_utilcmd.c:2466 parser/parse_utilcmd.c:2473 parser/parse_utilcmd.c:2480 parser/parse_utilcmd.c:2556 +#: parser/parse_utilcmd.c:2470 parser/parse_utilcmd.c:2477 parser/parse_utilcmd.c:2484 parser/parse_utilcmd.c:2560 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "このようなインデックスを使ってプライマリキーや一意性制約を作成することはできません" -#: parser/parse_utilcmd.c:2472 +#: parser/parse_utilcmd.c:2476 #, c-format msgid "index \"%s\" contains expressions" msgstr "インデックス\"%s\"は式を含んでいます" -#: parser/parse_utilcmd.c:2479 +#: parser/parse_utilcmd.c:2483 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\"は部分インデックスです" -#: parser/parse_utilcmd.c:2491 +#: parser/parse_utilcmd.c:2495 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\"は遅延可能インデックスです" -#: parser/parse_utilcmd.c:2492 +#: parser/parse_utilcmd.c:2496 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "遅延可能インデックスを使った遅延不可制約は作れません。" -#: parser/parse_utilcmd.c:2555 +#: parser/parse_utilcmd.c:2559 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "インデックス\"%s\"の列番号%dにはデフォルトのソート動作がありません" -#: parser/parse_utilcmd.c:2747 +#: parser/parse_utilcmd.c:2751 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "列\"%s\"がプライマリキー制約内に2回出現します" -#: parser/parse_utilcmd.c:2753 +#: parser/parse_utilcmd.c:2757 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "列\"%s\"が一意性制約内に2回出現します" -#: parser/parse_utilcmd.c:2798 +#: parser/parse_utilcmd.c:2807 #, c-format msgid "column \"%s\" in WITHOUT OVERLAPS is not a range or multirange type" msgstr "WITHOUT OVERLAPS中の列\"%s\"は範囲型でも副範囲型でもありません" -#: parser/parse_utilcmd.c:2826 +#: parser/parse_utilcmd.c:2835 #, c-format msgid "constraint using WITHOUT OVERLAPS needs at least two columns" msgstr "WITHOUT OVERLAPSを使用する制約では少なくとも2つの列が必要です" -#: parser/parse_utilcmd.c:3123 +#: parser/parse_utilcmd.c:3132 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "インデックス式と述語はインデックス付けされるテーブルのみを参照できます" -#: parser/parse_utilcmd.c:3195 +#: parser/parse_utilcmd.c:3204 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "統計情報式は参照されているテーブルのみを参照できます" -#: parser/parse_utilcmd.c:3238 +#: parser/parse_utilcmd.c:3247 #, c-format msgid "rules on materialized views are not supported" msgstr "実体化ビューに対するルールはサポートされません" -#: parser/parse_utilcmd.c:3298 +#: parser/parse_utilcmd.c:3307 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "ルールのWHERE条件に他のリレーションへの参照を持たせられません" -#: parser/parse_utilcmd.c:3370 +#: parser/parse_utilcmd.c:3379 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "ルールのWHERE条件はSELECT、INSERT、UPDATE、DELETE動作のみを持つことができます" -#: parser/parse_utilcmd.c:3388 parser/parse_utilcmd.c:3489 rewrite/rewriteHandler.c:546 rewrite/rewriteManip.c:1187 +#: parser/parse_utilcmd.c:3397 parser/parse_utilcmd.c:3498 rewrite/rewriteHandler.c:545 rewrite/rewriteManip.c:1198 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "条件付きのUNION/INTERSECT/EXCEPT文は実装されていません" -#: parser/parse_utilcmd.c:3406 +#: parser/parse_utilcmd.c:3415 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:3410 +#: parser/parse_utilcmd.c:3419 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECTルールではNEWを使用できません" -#: parser/parse_utilcmd.c:3419 +#: parser/parse_utilcmd.c:3428 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:3425 +#: parser/parse_utilcmd.c:3434 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETEルールではNEWを使用できません" -#: parser/parse_utilcmd.c:3453 +#: parser/parse_utilcmd.c:3462 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "WITH 問い合わせ内では OLD は参照できません" -#: parser/parse_utilcmd.c:3460 +#: parser/parse_utilcmd.c:3469 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "WITH 問い合わせ内では NEW は参照できません" -#: parser/parse_utilcmd.c:3918 +#: parser/parse_utilcmd.c:3927 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3923 parser/parse_utilcmd.c:3938 +#: parser/parse_utilcmd.c:3932 parser/parse_utilcmd.c:3947 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "複数のDEFERRABLE/NOT DEFERRABLE句を使用できません" -#: parser/parse_utilcmd.c:3933 +#: parser/parse_utilcmd.c:3942 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "NOT DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3954 +#: parser/parse_utilcmd.c:3963 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "INITIALLY DEFERRED句の場所が間違っています<" -#: parser/parse_utilcmd.c:3959 parser/parse_utilcmd.c:3985 +#: parser/parse_utilcmd.c:3968 parser/parse_utilcmd.c:3994 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "複数のINITIALLY IMMEDIATE/DEFERRED句を使用できません" -#: parser/parse_utilcmd.c:3980 +#: parser/parse_utilcmd.c:3989 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "INITIALLY IMMEDIATE句の場所が間違っています<" -#: parser/parse_utilcmd.c:3997 +#: parser/parse_utilcmd.c:4006 #, c-format msgid "misplaced ENFORCED clause" msgstr "ENFORCED句の場所が間違っています" -#: parser/parse_utilcmd.c:4002 parser/parse_utilcmd.c:4019 +#: parser/parse_utilcmd.c:4011 parser/parse_utilcmd.c:4028 #, c-format msgid "multiple ENFORCED/NOT ENFORCED clauses not allowed" msgstr "複数のENFORCED/NOT ENFORCED句は指定できません" -#: parser/parse_utilcmd.c:4014 +#: parser/parse_utilcmd.c:4023 #, c-format msgid "misplaced NOT ENFORCED clause" msgstr "NOT ENFORCED句の場所が間違っています" -#: parser/parse_utilcmd.c:4212 +#: parser/parse_utilcmd.c:4221 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATEで指定したスキーマ(%s)が作成先のスキーマ(%s)と異なります" -#: parser/parse_utilcmd.c:4247 +#: parser/parse_utilcmd.c:4256 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\"はパーティションテーブルではありません" -#: parser/parse_utilcmd.c:4254 +#: parser/parse_utilcmd.c:4263 #, c-format msgid "table \"%s\" is not partitioned" msgstr "テーブル\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:4261 +#: parser/parse_utilcmd.c:4270 #, c-format msgid "index \"%s\" is not partitioned" msgstr "インデックス\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:4301 +#: parser/parse_utilcmd.c:4310 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "ハッシュパーティションテーブルはデフォルトパーティションを持つことができません" -#: parser/parse_utilcmd.c:4318 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ハッシュパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4324 partitioning/partbounds.c:4802 +#: parser/parse_utilcmd.c:4333 partitioning/partbounds.c:4802 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "ハッシュパーティションの法は0より大きい整数にする必要があります" -#: parser/parse_utilcmd.c:4331 partitioning/partbounds.c:4810 +#: parser/parse_utilcmd.c:4340 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "ハッシュパーティションの剰余は法よりも小さくなければなりません" -#: parser/parse_utilcmd.c:4344 +#: parser/parse_utilcmd.c:4353 #, c-format msgid "invalid bound specification for a list partition" msgstr "リストパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4397 +#: parser/parse_utilcmd.c:4406 #, c-format msgid "invalid bound specification for a range partition" msgstr "範囲パーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4403 +#: parser/parse_utilcmd.c:4412 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROMは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:4407 +#: parser/parse_utilcmd.c:4416 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TOは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:4523 +#: parser/parse_utilcmd.c:4532 #, c-format msgid "cannot specify NULL in range bound" msgstr "範囲境界でNULLは使用できません" -#: parser/parse_utilcmd.c:4571 +#: parser/parse_utilcmd.c:4580 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "MAXVALUEに続く境界値はMAXVALUEでなければなりません" -#: parser/parse_utilcmd.c:4578 +#: parser/parse_utilcmd.c:4587 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "MINVALUEに続く境界値はMINVALUEでなければなりません" -#: parser/parse_utilcmd.c:4621 +#: parser/parse_utilcmd.c:4630 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "指定した値は列\"%s\"の%s型に変換できません" @@ -19531,7 +19584,7 @@ msgstr "不正なUnicodeエスケープ文字" msgid "invalid Unicode escape value" msgstr "不正なUnicodeエスケープシーケンスの値" -#: parser/parser.c:494 scan.l:702 utils/adt/varlena.c:6863 +#: parser/parser.c:494 scan.l:702 utils/adt/varlena.c:6901 #, c-format msgid "invalid Unicode escape" msgstr "不正なUnicodeエスケープ" @@ -19541,7 +19594,7 @@ msgstr "不正なUnicodeエスケープ" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicodeエスケープは\\XXXXまたは\\+XXXXXXでなければなりません。" -#: parser/parser.c:523 scan.l:663 scan.l:679 scan.l:695 utils/adt/varlena.c:6888 +#: parser/parser.c:523 scan.l:663 scan.l:679 scan.l:695 utils/adt/varlena.c:6926 #, c-format msgid "invalid Unicode surrogate pair" msgstr "不正なUnicodeサロゲートペア" @@ -19906,7 +19959,7 @@ msgstr "バックグラウンドワーカー\"%s\": 不正な再起動間隔" msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "バックグラウンドワーカー\"%s\": パラレルワーカーは再起動するように設定してはいけません" -#: postmaster/bgworker.c:710 tcop/postgres.c:3343 +#: postmaster/bgworker.c:710 tcop/postgres.c:3344 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "管理者コマンドによりバックグラウンドワーカー\"%s\"を終了しています" @@ -20098,138 +20151,138 @@ msgstr "アーカイブモジュールはシンボル%sを定義しなくては msgid "archive modules must register an archive callback" msgstr "アーカイブモジュールはアーカイブコールバックを登録しなくてはなりません" -#: postmaster/postmaster.c:678 +#: postmaster/postmaster.c:679 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: -fオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:751 +#: postmaster/postmaster.c:752 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: -tオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:774 +#: postmaster/postmaster.c:775 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: 不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:842 +#: postmaster/postmaster.c:843 #, c-format msgid "%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n" msgstr "%s: \"superuser_reserved_connections\" (%d)と\"reserved_connections\" (%d)との和は \"max_connections\" (%d)より小さくなければなりません\n" -#: postmaster/postmaster.c:850 +#: postmaster/postmaster.c:851 #, c-format msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" msgstr "\"wal_level\"が\"minimal\"の時はWALアーカイブは有効にできません" -#: postmaster/postmaster.c:853 +#: postmaster/postmaster.c:854 #, c-format msgid "WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be \"replica\" or \"logical\"" msgstr "WALストリーミング(\"max_wal_senders\" > 0)を行うには wal_levelを\"replica\"または\"logical\"にする必要があります" -#: postmaster/postmaster.c:856 +#: postmaster/postmaster.c:857 #, c-format msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" msgstr "\"wal_level\"が\"minimal\"の時はWALは集約できません" -#: postmaster/postmaster.c:864 +#: postmaster/postmaster.c:865 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: データトークンテーブルが不正です、修復してください\n" -#: postmaster/postmaster.c:1025 +#: postmaster/postmaster.c:1026 #, c-format msgid "could not create I/O completion port for child queue" msgstr "子キュー向けのI/O終了ポートを作成できませんでした" -#: postmaster/postmaster.c:1091 +#: postmaster/postmaster.c:1092 #, c-format msgid "ending log output to stderr" msgstr "標準エラー出力へのログ出力を終了しています" -#: postmaster/postmaster.c:1092 +#: postmaster/postmaster.c:1093 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "この後のログ出力はログ配送先\"%s\"に出力されます。" -#: postmaster/postmaster.c:1103 +#: postmaster/postmaster.c:1104 #, c-format msgid "starting %s" msgstr "%s を起動しています" -#: postmaster/postmaster.c:1165 +#: postmaster/postmaster.c:1166 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "\"%s\"に関する監視用ソケットを作成できませんでした" -#: postmaster/postmaster.c:1171 +#: postmaster/postmaster.c:1172 #, c-format msgid "could not create any TCP/IP sockets" msgstr "TCP/IPソケットを作成できませんでした" -#: postmaster/postmaster.c:1203 +#: postmaster/postmaster.c:1204 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister()が失敗しました: エラーコード %ld" -#: postmaster/postmaster.c:1256 +#: postmaster/postmaster.c:1257 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "ディレクトリ\"%s\"においてUnixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1262 +#: postmaster/postmaster.c:1263 #, c-format msgid "could not create any Unix-domain sockets" msgstr "Unixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1273 +#: postmaster/postmaster.c:1274 #, c-format msgid "no socket created for listening" msgstr "監視用に作成するソケットはありません" -#: postmaster/postmaster.c:1304 +#: postmaster/postmaster.c:1305 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %m\n" msgstr "%s: 外部PIDファイル\"%s\"の権限を変更できませんでした: %m\n" -#: postmaster/postmaster.c:1308 +#: postmaster/postmaster.c:1309 #, c-format msgid "%s: could not write external PID file \"%s\": %m\n" msgstr "%s: 外部PIDファイル\"%s\"に書き込めませんでした: %m\n" #. translator: %s is a configuration file -#: postmaster/postmaster.c:1336 utils/init/postinit.c:225 +#: postmaster/postmaster.c:1337 utils/init/postinit.c:225 #, c-format msgid "could not load %s" msgstr "%s\"をロードできませんでした" -#: postmaster/postmaster.c:1364 +#: postmaster/postmaster.c:1365 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmasterは起動処理中はマルチスレッドで動作します" -#: postmaster/postmaster.c:1365 postmaster/postmaster.c:3668 +#: postmaster/postmaster.c:1366 postmaster/postmaster.c:3650 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "LC_ALL環境変数を使用可能なロケールに設定してください。" -#: postmaster/postmaster.c:1468 +#: postmaster/postmaster.c:1469 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: 自身の実行ファイルのパスが特定できません" -#: postmaster/postmaster.c:1475 +#: postmaster/postmaster.c:1476 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: 一致するpostgres実行ファイルがありませんでした" -#: postmaster/postmaster.c:1498 utils/misc/tzparser.c:342 +#: postmaster/postmaster.c:1499 utils/misc/tzparser.c:342 #, 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:1525 +#: postmaster/postmaster.c:1526 #, c-format msgid "" "%s: could not find the database system\n" @@ -20241,228 +20294,223 @@ msgstr "" "ファイル\"%s\"をオープンできませんでした: %m\n" #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1762 +#: postmaster/postmaster.c:1763 #, c-format msgid "issuing %s to recalcitrant children" msgstr "手に負えない子プロセスに%sを送出します" -#: postmaster/postmaster.c:1784 +#: postmaster/postmaster.c:1785 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "データディレクトリのロックファイルが不正なため、即時シャットダウンを実行中です" -#: postmaster/postmaster.c:2004 +#: postmaster/postmaster.c:2005 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUPを受け取りました。設定ファイルをリロードしています" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2012 postmaster/postmaster.c:2016 +#: postmaster/postmaster.c:2013 postmaster/postmaster.c:2017 #, c-format msgid "%s was not reloaded" msgstr "%s は再読み込みされていません" -#: postmaster/postmaster.c:2026 +#: postmaster/postmaster.c:2027 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL設定は再読み込みされていません" -#: postmaster/postmaster.c:2112 +#: postmaster/postmaster.c:2113 #, c-format msgid "received smart shutdown request" msgstr "スマートシャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2153 +#: postmaster/postmaster.c:2154 #, c-format msgid "received fast shutdown request" msgstr "高速シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2171 +#: postmaster/postmaster.c:2172 #, c-format msgid "aborting any active transactions" msgstr "活動中の全トランザクションをアボートしています" -#: postmaster/postmaster.c:2195 +#: postmaster/postmaster.c:2196 #, c-format msgid "received immediate shutdown request" msgstr "即時シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2270 +#: postmaster/postmaster.c:2271 #, c-format msgid "shutdown at recovery target" msgstr "リカバリ目標でシャットダウンします" -#: postmaster/postmaster.c:2288 postmaster/postmaster.c:2324 +#: postmaster/postmaster.c:2309 msgid "startup process" msgstr "起動プロセス" -#: postmaster/postmaster.c:2291 -#, c-format -msgid "aborting startup due to startup process failure" -msgstr "起動プロセスの失敗のため起動を中断しています" - -#: postmaster/postmaster.c:2347 +#: postmaster/postmaster.c:2332 #, c-format msgid "database system is ready to accept connections" msgstr "データベースシステムの接続受け付け準備が整いました" -#: postmaster/postmaster.c:2369 +#: postmaster/postmaster.c:2354 msgid "background writer process" msgstr "バックグランドライタプロセス" -#: postmaster/postmaster.c:2402 +#: postmaster/postmaster.c:2387 msgid "checkpointer process" msgstr "チェックポイント処理プロセス" -#: postmaster/postmaster.c:2419 +#: postmaster/postmaster.c:2404 msgid "WAL writer process" msgstr "WALライタプロセス" -#: postmaster/postmaster.c:2435 +#: postmaster/postmaster.c:2420 msgid "WAL receiver process" msgstr "WAL 受信プロセス" -#: postmaster/postmaster.c:2450 +#: postmaster/postmaster.c:2435 msgid "WAL summarizer process" msgstr "WAL集約プロセス" -#: postmaster/postmaster.c:2466 +#: postmaster/postmaster.c:2451 msgid "autovacuum launcher process" msgstr "自動VACUUM起動プロセス" -#: postmaster/postmaster.c:2482 +#: postmaster/postmaster.c:2467 msgid "archiver process" msgstr "アーカイバプロセス" -#: postmaster/postmaster.c:2497 +#: postmaster/postmaster.c:2482 msgid "system logger process" msgstr "システムログ取得プロセス" -#: postmaster/postmaster.c:2515 +#: postmaster/postmaster.c:2500 msgid "slot sync worker process" msgstr "スロット同期ワーカープロセス" -#: postmaster/postmaster.c:2523 utils/init/miscinit.c:297 +#: postmaster/postmaster.c:2508 utils/init/miscinit.c:297 msgid "io worker" msgstr "IOワーカー" -#: postmaster/postmaster.c:2545 postmaster/postmaster.c:2547 +#: postmaster/postmaster.c:2530 postmaster/postmaster.c:2532 msgid "untracked child process" msgstr "追跡されていない子プロセス" -#: postmaster/postmaster.c:2580 +#: postmaster/postmaster.c:2565 #, c-format msgid "background worker \"%s\"" msgstr "バックグラウンドワーカー\"%s\"" -#: postmaster/postmaster.c:2804 +#: postmaster/postmaster.c:2786 #, 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:2837 +#: postmaster/postmaster.c:2819 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d)は終了コード%dで終了しました" -#: postmaster/postmaster.c:2839 postmaster/postmaster.c:2851 postmaster/postmaster.c:2861 postmaster/postmaster.c:2872 +#: postmaster/postmaster.c:2821 postmaster/postmaster.c:2833 postmaster/postmaster.c:2843 postmaster/postmaster.c:2854 #, 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:2848 +#: postmaster/postmaster.c:2830 #, 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:2858 +#: postmaster/postmaster.c:2840 #, 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:2870 +#: postmaster/postmaster.c:2852 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d)は認識できないステータス%dで終了しました" -#: postmaster/postmaster.c:3161 +#: postmaster/postmaster.c:3143 #, c-format msgid "abnormal database system shutdown" msgstr "データベースシステムは異常にシャットダウンしました" -#: postmaster/postmaster.c:3187 +#: postmaster/postmaster.c:3169 #, c-format msgid "shutting down due to startup process failure" msgstr "起動プロセスの失敗のためシャットダウンしています" -#: postmaster/postmaster.c:3193 +#: postmaster/postmaster.c:3175 #, c-format msgid "shutting down because \"restart_after_crash\" is off" msgstr "\"restart_after_crash\"がoffであるためシャットダウンします" -#: postmaster/postmaster.c:3205 +#: postmaster/postmaster.c:3187 #, c-format msgid "all server processes terminated; reinitializing" msgstr "全てのサーバープロセスが終了しました: 再初期化しています" -#: postmaster/postmaster.c:3598 +#: postmaster/postmaster.c:3580 #, c-format msgid "could not fork new process for connection: %m" msgstr "接続用の新しいプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:3633 +#: postmaster/postmaster.c:3615 msgid "could not fork new process for connection: " msgstr "接続用の新しいプロセスをforkできませんでした" -#: postmaster/postmaster.c:3667 +#: postmaster/postmaster.c:3649 #, c-format msgid "postmaster became multithreaded" msgstr "postmasterがマルチスレッド動作になっています" -#: postmaster/postmaster.c:3745 +#: postmaster/postmaster.c:3727 #, c-format msgid "database system is ready to accept read-only connections" msgstr "データベースシステムはリードオンリー接続の受け付け準備ができました" -#: postmaster/postmaster.c:3846 +#: postmaster/postmaster.c:3828 #, c-format msgid "WAL was shut down unexpectedly" msgstr "WALが予期せずシャットダウンされました。" -#: postmaster/postmaster.c:3971 +#: postmaster/postmaster.c:3953 #, c-format msgid "no slot available for new autovacuum worker process" msgstr "新しい自動VACUUMワーカープロセスに割り当て可能なスロットがありません" -#: postmaster/postmaster.c:3986 +#: postmaster/postmaster.c:3968 #, c-format msgid "could not fork \"%s\" process: %m" msgstr "\"%s\"プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:4145 +#: postmaster/postmaster.c:4127 #, c-format msgid "no slot available for new background worker process" msgstr "新しいバックグラウンドワーカープロセスに割り当て可能なスロットがありません" -#: postmaster/postmaster.c:4163 +#: postmaster/postmaster.c:4145 #, c-format msgid "could not fork background worker process: %m" msgstr "バックグランドワーカープロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:4496 +#: postmaster/postmaster.c:4478 #, c-format msgid "could not read exit code for process\n" msgstr "子プロセスの終了コードの読み込みができませんでした\n" -#: postmaster/postmaster.c:4538 +#: postmaster/postmaster.c:4520 #, c-format msgid "could not post child completion status\n" msgstr "個プロセスの終了コードを投稿できませんでした\n" @@ -20517,38 +20565,38 @@ msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "自動ローテーションを無効にしています(再度有効にするにはSIGHUPを使用してください)" -#: postmaster/walsummarizer.c:743 +#: postmaster/walsummarizer.c:744 #, c-format msgid "WAL summarization is not progressing" msgstr "WAL集計が進んでいません" -#: postmaster/walsummarizer.c:744 +#: postmaster/walsummarizer.c:745 #, c-format msgid "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory." msgstr "集計は%X/%Xまで進んでいる必要がありますが、ディスク上では%X/%X、メモリ上では%X/%Xよりあとまで進んでいません。" -#: postmaster/walsummarizer.c:758 +#: postmaster/walsummarizer.c:759 #, c-format msgid "still waiting for WAL summarization through %X/%X after %ld second" msgid_plural "still waiting for WAL summarization through %X/%X after %ld seconds" msgstr[0] "%3$ld秒経過しましたが、WAL集計が%1$X/%2$Xに到達するのをまだ待ってます" -#: postmaster/walsummarizer.c:763 +#: postmaster/walsummarizer.c:764 #, c-format msgid "Summarization has reached %X/%X on disk and %X/%X in memory." msgstr "集計がディスク上で%X/%X、メモリ上で%X/%Xに到達しました。" -#: postmaster/walsummarizer.c:1003 +#: postmaster/walsummarizer.c:1004 #, c-format msgid "could not find a valid record after %X/%X" msgstr "%X/%Xの後に有効なレコードが見つかりませんでした" -#: postmaster/walsummarizer.c:1048 +#: postmaster/walsummarizer.c:1049 #, c-format msgid "could not read WAL from timeline %u at %X/%X: %s" msgstr "%X/%Xでタイムライン%uのWALを読み取れませんでした: %s" -#: postmaster/walsummarizer.c:1054 +#: postmaster/walsummarizer.c:1055 #, c-format msgid "could not read WAL from timeline %u at %X/%X" msgstr "%X/%Xでタイムライン%uのWALを読み取れませんでした" @@ -20612,7 +20660,7 @@ msgstr "接続文字列をパースできませんでした: %s" msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "プライマリサーバーからデータベースシステムの識別子とタイムライン ID を受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:455 replication/libpqwalreceiver/libpqwalreceiver.c:762 +#: replication/libpqwalreceiver/libpqwalreceiver.c:455 replication/libpqwalreceiver/libpqwalreceiver.c:781 #, c-format msgid "invalid response from primary server" msgstr "プライマリサーバーからの応答が不正です" @@ -20622,86 +20670,86 @@ msgstr "プライマリサーバーからの応答が不正です" msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "システムを識別できませんでした: 受信したのは%d行で%d列、期待していたのは%d行で%d以上の列でした。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:597 replication/libpqwalreceiver/libpqwalreceiver.c:604 replication/libpqwalreceiver/libpqwalreceiver.c:636 +#: replication/libpqwalreceiver/libpqwalreceiver.c:655 #, c-format msgid "could not start WAL streaming: %s" msgstr "WAL ストリーミングを開始できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:660 +#: replication/libpqwalreceiver/libpqwalreceiver.c:679 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "プライマリにストリーミングの終了メッセージを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:684 +#: replication/libpqwalreceiver/libpqwalreceiver.c:703 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "ストリーミングの終了後の想定外の結果セット" -#: replication/libpqwalreceiver/libpqwalreceiver.c:700 +#: replication/libpqwalreceiver/libpqwalreceiver.c:719 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ストリーミングCOPY終了中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:711 +#: replication/libpqwalreceiver/libpqwalreceiver.c:730 #, c-format msgid "error reading result of streaming command: %s" msgstr "ストリーミングコマンドの結果読み取り中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:721 replication/libpqwalreceiver/libpqwalreceiver.c:857 +#: replication/libpqwalreceiver/libpqwalreceiver.c:740 replication/libpqwalreceiver/libpqwalreceiver.c:876 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "CommandComplete後の想定外の結果: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:750 +#: replication/libpqwalreceiver/libpqwalreceiver.c:769 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "プライマリサーバーからタイムライン履歴ファイルを受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:763 +#: replication/libpqwalreceiver/libpqwalreceiver.c:782 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "2個のフィールドを持つ1個のタプルを期待していましたが、%2$d 個のフィールドを持つ %1$d 個のタプルを受信しました。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:818 replication/libpqwalreceiver/libpqwalreceiver.c:873 replication/libpqwalreceiver/libpqwalreceiver.c:880 +#: replication/libpqwalreceiver/libpqwalreceiver.c:837 replication/libpqwalreceiver/libpqwalreceiver.c:892 replication/libpqwalreceiver/libpqwalreceiver.c:899 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL ストリームからデータを受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:900 +#: replication/libpqwalreceiver/libpqwalreceiver.c:919 #, c-format msgid "could not send data to WAL stream: %s" msgstr "WAL ストリームにデータを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1023 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を作成できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1076 #, c-format msgid "could not alter replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を変更できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1089 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1110 #, c-format msgid "invalid query response" msgstr "不正な問い合わせ応答" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1090 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1111 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d個の列を期待していましたが、%d列を受信しました。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1160 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1181 #, c-format msgid "the query interface requires a database connection" msgstr "クエリインタフェースの動作にはデータベースコネクションが必要です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1194 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1215 msgid "empty query" msgstr "空の問い合わせ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1200 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1221 msgid "unexpected pipeline mode" msgstr "想定されていないパイプラインモード" @@ -20710,31 +20758,31 @@ msgstr "想定されていないパイプラインモード" msgid "logical replication parallel apply worker for subscription \"%s\" has finished" msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション並列適用ワーカーが終了しました" -#: replication/logical/applyparallelworker.c:822 +#: replication/logical/applyparallelworker.c:831 #, c-format msgid "lost connection to the logical replication apply worker" msgstr "論理レプリケーション適用ワーカーへの接続を失いました" -#: replication/logical/applyparallelworker.c:1031 replication/logical/applyparallelworker.c:1033 +#: replication/logical/applyparallelworker.c:1040 replication/logical/applyparallelworker.c:1042 msgid "logical replication parallel apply worker" msgstr "論理レプリケーション並列適用ワーカー" -#: replication/logical/applyparallelworker.c:1047 +#: replication/logical/applyparallelworker.c:1056 #, c-format msgid "logical replication parallel apply worker exited due to error" msgstr "論理レプリケーション並列適用ワーカーがエラーにより終了しました" -#: replication/logical/applyparallelworker.c:1134 replication/logical/applyparallelworker.c:1307 +#: replication/logical/applyparallelworker.c:1143 replication/logical/applyparallelworker.c:1316 #, c-format msgid "lost connection to the logical replication parallel apply worker" msgstr "論理レプリケーション並列適用ワーカーへの接続を失いました" -#: replication/logical/applyparallelworker.c:1187 +#: replication/logical/applyparallelworker.c:1196 #, c-format msgid "could not send data to shared-memory queue" msgstr "共有メモリキューにデータを送出できませんでした" -#: replication/logical/applyparallelworker.c:1222 +#: replication/logical/applyparallelworker.c:1231 #, c-format msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" msgstr "論理レプリケーションt起用ワーカーはリモートトランザクション%uの残りの変更をシリアライズしてファイルに格納します" @@ -20863,7 +20911,7 @@ msgid "out of logical replication worker slots" msgstr "論理レプリケーションワーカースロットは全て使用中です" #. translator: %s is a GUC variable name -#: replication/logical/launcher.c:438 replication/logical/launcher.c:524 replication/slot.c:1670 replication/slot.c:1690 storage/lmgr/lock.c:1042 storage/lmgr/lock.c:1080 storage/lmgr/lock.c:2969 storage/lmgr/lock.c:4374 storage/lmgr/lock.c:4439 storage/lmgr/lock.c:4789 storage/lmgr/predicate.c:2479 storage/lmgr/predicate.c:2494 storage/lmgr/predicate.c:3891 +#: replication/logical/launcher.c:438 replication/logical/launcher.c:524 replication/slot.c:1672 replication/slot.c:1692 storage/lmgr/lock.c:1042 storage/lmgr/lock.c:1080 storage/lmgr/lock.c:2969 storage/lmgr/lock.c:4374 storage/lmgr/lock.c:4439 storage/lmgr/lock.c:4789 storage/lmgr/predicate.c:2479 storage/lmgr/predicate.c:2494 storage/lmgr/predicate.c:3891 #, c-format msgid "You might need to increase \"%s\"." msgstr "\"%s\"を大きくする必要があるかもしれません。" @@ -20913,7 +20961,7 @@ msgstr "論理レプリケーションスロットは書き込みを行ったト msgid "cannot use replication slot \"%s\" for logical decoding" msgstr "レプリケーションスロット\"%s\"は論理デコードには使用できません" -#: replication/logical/logical.c:546 replication/slot.c:858 replication/slot.c:903 +#: replication/logical/logical.c:546 replication/slot.c:860 replication/slot.c:905 #, c-format msgid "This replication slot is being synchronized from the primary server." msgstr "このレプリケーションスロットはプライマリサーバーからの同期中です。" @@ -21114,88 +21162,88 @@ msgstr "論理レプリケーションのターゲットリレーション\"%s.% msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "論理レプリケーション先のリレーション\"%s.%s\"は存在しません" -#: replication/logical/reorderbuffer.c:4252 +#: replication/logical/reorderbuffer.c:4250 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "XID%uのためのデータファイルの書き出しに失敗しました: %m" -#: replication/logical/reorderbuffer.c:4598 replication/logical/reorderbuffer.c:4623 +#: replication/logical/reorderbuffer.c:4596 replication/logical/reorderbuffer.c:4621 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "並べ替えバッファのあふれファイルの読み込みに失敗しました: %m" -#: replication/logical/reorderbuffer.c:4602 replication/logical/reorderbuffer.c:4627 +#: replication/logical/reorderbuffer.c:4600 replication/logical/reorderbuffer.c:4625 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "並べ替えバッファのあふれファイルの読み込みに失敗しました: %2$uバイトのはずが%1$dバイトでした" -#: replication/logical/reorderbuffer.c:4876 +#: replication/logical/reorderbuffer.c:4874 #, c-format msgid "could not remove file \"%s\" during removal of %s/%s/xid*: %m" msgstr "%2$s/%3$s/xid* の削除中にファイル\"%1$s\"が削除できませんでした: %4$m" -#: replication/logical/reorderbuffer.c:5373 +#: replication/logical/reorderbuffer.c:5371 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "ファイル\"%1$s\"の読み込みに失敗しました: %3$dバイトのはずが%2$dバイトでした" -#: replication/logical/slotsync.c:214 replication/logical/slotsync.c:596 +#: replication/logical/slotsync.c:225 replication/logical/slotsync.c:623 #, c-format msgid "could not synchronize replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を同期できませんでした" -#: replication/logical/slotsync.c:216 +#: replication/logical/slotsync.c:227 #, c-format msgid "Synchronization could lead to data loss, because the remote slot needs WAL at LSN %X/%X and catalog xmin %u, but the standby has LSN %X/%X and catalog xmin %u." msgstr "リモートスロットでは LSN %X/%X のWALとカタログxmin %u が必要ですが、スタンバイ側では LSN %X/%X、カタログxmin %u となっており、同期を行うとデータが失われる可能性があります。" -#: replication/logical/slotsync.c:475 +#: replication/logical/slotsync.c:498 #, c-format msgid "dropped replication slot \"%s\" of database with OID %u" msgstr "OID %2$uのデータベースのレプリケーションスロット\"%1$s\"を削除しました" -#: replication/logical/slotsync.c:597 +#: replication/logical/slotsync.c:624 #, c-format msgid "Synchronization could lead to data loss, because the standby could not build a consistent snapshot to decode WALs at LSN %X/%X." msgstr "スタンバイがLSN %X/%XのWALをデコードするために必要な一貫性のあるスナップショットを作成できないため、同期によってデータが失われる可能性があります。" -#: replication/logical/slotsync.c:606 +#: replication/logical/slotsync.c:633 #, c-format msgid "newly created replication slot \"%s\" is sync-ready now" msgstr "新規に作成したレプリケーションスロット\"%s\"が同期可能になりました" -#: replication/logical/slotsync.c:645 +#: replication/logical/slotsync.c:672 #, c-format msgid "skipping slot synchronization because the received slot sync LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X" msgstr "受信したスロット\"%3$s\"のスロット同期LSN%1$X/%2$XがスタンバイのLSN%4$X/%5$Xよりも進んでいるためスロット同期をスキップします" -#: replication/logical/slotsync.c:667 +#: replication/logical/slotsync.c:694 #, c-format msgid "exiting from slot synchronization because same name slot \"%s\" already exists on the standby" msgstr "スタンバイに同名のスロット\"%s\"がすでに存在するため、スロット同期を終了しました" -#: replication/logical/slotsync.c:838 +#: replication/logical/slotsync.c:865 #, c-format msgid "could not fetch failover logical slots info from the primary server: %s" msgstr "プライマリサーバーからフェイルオーバー属性を持つ論理スロットを取得できませんでした: %s" -#: replication/logical/slotsync.c:987 +#: replication/logical/slotsync.c:1014 #, c-format msgid "could not fetch primary slot name \"%s\" info from the primary server: %s" msgstr "プライマリサーバーからプライマリのスロット名\"%s\"の情報を取得できませんでした: %s" -#: replication/logical/slotsync.c:989 +#: replication/logical/slotsync.c:1016 #, c-format msgid "Check if \"primary_slot_name\" is configured correctly." msgstr "\"primary_slot_name\"が正しく設定されているか確認してください。" -#: replication/logical/slotsync.c:1009 +#: replication/logical/slotsync.c:1036 #, c-format msgid "cannot synchronize replication slots from a standby server" msgstr "スタンバイサーバーからのリプリケーションスロットの同期ができませんでした" #. translator: second %s is a GUC variable name -#: replication/logical/slotsync.c:1018 +#: replication/logical/slotsync.c:1045 #, c-format msgid "replication slot \"%s\" specified by \"%s\" does not exist on primary server" msgstr "%2$sで指定されたレプリケーションスロット\"%1$s\"はプライマリサーバーに存在しません" @@ -21203,60 +21251,75 @@ msgstr "%2$sで指定されたレプリケーションスロット\"%1$s\"はプ #. translator: first %s is a connection option; second %s is a GUC #. variable name #. -#: replication/logical/slotsync.c:1051 +#: replication/logical/slotsync.c:1078 #, c-format msgid "replication slot synchronization requires \"%s\" to be specified in \"%s\"" msgstr "レプリケーションスロットの同期を行う際は\"%2$s\"で\"%1$s\"が指定されている必要があります" -#: replication/logical/slotsync.c:1070 +#: replication/logical/slotsync.c:1097 #, c-format msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" msgstr "レプリケーションスロットの同期を行う際は\"wal_level\" >= \"logical\" である必要があります" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1085 replication/logical/slotsync.c:1113 +#: replication/logical/slotsync.c:1112 replication/logical/slotsync.c:1140 #, c-format msgid "replication slot synchronization requires \"%s\" to be set" msgstr "レプリケーションスロットの同期を行う際は\"%s\"が設定されている必要があります" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1099 +#: replication/logical/slotsync.c:1126 #, c-format msgid "replication slot synchronization requires \"%s\" to be enabled" msgstr "レプリケーションスロットの同期を行う際は\"%s\"が有効になっている必要があります" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1151 +#: replication/logical/slotsync.c:1183 #, c-format -msgid "replication slot synchronization worker will shut down because \"%s\" is disabled" -msgstr "\"%s\"が無効にされたため、レプリケーションスロット同期ワーカーがシャットダウンします" +msgid "replication slot synchronization worker will stop because \"%s\" is disabled" +msgstr "\"%s\"が無効にされたため、レプリケーションスロット同期ワーカーが停止します" -#: replication/logical/slotsync.c:1160 +#: replication/logical/slotsync.c:1201 #, c-format msgid "replication slot synchronization worker will restart because of a parameter change" msgstr "パラメータの変更があったため、レプリケーションスロット同期ワーカーが再起動します" -#: replication/logical/slotsync.c:1184 +#: replication/logical/slotsync.c:1226 +#, c-format +msgid "replication slot synchronization will stop because of a parameter change" +msgstr "パラメータの変更があったため、レプリケーションスロット同期が停止します" + +#: replication/logical/slotsync.c:1262 #, c-format -msgid "replication slot synchronization worker is shutting down because promotion is triggered" -msgstr "昇格がトリガーされたため、レプリケーションスロット同期ワーカーがシャットダウンします" +msgid "replication slot synchronization worker will stop because promotion is triggered" +msgstr "昇格がトリガーされたため、レプリケーションスロット同期ワーカーが停止します" -#: replication/logical/slotsync.c:1309 +#: replication/logical/slotsync.c:1276 #, c-format -msgid "cannot synchronize replication slots when standby promotion is ongoing" -msgstr "スタンバイの昇格処理中はリプリケーションスロットの同期はできません" +msgid "replication slot synchronization will stop because promotion is triggered" +msgstr "昇格がトリガーされたため、レプリケーションスロット同期が停止します" -#: replication/logical/slotsync.c:1317 +#: replication/logical/slotsync.c:1396 +#, c-format +msgid "replication slot synchronization worker will not start because promotion was triggered" +msgstr "昇格がトリガーされたため、レプリケーションスロット同期ワーカーは起動されません" + +#: replication/logical/slotsync.c:1408 +#, c-format +msgid "replication slot synchronization will not start because promotion was triggered" +msgstr "昇格がトリガーされたため、レプリケーションスロット同期は開始されません" + +#: replication/logical/slotsync.c:1417 #, c-format msgid "cannot synchronize replication slots concurrently" msgstr "複数のレプリケーションスロットの並行同期はできません" -#: replication/logical/slotsync.c:1425 +#: replication/logical/slotsync.c:1529 #, c-format msgid "slot sync worker started" msgstr "スロット同期ワーカーが起動しました" -#: replication/logical/slotsync.c:1487 replication/slotfuncs.c:928 +#: replication/logical/slotsync.c:1591 replication/slotfuncs.c:928 #, c-format msgid "synchronization worker \"%s\" could not connect to the primary server: %s" msgstr "同期ワーカー\"%s\"はプライマリ・サーバーに接続できませんでした: %s" @@ -21362,22 +21425,22 @@ msgstr "パブリッシャからテーブル\"%s.%s\"のテーブルのテーブ msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "テーブル\"%s.%s\"の初期内容のコピーを開始できませんでした: %s" -#: replication/logical/tablesync.c:1380 +#: replication/logical/tablesync.c:1381 #, c-format msgid "table synchronization worker for subscription \"%s\" could not connect to the publisher: %s" msgstr "サブスクリプション\"%s\"のテーブル同期ワーカーがパブリッシャに接続できませんでした: %s" -#: replication/logical/tablesync.c:1480 +#: replication/logical/tablesync.c:1481 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "テーブルコピー中にパブリッシャ上でのトランザクション開始に失敗しました: %s" -#: replication/logical/tablesync.c:1540 replication/logical/worker.c:2378 +#: replication/logical/tablesync.c:1541 replication/logical/worker.c:2388 #, c-format msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" msgstr "ユーザー\"%s\"は行レベルセキュリティが有効なリレーションへのレプリケーションはできません: \"%s\"" -#: replication/logical/tablesync.c:1553 +#: replication/logical/tablesync.c:1554 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "テーブルコピー中にパブリッシャ上でのトランザクション終了に失敗しました: %s" @@ -21392,152 +21455,157 @@ msgstr "サブスクリプション\"%s\"に対応する論理レプリケーシ msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." msgstr "すべてのテーブルの同期が完了するまでは、ストリームされたトランザクションを適用ワーカーで扱うことはできません。" -#: replication/logical/worker.c:846 replication/logical/worker.c:961 +#: replication/logical/worker.c:813 replication/logical/worker.c:930 replication/logical/worker.c:2634 +#, c-format +msgid "logical replication column %d not found in tuple: only %d column(s) received" +msgstr "論理レプリケーションの列 %d がタプル中にありません: %d 個の列しか受信していません" + +#: replication/logical/worker.c:852 replication/logical/worker.c:971 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "論理レプリケーション列%dのバイナリデータ書式が不正です" -#: replication/logical/worker.c:2525 +#: replication/logical/worker.c:2535 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "論理レプリケーション先のリレーション\"%s.%s\"は複製の識別列を期待していましたが、パブリッシャは送信しませんでした" -#: replication/logical/worker.c:2532 +#: replication/logical/worker.c:2542 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "論理レプリケーション先のリレーション\"%s.%s\"が識別列インデックスも主キーをもっておらず、かつパブリッシュされたリレーションがREPLICA IDENTITY FULLとなっていません" -#: replication/logical/worker.c:3467 +#: replication/logical/worker.c:3482 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "不正な論理レプリケーションのメッセージタイプ \"??? (%d)\"" -#: replication/logical/worker.c:3639 +#: replication/logical/worker.c:3654 #, c-format msgid "data stream from publisher has ended" msgstr "パブリッシャからのデータストリームが終了しました" -#: replication/logical/worker.c:3793 +#: replication/logical/worker.c:3808 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "タイムアウトにより論理レプリケーションワーカーを終了しています" -#: replication/logical/worker.c:3990 +#: replication/logical/worker.c:4005 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" msgstr "サブスクリプション\"%s\"が削除されたため、このサブスクリプションに対応する論理レプリケーションワーカーが停止します" -#: replication/logical/worker.c:4004 +#: replication/logical/worker.c:4019 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "サブスクリプション\"%s\"が無効化されたため、このサブスクリプションに対応する論理レプリケーションワーカーが停止します" -#: replication/logical/worker.c:4035 +#: replication/logical/worker.c:4050 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーション並列適用ワーカーが停止します" -#: replication/logical/worker.c:4039 +#: replication/logical/worker.c:4054 #, c-format msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーションワーカーが再起動します" -#: replication/logical/worker.c:4053 +#: replication/logical/worker.c:4068 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked" msgstr "サブスクリプション\"%s\"の所有者のスーパーユーザー権限が剥奪されたため、このサブスクリプションに対応する論理レプリケーション並列適用ワーカーが停止します" -#: replication/logical/worker.c:4057 +#: replication/logical/worker.c:4072 #, c-format msgid "logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked" msgstr "サブスクリプション\"%s\"の所有者のスーパーユーザー権限が剥奪されたため、このサブスクリプションに対応する論理レプリケーションワーカーが再起動します" -#: replication/logical/worker.c:4567 +#: replication/logical/worker.c:4582 #, c-format msgid "subscription has no replication slot set" msgstr "サブスクリプションにレプリケーションスロットが設定されていません" -#: replication/logical/worker.c:4592 +#: replication/logical/worker.c:4607 #, c-format msgid "apply worker for subscription \"%s\" could not connect to the publisher: %s" msgstr "サブスクリプション\"%s\"の適用ワーカーがパブリッシャに接続できませんでした: %s" -#: replication/logical/worker.c:4696 +#: replication/logical/worker.c:4711 #, c-format msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" msgstr "サブスクリプション%uが起動中に削除されたため、このサブスクリプションに対応する論理レプリケーションワーカーは起動しません" -#: replication/logical/worker.c:4712 +#: replication/logical/worker.c:4727 #, c-format msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "サブスクリプション\"%s\"が起動中に無効化されたため、このサブスクリプションに対応する論理レプリケーションワーカーは起動しません" -#: replication/logical/worker.c:4736 +#: replication/logical/worker.c:4751 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "サブスクリプション\"%s\"、テーブル\"%s\"に対応する論理レプリケーションテーブル同期ワーカーが起動しました" -#: replication/logical/worker.c:4741 +#: replication/logical/worker.c:4756 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカーが起動しました" -#: replication/logical/worker.c:4875 +#: replication/logical/worker.c:4890 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "サブスクリプション\"%s\"はエラーのため無効化されました" -#: replication/logical/worker.c:4923 +#: replication/logical/worker.c:4938 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "論理レプリケーションは%X/%Xででトランザクションのスキップを開始します" -#: replication/logical/worker.c:4937 +#: replication/logical/worker.c:4952 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "論理レプリケーションは%X/%Xでトランザクションのスキップを完了しました" -#: replication/logical/worker.c:5025 +#: replication/logical/worker.c:5040 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "サブスクリプションの\"%s\"スキップLSNをクリアしました" -#: replication/logical/worker.c:5026 +#: replication/logical/worker.c:5041 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." msgstr "リモートトランザクションの完了WAL位置(LSN) %X/%XがスキップLSN %X/%X と一致しません。" -#: replication/logical/worker.c:5054 +#: replication/logical/worker.c:5069 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "メッセージタイプ \"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:5058 +#: replication/logical/worker.c:5073 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "トランザクション%3$u中、メッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:5063 +#: replication/logical/worker.c:5078 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" msgstr "%4$X/%5$Xで終了したトランザクション%3$u中、メッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:5074 +#: replication/logical/worker.c:5089 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" msgstr "レプリケーション起点\"%1$s\"のリモートデータ処理中、トランザクション%5$uのレプリケーション対象リレーション\"%3$s.%4$s\"に対するメッセージタイプ\"%2$s\"内" -#: replication/logical/worker.c:5081 +#: replication/logical/worker.c:5096 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" msgstr "%6$X/%7$Xで終了したトランザクション%5$u中、レプリケーション先リレーション\"%3$s.%4$s\"に対するメッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:5092 +#: replication/logical/worker.c:5107 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" msgstr "レプリケーション起点\"%1$s\"のリモートデータ処理中、トランザクション%6$uのレプリケーション対象リレーション\"%3$s.%4$s\"、列\"%5$s\"に対するメッセージタイプ\"%2$s\"内" -#: replication/logical/worker.c:5100 +#: replication/logical/worker.c:5115 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" msgstr "%7$X/%8$Xで終了したトランザクション%6$u中、レプリケーション先リレーション\"%3$s.%4$s\"、列\"%5$s\"に対するメッセージタイプ\"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" @@ -21641,7 +21709,7 @@ msgstr "レプリケーションスロット名は小文字、数字とアンダ msgid "cannot enable failover for a replication slot created on the standby" msgstr "スタンバイ上で作成したレプリケーションスロットのフェイルオーバーを有効にすることはできません" -#: replication/slot.c:389 replication/slot.c:925 +#: replication/slot.c:389 replication/slot.c:927 #, c-format msgid "cannot enable failover for a temporary replication slot" msgstr "一時レプリケーションスロットのフェイルオーバーを有効にすることはできません" @@ -21666,7 +21734,7 @@ msgstr "どれか一つを解放するか、\"max_replication_slots\"を大き msgid "replication slot \"%s\" does not exist" msgstr "レプリケーションスロット\"%s\"は存在しません" -#: replication/slot.c:664 replication/slot.c:1499 +#: replication/slot.c:664 replication/slot.c:1501 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "レプリケーションスロット\"%s\"はPID%dで使用中です" @@ -21691,198 +21759,198 @@ msgstr "論理レプリケーションスロット\"%s\"を取得しました" msgid "acquired physical replication slot \"%s\"" msgstr "物理レプリケーションスロット\"%s\"を取得しました" -#: replication/slot.c:789 +#: replication/slot.c:791 #, c-format msgid "released logical replication slot \"%s\"" msgstr "論理レプリケーションスロット\"%s\"を解放しました" -#: replication/slot.c:791 +#: replication/slot.c:793 #, c-format msgid "released physical replication slot \"%s\"" msgstr "物理レプリケーションスロット\"%s\"を解放しました" -#: replication/slot.c:857 +#: replication/slot.c:859 #, c-format msgid "cannot drop replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を削除できませんでした" -#: replication/slot.c:890 +#: replication/slot.c:892 #, c-format msgid "cannot use %s with a physical replication slot" msgstr "%sは物理レプリケーションスロットでは使用できません" -#: replication/slot.c:902 +#: replication/slot.c:904 #, c-format msgid "cannot alter replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を変更できませんでした" -#: replication/slot.c:912 +#: replication/slot.c:914 #, c-format msgid "cannot enable failover for a replication slot on the standby" msgstr "スタンバイ上ではレプリケーションスロットのフェイルオーバーを有効にすることはできません" -#: replication/slot.c:1060 replication/slot.c:2228 replication/slot.c:2621 +#: replication/slot.c:1062 replication/slot.c:2230 replication/slot.c:2623 #, c-format msgid "could not remove directory \"%s\"" msgstr "ディレクトリ\"%s\"を削除できませんでした" -#: replication/slot.c:1534 +#: replication/slot.c:1536 #, c-format msgid "replication slots can only be used if \"max_replication_slots\" > 0" msgstr "レプリケーションスロットは\"max_replication_slots\" > 0 のときだけ使用できます" -#: replication/slot.c:1539 +#: replication/slot.c:1541 #, c-format msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" msgstr "レプリケーションスロットは\"wal_level\" >= \"replica\" のときだけ使用できます" -#: replication/slot.c:1551 +#: replication/slot.c:1553 #, c-format msgid "permission denied to use replication slots" msgstr "レプリケーションスロットを使用する権限がありません" -#: replication/slot.c:1552 +#: replication/slot.c:1554 #, c-format msgid "Only roles with the %s attribute may use replication slots." msgstr "%s属性を持つロールのみがレプリケーションスロットを使用できます。" -#: replication/slot.c:1664 +#: replication/slot.c:1666 #, c-format msgid "The slot's restart_lsn %X/%X exceeds the limit by % byte." msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by % bytes." msgstr[0] "このスロットのrestart_lsn %X/%Xは制限を%バイト超過しています。" -#: replication/slot.c:1675 +#: replication/slot.c:1677 #, c-format msgid "The slot conflicted with xid horizon %u." msgstr "このスロットはXID地平線%uと競合しました。" -#: replication/slot.c:1680 +#: replication/slot.c:1682 msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." msgstr "論理デコードを行うためにはプライマリサーバー上で\"wal_level\" >= \"logical\" である必要があります。" #. translator: %s is a GUC variable name -#: replication/slot.c:1686 +#: replication/slot.c:1688 #, c-format msgid "The slot's idle time of %lds exceeds the configured \"%s\" duration of %ds." msgstr "このスロットのアイドル時間 %ld秒が、\"%s\"で設定された %d秒を超えています。" -#: replication/slot.c:1700 +#: replication/slot.c:1702 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "プロセス%dを終了してレプリケーションスロット\"%s\"を解放します" -#: replication/slot.c:1702 +#: replication/slot.c:1704 #, c-format msgid "invalidating obsolete replication slot \"%s\"" msgstr "使用不能のレプリケーションスロット\"%s\"を無効化します" -#: replication/slot.c:2559 +#: replication/slot.c:2561 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "レプリケーションスロットファイル\"%1$s\"のマジックナンバーが不正です: %3$uのはずが%2$uでした" -#: replication/slot.c:2566 +#: replication/slot.c:2568 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "レプリケーションスロットファイル\"%s\"はサポート外のバージョン%uです" -#: replication/slot.c:2573 +#: replication/slot.c:2575 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "レプリケーションスロットファイル\"%s\"のサイズ%uは異常です" -#: replication/slot.c:2609 +#: replication/slot.c:2611 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "レプリケーションスロットファイル\"%s\"のチェックサムが一致しません: %uですが、%uであるべきです" -#: replication/slot.c:2645 +#: replication/slot.c:2647 #, c-format msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" msgstr "論理レプリケーションスロット\"%s\"がありますが、\"wal_level\" < \"logical\" です" -#: replication/slot.c:2647 +#: replication/slot.c:2649 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "\"wal_level\"を\"logical\"もしくはそれより上位の設定にしてください。" -#: replication/slot.c:2659 +#: replication/slot.c:2661 #, c-format msgid "logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = \"off\"" msgstr "論理レプリケーションスロット\"%s\"がありますが、\"hot_standby\" = \"off\" です" -#: replication/slot.c:2661 +#: replication/slot.c:2663 #, c-format msgid "Change \"hot_standby\" to be \"on\"." msgstr "\"hot_standby\" を \"on\" に変更してください。" -#: replication/slot.c:2666 +#: replication/slot.c:2668 #, c-format msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "物理レプリケーションスロット\"%s\"がありますが、\"wal_level\" < \"replica\" です" -#: replication/slot.c:2668 +#: replication/slot.c:2670 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "\"wal_level\"を\"replica\"もしくはそれより上位の設定にしてください。" -#: replication/slot.c:2715 +#: replication/slot.c:2717 #, c-format msgid "too many replication slots active before shutdown" msgstr "シャットダウン前のアクティブなレプリケーションスロットの数が多すぎます" -#: replication/slot.c:2716 +#: replication/slot.c:2718 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "\"max_replication_slots\"を増やして再度試してください" -#: replication/slot.c:2953 +#: replication/slot.c:2955 #, c-format msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" msgstr "パラメータ\"%2$s\"で指定されているレプリケーションスロット\"%1$s\"は存在しません" -#: replication/slot.c:2955 replication/slot.c:2989 replication/slot.c:3004 +#: replication/slot.c:2957 replication/slot.c:2991 replication/slot.c:3006 #, c-format msgid "Logical replication is waiting on the standby associated with replication slot \"%s\"." msgstr "論理レプリケーションはレプリケーションスロット”%s\"に対応するスタンバイを待っています。 " -#: replication/slot.c:2957 +#: replication/slot.c:2959 #, c-format msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." msgstr "レプリケーションスロット\"%s\"を作成するか、パラメータ\"%s\"を修正してください。" -#: replication/slot.c:2967 +#: replication/slot.c:2969 #, c-format msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" msgstr "パラメータ\"%2$s\"では論理レプリケーションスロット\"%1$s\"は指定できません" -#: replication/slot.c:2969 +#: replication/slot.c:2971 #, c-format msgid "Logical replication is waiting for correction on replication slot \"%s\"." msgstr "論理レプリケーションはレプリケーションスロット\"%s\"が修正されるのを待っています。" -#: replication/slot.c:2971 +#: replication/slot.c:2973 #, c-format msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." msgstr "論理レプリケーションスロット\"%s\"をパラメータ\"%s\"から削除してください。" -#: replication/slot.c:2987 +#: replication/slot.c:2989 #, c-format msgid "physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated" msgstr "パラメータ\"%2$s\"で指定された物理レプリケーションスロット\"%1$s\"は無効化されています" -#: replication/slot.c:2991 +#: replication/slot.c:2993 #, c-format msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." msgstr "レプリケーションスロット\"%s\"を削除して再作成するか、パラメータ\"%s\"を修正してください。" -#: replication/slot.c:3002 +#: replication/slot.c:3004 #, c-format msgid "replication slot \"%s\" specified in parameter \"%s\" does not have active_pid" msgstr "\"%2$s\"で指定されたレプリケーションスロット\"%1$s\"にはactive_pidがありません" -#: replication/slot.c:3006 +#: replication/slot.c:3008 #, c-format msgid "Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\"." msgstr "レプリケーションスロット\"%s\"に関連付けられているスタンバイを起動するか、パラメータ%sを修正してください。" @@ -21988,12 +22056,13 @@ msgstr "スタンバイ\"%s\"は優先度%dの同期スタンバイになりま msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "スタンバイ\"%s\"は定足数同期スタンバイの候補になりました" -#: replication/syncrep.c:1081 +#. translator: %s is a GUC name +#: replication/syncrep.c:1082 #, c-format msgid "\"%s\" parser failed." msgstr "\"%s\"のパーサーが失敗しました。" -#: replication/syncrep.c:1088 +#: replication/syncrep.c:1089 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "同期スタンバイの数(%d)は1以上である必要があります" @@ -22063,7 +22132,7 @@ msgstr "WALセグメント%sをクローズできませんでした: %m" msgid "fetching timeline history file for timeline %u from primary server" msgstr "プライマリサーバーからライムライン%u用のタイムライン履歴ファイルを取り込みしています" -#: replication/walreceiver.c:951 +#: replication/walreceiver.c:948 #, c-format msgid "could not write to WAL segment %s at offset %d, length %lu: %m" msgstr "WALファイルセグメント%sのオフセット%d、長さ%luの書き込みが失敗しました: %m" @@ -22104,82 +22173,82 @@ msgid "requested starting point %X/%X is ahead of the WAL flush position of this msgstr "要求された開始ポイント%X/%XはサーバーのWALフラッシュ位置%X/%Xより進んでいます" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1257 +#: replication/walsender.c:1279 #, c-format msgid "%s must not be called inside a transaction" msgstr "%sはトランザクション内では呼び出せません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1267 +#: replication/walsender.c:1289 #, c-format msgid "%s must be called inside a transaction" msgstr "%sはトランザクション内で呼び出さなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1273 +#: replication/walsender.c:1295 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s は REPEATABLE READ 分離レベルのトランザクションで呼び出されなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1278 +#: replication/walsender.c:1300 #, c-format msgid "%s must be called in a read-only transaction" msgstr "%sは読み取り専用トランザクションの中で呼び出さなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1284 +#: replication/walsender.c:1306 #, c-format msgid "%s must be called before any query" msgstr "%s は問い合わせの実行前に呼び出されなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1290 +#: replication/walsender.c:1312 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s はサブトランザクション内では呼び出せません" -#: replication/walsender.c:1467 +#: replication/walsender.c:1489 #, c-format msgid "terminating walsender process after promotion" msgstr "昇格後にWAL送信プロセスを終了します" -#: replication/walsender.c:2010 +#: replication/walsender.c:2038 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "WAL送信プロセスが停止モードの間は新しいコマンドを実行できません" -#: replication/walsender.c:2064 +#: replication/walsender.c:2092 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "物理レプリケーション用のWAL送信プロセスでSQLコマンドは実行できません" -#: replication/walsender.c:2095 +#: replication/walsender.c:2123 #, c-format msgid "received replication command: %s" msgstr "レプリケーションコマンドを受信しました: %s" -#: replication/walsender.c:2103 tcop/fastpath.c:208 tcop/postgres.c:1137 tcop/postgres.c:1494 tcop/postgres.c:1746 tcop/postgres.c:2251 tcop/postgres.c:2688 tcop/postgres.c:2765 +#: replication/walsender.c:2131 tcop/fastpath.c:208 tcop/postgres.c:1138 tcop/postgres.c:1495 tcop/postgres.c:1747 tcop/postgres.c:2252 tcop/postgres.c:2689 tcop/postgres.c:2766 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "現在のトランザクションがアボートしました。トランザクションブロックが終わるまでコマンドは無視されます" -#: replication/walsender.c:2263 replication/walsender.c:2298 +#: replication/walsender.c:2291 replication/walsender.c:2326 #, c-format msgid "unexpected EOF on standby connection" msgstr "スタンバイ接続で想定外のEOFがありました" -#: replication/walsender.c:2286 +#: replication/walsender.c:2314 #, c-format msgid "invalid standby message type \"%c\"" msgstr "スタンバイのメッセージタイプ\"%c\"は不正です" -#: replication/walsender.c:2375 +#: replication/walsender.c:2403 #, c-format msgid "unexpected message type \"%c\"" msgstr "想定しないメッセージタイプ\"%c\"" -#: replication/walsender.c:2789 +#: replication/walsender.c:2820 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "レプリケーションタイムアウトにより WAL 送信プロセスを終了しています" @@ -22359,285 +22428,280 @@ msgstr "リレーション\"%2$s\"のルール\"%1$s\"は存在しません" msgid "renaming an ON SELECT rule is not allowed" msgstr "ON SELECTルールの名前を変更することはできません" -#: rewrite/rewriteHandler.c:590 +#: rewrite/rewriteHandler.c:589 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "WITH の問い合わせ名\"%s\"が、ルールのアクションと書き換えられようとしている問い合わせの両方に現れています" -#: rewrite/rewriteHandler.c:620 +#: rewrite/rewriteHandler.c:619 #, 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:674 +#: rewrite/rewriteHandler.c:707 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "複数ルールではRETURNINGリストを持つことはできません" -#: rewrite/rewriteHandler.c:911 rewrite/rewriteHandler.c:950 +#: rewrite/rewriteHandler.c:944 rewrite/rewriteHandler.c:983 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "列\"%s\"への非デフォルト値の挿入はできません" -#: rewrite/rewriteHandler.c:913 rewrite/rewriteHandler.c:979 +#: rewrite/rewriteHandler.c:946 rewrite/rewriteHandler.c:1012 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "列\"%s\"は GENERATED ALWAYS として定義されています。" -#: rewrite/rewriteHandler.c:915 +#: rewrite/rewriteHandler.c:948 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "OVERRIDING SYSTEM VALUE を指定することで挿入を強制できます。" -#: rewrite/rewriteHandler.c:977 rewrite/rewriteHandler.c:985 +#: rewrite/rewriteHandler.c:1010 rewrite/rewriteHandler.c:1018 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "列\"%s\"はDEFAULTにのみ更新可能です" -#: rewrite/rewriteHandler.c:1121 rewrite/rewriteHandler.c:1139 +#: rewrite/rewriteHandler.c:1154 rewrite/rewriteHandler.c:1172 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "同じ列\"%s\"に複数の代入があります" -#: rewrite/rewriteHandler.c:1694 +#: rewrite/rewriteHandler.c:1727 #, c-format msgid "MERGE is not supported for relations with rules." msgstr "MERGEはルールを持つリレーションに対してはサポートされません。" -#: rewrite/rewriteHandler.c:1734 rewrite/rewriteHandler.c:3274 +#: rewrite/rewriteHandler.c:1767 rewrite/rewriteHandler.c:3339 #, c-format msgid "access to non-system view \"%s\" is restricted" msgstr "非システムのビュー\"%s\"へのアクセスは制限されています" -#: rewrite/rewriteHandler.c:2133 rewrite/rewriteHandler.c:4285 +#: rewrite/rewriteHandler.c:2166 rewrite/rewriteHandler.c:4350 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "リレーション\"%s\"のルールで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2238 +#: rewrite/rewriteHandler.c:2271 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "リレーション\"%s\"のポリシで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2601 +#: rewrite/rewriteHandler.c:2666 msgid "Junk view columns are not updatable." msgstr "ジャンクビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2606 +#: rewrite/rewriteHandler.c:2671 msgid "View columns that are not columns of their base relation are not updatable." msgstr "基底リレーションの列ではないビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2609 +#: rewrite/rewriteHandler.c:2674 msgid "View columns that refer to system columns are not updatable." msgstr "システム列を参照するビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2612 +#: rewrite/rewriteHandler.c:2677 msgid "View columns that return whole-row references are not updatable." msgstr "行全体参照を返すビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2673 +#: rewrite/rewriteHandler.c:2738 msgid "Views containing DISTINCT are not automatically updatable." msgstr "DISTINCTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2676 +#: rewrite/rewriteHandler.c:2741 msgid "Views containing GROUP BY are not automatically updatable." msgstr "GROUP BYを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2679 +#: rewrite/rewriteHandler.c:2744 msgid "Views containing HAVING are not automatically updatable." msgstr "HAVINGを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2682 +#: rewrite/rewriteHandler.c:2747 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "UNION、INTERSECT、EXCEPTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2685 +#: rewrite/rewriteHandler.c:2750 msgid "Views containing WITH are not automatically updatable." msgstr "WITHを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2688 +#: rewrite/rewriteHandler.c:2753 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "LIMIT、OFFSETを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2700 +#: rewrite/rewriteHandler.c:2765 msgid "Views that return aggregate functions are not automatically updatable." msgstr "集約関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2703 +#: rewrite/rewriteHandler.c:2768 msgid "Views that return window functions are not automatically updatable." msgstr "ウィンドウ関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2706 +#: rewrite/rewriteHandler.c:2771 msgid "Views that return set-returning functions are not automatically updatable." msgstr "集合返却関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2713 rewrite/rewriteHandler.c:2717 rewrite/rewriteHandler.c:2725 +#: rewrite/rewriteHandler.c:2778 rewrite/rewriteHandler.c:2782 rewrite/rewriteHandler.c:2790 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "単一のテーブルまたはビューからselectしていないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2728 +#: rewrite/rewriteHandler.c:2793 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "TABLESAMPLEを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2752 +#: rewrite/rewriteHandler.c:2817 msgid "Views that have no updatable columns are not automatically updatable." msgstr "更新可能な列を持たないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:3133 rewrite/rewriteHandler.c:3168 +#: rewrite/rewriteHandler.c:3198 rewrite/rewriteHandler.c:3233 #, c-format msgid "cannot insert into view \"%s\"" msgstr "ビュー\"%s\"へは挿入(INSERT)できません" -#: rewrite/rewriteHandler.c:3136 +#: rewrite/rewriteHandler.c:3201 #, 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ルールを作成してください。" -#: rewrite/rewriteHandler.c:3141 rewrite/rewriteHandler.c:3177 +#: rewrite/rewriteHandler.c:3206 rewrite/rewriteHandler.c:3242 #, c-format msgid "cannot update view \"%s\"" msgstr "ビュー\"%s\"は更新できません" -#: rewrite/rewriteHandler.c:3144 +#: rewrite/rewriteHandler.c:3209 #, 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ルールを作成してください。" -#: rewrite/rewriteHandler.c:3149 rewrite/rewriteHandler.c:3186 +#: rewrite/rewriteHandler.c:3214 rewrite/rewriteHandler.c:3251 #, c-format msgid "cannot delete from view \"%s\"" msgstr "ビュー\"%s\"からは削除できません" -#: rewrite/rewriteHandler.c:3152 +#: rewrite/rewriteHandler.c:3217 #, 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ルールを作成してください。" -#: rewrite/rewriteHandler.c:3171 +#: rewrite/rewriteHandler.c:3236 #, c-format msgid "To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger." msgstr "MERGEを用いたビューへの挿入を可能にするには、INSTEAD OF INSERTトリガーを作成してください。" -#: rewrite/rewriteHandler.c:3180 +#: rewrite/rewriteHandler.c:3245 #, c-format msgid "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger." msgstr "MERGEを用いたビューの更新を可能にするには、INSTEAD OF UPDATEトリガーを作成してください。" -#: rewrite/rewriteHandler.c:3189 +#: rewrite/rewriteHandler.c:3254 #, c-format msgid "To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger." msgstr "MERGEを用いたビューからの削除を可能にするためには、INSTEAD OF DELETEトリガーを作成してください。" -#: rewrite/rewriteHandler.c:3364 +#: rewrite/rewriteHandler.c:3429 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"への挿入はできません" -#: rewrite/rewriteHandler.c:3372 +#: rewrite/rewriteHandler.c:3437 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"は更新できません" -#: rewrite/rewriteHandler.c:3380 +#: rewrite/rewriteHandler.c:3445 #, c-format msgid "cannot merge into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"への統合はできません" -#: rewrite/rewriteHandler.c:3408 +#: rewrite/rewriteHandler.c:3473 #, c-format msgid "cannot merge into view \"%s\"" msgstr "ビュー\"%s\"への統合はできません" -#: rewrite/rewriteHandler.c:3410 +#: rewrite/rewriteHandler.c:3475 #, c-format msgid "MERGE is not supported for views with INSTEAD OF triggers for some actions but not all." msgstr "MERGEはINSTEAD OFトリガーが全てではなく一部のアクションに対してのみ設定されてるビューではサポートされません。" -#: rewrite/rewriteHandler.c:3411 +#: rewrite/rewriteHandler.c:3476 #, c-format msgid "To enable merging into the view, either provide a full set of INSTEAD OF triggers or drop the existing INSTEAD OF triggers." msgstr "ビューへの統合を可能にするためには、完全なINSTEAD OF INSERTトリガーを作成するか、または既存のINSTEAD OFトリガーを削除してください。" -#: rewrite/rewriteHandler.c:3942 +#: rewrite/rewriteHandler.c:4007 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "DO INSTEAD NOTIFYルールはWITH内のデータ更新文に対してはサポートされません" -#: rewrite/rewriteHandler.c:3953 +#: rewrite/rewriteHandler.c:4018 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は DO INSTEAD NOTHING ルールはサポートされません" -#: rewrite/rewriteHandler.c:3967 +#: rewrite/rewriteHandler.c:4032 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は、条件付き DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:3971 +#: rewrite/rewriteHandler.c:4036 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は DO ALSO ルールはサポートされません" -#: rewrite/rewriteHandler.c:3976 +#: rewrite/rewriteHandler.c:4041 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合はマルチステートメントの DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:4237 +#: rewrite/rewriteHandler.c:4302 msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "条件付きDO INSTEADルールを持つビューは自動更新できません。" -#: rewrite/rewriteHandler.c:4335 +#: rewrite/rewriteHandler.c:4400 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのINSERT RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4337 +#: rewrite/rewriteHandler.c:4402 #, 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:4342 +#: rewrite/rewriteHandler.c:4407 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのUPDATE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4344 +#: rewrite/rewriteHandler.c:4409 #, 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:4349 +#: rewrite/rewriteHandler.c:4414 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのDELETE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4351 +#: rewrite/rewriteHandler.c:4416 #, 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:4369 +#: rewrite/rewriteHandler.c:4434 #, 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:4426 +#: rewrite/rewriteHandler.c:4491 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "複数問い合わせに対するルールにより書き換えられた問い合わせでは WITH を使用できません" -#: rewrite/rewriteManip.c:1175 +#: rewrite/rewriteManip.c:1186 #, c-format msgid "conditional utility statements are not implemented" msgstr "条件付きのユーティリティ文は実装されていません" -#: rewrite/rewriteManip.c:1520 -#, c-format -msgid "WHERE CURRENT OF on a view is not implemented" -msgstr "ビューに対するWHERE CURRENT OFは実装されていません" - -#: rewrite/rewriteManip.c:1923 +#: rewrite/rewriteManip.c:1915 #, 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コマンドでの複数列代入の一部となる列を参照することはできません" @@ -22791,7 +22855,7 @@ msgstr "認識できないSnowballパラメータ: \"%s\"" msgid "missing Language parameter" msgstr "Languageパラメータがありません" -#: statistics/attribute_stats.c:192 statistics/attribute_stats.c:937 statistics/relation_stats.c:98 +#: statistics/attribute_stats.c:192 statistics/attribute_stats.c:963 statistics/relation_stats.c:98 #, c-format msgid "Statistics cannot be modified during recovery." msgstr "リカバリ中は統計情報の更新はできません。" @@ -22831,17 +22895,27 @@ msgstr "列\"%s\"に対する小なり演算子(<)を特定できませんでし msgid "column \"%s\" is not a range type" msgstr "列\"%s\"は範囲型ではありません" -#: statistics/attribute_stats.c:738 +#: statistics/attribute_stats.c:396 +#, c-format +msgid "could not parse \"%s\": incorrect number of elements (same as \"%s\" required)" +msgstr "\"%s\" をパースできませんでした: 要素数が正しくありません (\"%s\" と同数である必要があります)" + +#: statistics/attribute_stats.c:755 +#, c-format +msgid "\"%s\" must be a one-dimensional array" +msgstr "\"%s\" は1次元配列でなければなりません" + +#: statistics/attribute_stats.c:764 #, c-format msgid "\"%s\" array must not contain null values" msgstr "\"%s\"配列にはNULL値を含められません" -#: statistics/attribute_stats.c:781 +#: statistics/attribute_stats.c:807 #, c-format msgid "maximum number of statistics slots exceeded: %d" msgstr "統計情報スロットの最大数を超過しました: %d" -#: statistics/attribute_stats.c:949 +#: statistics/attribute_stats.c:975 #, c-format msgid "cannot clear statistics on system column \"%s\"" msgstr "システム列\"%s\"の統計情報はクリアできません" @@ -22964,103 +23038,103 @@ msgstr "プロセス %d に代わってI/O完了させています" msgid "I/O worker executing I/O on behalf of process %d" msgstr "I/Oワーカーがプロセス %d に代わってI/Oを実行中" -#: storage/buffer/bufmgr.c:662 storage/buffer/bufmgr.c:818 +#: storage/aio/read_stream.c:566 storage/buffer/bufmgr.c:662 storage/buffer/bufmgr.c:1204 storage/buffer/bufmgr.c:1284 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "他のセッションの一時テーブルにはアクセスできません" -#: storage/buffer/bufmgr.c:2703 storage/buffer/localbuf.c:393 +#: storage/buffer/bufmgr.c:2712 storage/buffer/localbuf.c:393 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "リレーション\"%s\"を%uブロックを超えて拡張できません" -#: storage/buffer/bufmgr.c:2774 +#: storage/buffer/bufmgr.c:2783 #, c-format msgid "unexpected data beyond EOF in block %u of relation \"%s\"" msgstr "リレーション\"%2$s\"の%1$uブロック目で、EOF の先に想定外のデータを検出しました" -#: storage/buffer/bufmgr.c:2777 +#: storage/buffer/bufmgr.c:2786 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "これはカーネルの不具合で発生した模様です。システムの更新を検討してください。" -#: storage/buffer/bufmgr.c:6178 +#: storage/buffer/bufmgr.c:6187 #, c-format msgid "could not write block %u of %s" msgstr "%u ブロックを %s に書き出せませんでした" -#: storage/buffer/bufmgr.c:6182 +#: storage/buffer/bufmgr.c:6191 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "複数回失敗しました ---ずっと書き込みエラーが続くかもしれません。" -#: storage/buffer/bufmgr.c:6199 storage/buffer/bufmgr.c:6214 +#: storage/buffer/bufmgr.c:6208 storage/buffer/bufmgr.c:6223 #, c-format msgid "writing block %u of relation \"%s\"" msgstr "リレーション\"%2$s\"のブロック%1$uの書き込み中" -#: storage/buffer/bufmgr.c:7317 +#: storage/buffer/bufmgr.c:7326 #, c-format msgid "zeroing %u page(s) and ignoring %u checksum failure(s) among blocks %u..%u of relation \"%s\"" msgstr "リレーション\"%5$s\"のブロック%3$u..%4$uの間の%1$uページをゼロクリアし、%2$u件のチェックサムエラーを無視します" -#: storage/buffer/bufmgr.c:7320 storage/buffer/bufmgr.c:7348 +#: storage/buffer/bufmgr.c:7329 storage/buffer/bufmgr.c:7357 #, c-format msgid "Block %u held the first zeroed page." msgstr "ゼロクリアした最初のページはブロック%uにありました。" -#: storage/buffer/bufmgr.c:7322 +#: storage/buffer/bufmgr.c:7331 #, c-format msgid "See server log for details about the other %d invalid block." msgid_plural "See server log for details about the other %d invalid blocks." msgstr[0] "他の%d個の不正なブロックの詳細については、サーバーログを参照してください。" -#: storage/buffer/bufmgr.c:7339 +#: storage/buffer/bufmgr.c:7348 #, c-format msgid "%u invalid pages among blocks %u..%u of relation \"%s\"" msgstr "リレーション\"%4$s\"のブロック%2$u..%3$uで%1$uの不正なページ" -#: storage/buffer/bufmgr.c:7340 +#: storage/buffer/bufmgr.c:7349 #, c-format msgid "Block %u held the first invalid page." msgstr "最初の不正なページはブロック%uにありました。" -#: storage/buffer/bufmgr.c:7341 +#: storage/buffer/bufmgr.c:7350 #, c-format msgid "See server log for the other %u invalid block(s)." msgstr "他の%u個の不正なブロックについてはサーバーログを参照してください。" -#: storage/buffer/bufmgr.c:7346 +#: storage/buffer/bufmgr.c:7355 #, c-format msgid "invalid page in block %u of relation \"%s\"; zeroing out page" msgstr "リレーション\"%2$s\"の%1$uブロック目のページが不正です: ページをゼロクリアします" -#: storage/buffer/bufmgr.c:7347 +#: storage/buffer/bufmgr.c:7356 #, c-format msgid "zeroing out %u invalid pages among blocks %u..%u of relation \"%s\"" msgstr "リレーション\"%4$s\"のブロック%2$u..%3$u間の%1$u個の不正なページをゼロクリアします" -#: storage/buffer/bufmgr.c:7349 +#: storage/buffer/bufmgr.c:7358 #, c-format msgid "See server log for the other %u zeroed block(s)." msgstr "他の%u個の0クリアしたブロックについてはサーバーログを参照してください。" -#: storage/buffer/bufmgr.c:7354 +#: storage/buffer/bufmgr.c:7363 #, c-format msgid "ignoring checksum failure in block %u of relation \"%s\"" msgstr "リレーション\"%2$s\"のブロック%1$uでのチェックサムエラーを無視します" -#: storage/buffer/bufmgr.c:7355 +#: storage/buffer/bufmgr.c:7364 #, c-format msgid "ignoring %u checksum failures among blocks %u..%u of relation \"%s\"" msgstr "リレーション\"%4$s\"のブロック%2$u..%3$uでの%1$u件のチェックサムエラーを無視します" -#: storage/buffer/bufmgr.c:7356 +#: storage/buffer/bufmgr.c:7365 #, c-format msgid "Block %u held the first ignored page." msgstr "無視した最初のページはブロック%uにありました。" -#: storage/buffer/bufmgr.c:7357 +#: storage/buffer/bufmgr.c:7366 #, c-format msgid "See server log for the other %u ignored block(s)." msgstr "他の%u個のエラーを無視したブロックについてはサーバーログを参照してください。" @@ -23230,12 +23304,12 @@ msgstr "データディレクトリを同期しています(fsync)、経過時 msgid "\"%s\" is not supported on this platform." msgstr "このプラットフォームでは\"%s\"をサポートしていません。" -#: storage/file/fd.c:4030 tcop/backend_startup.c:1080 +#: storage/file/fd.c:4030 tcop/backend_startup.c:1099 #, c-format msgid "Invalid list syntax in parameter \"%s\"." msgstr "パラメータ\"%s\"のリスト構文が不正です。" -#: storage/file/fd.c:4050 tcop/backend_startup.c:1054 +#: storage/file/fd.c:4050 tcop/backend_startup.c:1073 #, c-format msgid "Invalid option \"%s\"." msgstr "不正なオプション\"%s\"。" @@ -23375,22 +23449,22 @@ msgstr "%s属性を持つロールのみが%s属性を持つロールが接続 msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." msgstr "終了させようとしているプロセスに接続しているロールの権限を持つロール、または\"%sロール権限を持つロールのみがこのプロセスを終了できます。" -#: storage/ipc/procsignal.c:451 +#: storage/ipc/procsignal.c:460 #, c-format msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "PID %dのバックエンドがProcSignalBarrierを受け付けるのを待っています" -#: storage/ipc/procsignal.c:733 +#: storage/ipc/procsignal.c:745 #, c-format msgid "invalid cancel request with PID 0" msgstr "PID 0の不正なキャンセル要求" -#: storage/ipc/procsignal.c:788 +#: storage/ipc/procsignal.c:800 #, c-format msgid "wrong key in cancel request for process %d" msgstr "プロセス%dに対するキャンセル要求においてキーが間違っています" -#: storage/ipc/procsignal.c:797 +#: storage/ipc/procsignal.c:809 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "キャンセル要求内のPID %dがどのプロセスにも一致しません" @@ -23430,17 +23504,12 @@ msgstr "データ構造体\"%s\"のためのShmemIndexエントリのサイズ msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "データ構造体\"%s\"のための共有メモリが不足しています ( %zu バイトが必要)" -#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 -#, c-format -msgid "requested shared memory size overflows size_t" -msgstr "要求された共有メモリのサイズはsize_tを超えています" - #: storage/ipc/signalfuncs.c:74 #, c-format msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %dはPostgreSQLバックエンドプロセスではありません" -#: storage/ipc/signalfuncs.c:123 storage/lmgr/proc.c:1546 utils/adt/mcxtfuncs.c:302 +#: storage/ipc/signalfuncs.c:123 storage/lmgr/proc.c:1579 utils/adt/mcxtfuncs.c:302 #, c-format msgid "could not send signal to process %d: %m" msgstr "プロセス%dにシグナルを送信できませんでした: %m" @@ -23501,12 +23570,12 @@ msgstr "リカバリは%ld.%03dミリ秒経過後待機継続中: %s" msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "リカバリは%ld.%03dミリ秒で待機終了: %s" -#: storage/ipc/standby.c:921 tcop/postgres.c:3223 +#: storage/ipc/standby.c:921 tcop/postgres.c:3224 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "リカバリで競合が発生したためステートメントをキャンセルしています" -#: storage/ipc/standby.c:922 tcop/postgres.c:2573 +#: storage/ipc/standby.c:922 tcop/postgres.c:2574 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "リカバリ時にユーザーのトランザクションがバッファのデッドロックを引き起こしました。" @@ -23768,27 +23837,27 @@ msgstr "リトライが行われた場合、このトランザクションは成 msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" msgstr "要求されたスタンバイ接続が\"max_wal_senders を超えています\" (現在は %d)" -#: storage/lmgr/proc.c:1591 +#: storage/lmgr/proc.c:1624 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "プロセス%1$dは、%4$ld.%5$03d ms後にキューの順番を再調整することで、%3$s上の%2$sに対するデッドロックを防ぎました。" -#: storage/lmgr/proc.c:1606 +#: storage/lmgr/proc.c:1639 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "プロセス%1$dは、%3$s上の%2$sに対し%4$ld.%5$03d ms待機するデッドロックを検知しました" -#: storage/lmgr/proc.c:1615 +#: storage/lmgr/proc.c:1648 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "プロセス%dは%sを%sで待機しています。%ld.%03dミリ秒後" -#: storage/lmgr/proc.c:1622 +#: storage/lmgr/proc.c:1655 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "プロセス%1$dは%4$ld.%5$03d ms後に%3$s上の%2$sを獲得しました" -#: storage/lmgr/proc.c:1639 +#: storage/lmgr/proc.c:1672 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "プロセス%1$dは%4$ld.%5$03d ms後に%3$s上で%2$sを獲得することに失敗しました" @@ -23968,92 +24037,92 @@ msgstr "直接SSL接続を受け付けられました" msgid "direct SSL connection rejected" msgstr "直接SSL接続が拒否されました" -#: tcop/backend_startup.c:528 tcop/backend_startup.c:556 +#: tcop/backend_startup.c:529 tcop/backend_startup.c:557 #, c-format msgid "incomplete startup packet" msgstr "開始パケットが不完全です" -#: tcop/backend_startup.c:540 +#: tcop/backend_startup.c:541 #, c-format msgid "invalid length of startup packet" msgstr "不正な開始パケット長" -#: tcop/backend_startup.c:597 +#: tcop/backend_startup.c:598 #, c-format msgid "SSLRequest accepted" msgstr "SSLRequestを受け付けました" -#: tcop/backend_startup.c:600 +#: tcop/backend_startup.c:601 #, c-format msgid "SSLRequest rejected" msgstr "SSLRequestを拒否しました" -#: tcop/backend_startup.c:609 +#: tcop/backend_startup.c:610 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "SSLネゴシエーション応答の送信に失敗しました: %m" -#: tcop/backend_startup.c:627 +#: tcop/backend_startup.c:628 #, c-format msgid "received unencrypted data after SSL request" msgstr "SSL要求の後に非暗号化データを受信しました" -#: tcop/backend_startup.c:628 tcop/backend_startup.c:682 +#: tcop/backend_startup.c:629 tcop/backend_startup.c:692 #, 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攻撃の証左である可能性があります。" -#: tcop/backend_startup.c:651 +#: tcop/backend_startup.c:661 #, c-format msgid "GSSENCRequest accepted" msgstr "GSSENCRequestを受け付けました" -#: tcop/backend_startup.c:654 +#: tcop/backend_startup.c:664 #, c-format msgid "GSSENCRequest rejected" msgstr "GSSENCRequestを拒否しました" -#: tcop/backend_startup.c:663 +#: tcop/backend_startup.c:673 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "GSSAPIネゴシエーション応答の送信に失敗しました: %m" -#: tcop/backend_startup.c:681 +#: tcop/backend_startup.c:691 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "GSSAPI暗号化リクエストの後に非暗号化データを受信" -#: tcop/backend_startup.c:709 +#: tcop/backend_startup.c:728 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "フロントエンドプロトコル%u.%uをサポートしていません: サーバーは%u.0から %u.%uまでをサポートします" -#: tcop/backend_startup.c:772 +#: tcop/backend_startup.c:791 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "有効な値: \"false\", 0, \"true\", 1, \"database\"。" -#: tcop/backend_startup.c:813 +#: tcop/backend_startup.c:832 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "開始パケットの配置が不正です: 最終バイトはターミネータであるはずです" -#: tcop/backend_startup.c:830 +#: tcop/backend_startup.c:849 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "開始パケットで指定されたPostgreSQLユーザー名は存在しません" -#: tcop/backend_startup.c:884 +#: tcop/backend_startup.c:903 #, c-format msgid "invalid length of cancel request packet" msgstr "不正なキャンセル要求パケット長" -#: tcop/backend_startup.c:892 +#: tcop/backend_startup.c:911 #, c-format msgid "invalid length of cancel key in cancel request packet" msgstr "キャンセル要求パケット中の不正なキャンセルキー長" -#: tcop/backend_startup.c:1022 +#: tcop/backend_startup.c:1041 #, c-format msgid "Cannot specify log_connections option \"%s\" in a list with other options." msgstr "log_connectionsオプション\"%s\"は、リスト内で他のオプションと同時に指定できません。" @@ -24073,7 +24142,7 @@ msgstr "関数\"%s\"は高速呼び出しインタフェースでの呼び出し msgid "fastpath function call: \"%s\" (OID %u)" msgstr "近道関数呼び出し: \"%s\"(OID %u))" -#: tcop/fastpath.c:312 tcop/postgres.c:1363 tcop/postgres.c:1599 tcop/postgres.c:2077 tcop/postgres.c:2349 +#: tcop/fastpath.c:312 tcop/postgres.c:1364 tcop/postgres.c:1600 tcop/postgres.c:2078 tcop/postgres.c:2350 #, c-format msgid "duration: %s ms" msgstr "期間: %s ミリ秒" @@ -24103,155 +24172,155 @@ msgstr "関数呼び出しメッセージ内の引数サイズ%dが不正です" msgid "incorrect binary data format in function argument %d" msgstr "関数引数%dのバイナリデータ書式が不正です" -#: tcop/postgres.c:455 tcop/postgres.c:5018 +#: tcop/postgres.c:456 tcop/postgres.c:5022 #, c-format msgid "invalid frontend message type %d" msgstr "フロントエンドメッセージタイプ%dが不正です" -#: tcop/postgres.c:1070 +#: tcop/postgres.c:1071 #, c-format msgid "statement: %s" msgstr "文: %s" -#: tcop/postgres.c:1368 +#: tcop/postgres.c:1369 #, c-format msgid "duration: %s ms statement: %s" msgstr "期間: %s ミリ秒 文: %s" -#: tcop/postgres.c:1474 +#: tcop/postgres.c:1475 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "準備された文に複数のコマンドを挿入できません" -#: tcop/postgres.c:1604 +#: tcop/postgres.c:1605 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "期間: %s ミリ秒 パース%s : %s" -#: tcop/postgres.c:1671 tcop/postgres.c:2669 +#: tcop/postgres.c:1672 tcop/postgres.c:2670 #, c-format msgid "unnamed prepared statement does not exist" msgstr "無名の準備された文が存在しません" -#: tcop/postgres.c:1723 +#: tcop/postgres.c:1724 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "バインドメッセージは%dパラメータ書式ありましたがパラメータは%dでした" -#: tcop/postgres.c:1729 +#: tcop/postgres.c:1730 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "バインドメッセージは%dパラメータを提供しましたが、準備された文\"%s\"では%d必要でした" -#: tcop/postgres.c:1943 +#: tcop/postgres.c:1944 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "バインドパラメータ%dにおいてバイナリデータ書式が不正です" -#: tcop/postgres.c:2082 +#: tcop/postgres.c:2083 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "期間: %s ミリ秒 バインド %s%s%s: %s" -#: tcop/postgres.c:2137 tcop/postgres.c:2751 +#: tcop/postgres.c:2138 tcop/postgres.c:2752 #, c-format msgid "portal \"%s\" does not exist" msgstr "ポータル\"%s\"は存在しません" -#: tcop/postgres.c:2230 +#: tcop/postgres.c:2231 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2232 tcop/postgres.c:2357 +#: tcop/postgres.c:2233 tcop/postgres.c:2358 msgid "execute fetch from" msgstr "取り出し実行" -#: tcop/postgres.c:2233 tcop/postgres.c:2358 +#: tcop/postgres.c:2234 tcop/postgres.c:2359 msgid "execute" msgstr "実行" -#: tcop/postgres.c:2354 +#: tcop/postgres.c:2355 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "期間: %s ミリ秒 %s %s%s%s: %s" -#: tcop/postgres.c:2502 +#: tcop/postgres.c:2503 #, c-format msgid "prepare: %s" msgstr "準備: %s" -#: tcop/postgres.c:2527 +#: tcop/postgres.c:2528 #, c-format msgid "Parameters: %s" msgstr "パラメータ: %s" -#: tcop/postgres.c:2542 +#: tcop/postgres.c:2543 #, c-format msgid "Abort reason: recovery conflict" msgstr "異常終了の理由: リカバリ衝突" -#: tcop/postgres.c:2558 +#: tcop/postgres.c:2559 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "ユーザーが共有バッファ・ピンを長く保持し過ぎていました" -#: tcop/postgres.c:2561 +#: tcop/postgres.c:2562 #, c-format msgid "User was holding a relation lock for too long." msgstr "ユーザーリレーションのロックを長く保持し過ぎていました" -#: tcop/postgres.c:2564 +#: tcop/postgres.c:2565 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "削除されるべきテーブルスペースをユーザーが使っていました(もしくはその可能性がありました)。" -#: tcop/postgres.c:2567 +#: tcop/postgres.c:2568 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "削除されるべきバージョンの行をユーザー問い合わせが参照しなければならなかった可能性がありました。" -#: tcop/postgres.c:2570 +#: tcop/postgres.c:2571 #, c-format msgid "User was using a logical replication slot that must be invalidated." msgstr "無効化されるべき論理レプリケーションスロットをユーザーが使用していました。" -#: tcop/postgres.c:2576 +#: tcop/postgres.c:2577 #, c-format msgid "User was connected to a database that must be dropped." msgstr "削除されるべきデータベースにユーザーが接続していました。" -#: tcop/postgres.c:2615 +#: tcop/postgres.c:2616 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "ポータル\"%s\" パラメータ$%d = %s" -#: tcop/postgres.c:2618 +#: tcop/postgres.c:2619 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "ポータル\"%s\" パラメータ $%d" -#: tcop/postgres.c:2624 +#: tcop/postgres.c:2625 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "無名ポータルパラメータ $%d = %s" -#: tcop/postgres.c:2627 +#: tcop/postgres.c:2628 #, c-format msgid "unnamed portal parameter $%d" msgstr "無名ポータルパラメータ $%d" -#: tcop/postgres.c:2982 +#: tcop/postgres.c:2983 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "予期しないSIGQUITシグナルによりコネクションを終了します" -#: tcop/postgres.c:2988 +#: tcop/postgres.c:2989 #, c-format msgid "terminating connection because of crash of another server process" msgstr "他のサーバープロセスがクラッシュしたため接続を終了します" -#: tcop/postgres.c:2989 +#: tcop/postgres.c:2990 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "" @@ -24259,162 +24328,162 @@ msgstr "" "postmasterはこのサーバープロセスに対し、現在のトランザクションをロールバック\n" "し終了するよう指示しました。" -#: tcop/postgres.c:2993 tcop/postgres.c:3246 +#: tcop/postgres.c:2994 tcop/postgres.c:3247 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "この後、データベースに再接続し、コマンドを繰り返さなければなりません。" -#: tcop/postgres.c:3000 +#: tcop/postgres.c:3001 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "即時シャットダウンコマンドによりコネクションを終了します" -#: tcop/postgres.c:3078 +#: tcop/postgres.c:3079 #, c-format msgid "floating-point exception" msgstr "浮動小数点例外" -#: tcop/postgres.c:3079 +#: tcop/postgres.c:3080 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "不正な浮動小数点演算がシグナルされました。おそらくこれは、範囲外の結果もしくは0除算のような不正な演算によるものです。" -#: tcop/postgres.c:3244 +#: tcop/postgres.c:3245 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "リカバリで競合が発生したため、接続を終了しています" -#: tcop/postgres.c:3316 +#: tcop/postgres.c:3317 #, c-format msgid "canceling authentication due to timeout" msgstr "タイムアウトにより認証処理をキャンセルしています" -#: tcop/postgres.c:3320 +#: tcop/postgres.c:3321 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "管理者コマンドにより自動VACUUM処理を終了しています" -#: tcop/postgres.c:3324 +#: tcop/postgres.c:3325 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "管理者コマンドにより、論理レプリケーションワーカーを終了します" -#: tcop/postgres.c:3339 +#: tcop/postgres.c:3340 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "管理者コマンドにより WAL 受信プロセスを終了しています" -#: tcop/postgres.c:3355 +#: tcop/postgres.c:3356 #, c-format msgid "terminating connection due to administrator command" msgstr "管理者コマンドにより接続を終了しています" -#: tcop/postgres.c:3386 +#: tcop/postgres.c:3387 #, c-format msgid "connection to client lost" msgstr "クライアントへの接続が切れました。" -#: tcop/postgres.c:3438 +#: tcop/postgres.c:3439 #, c-format msgid "canceling statement due to lock timeout" msgstr "ロックのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3445 +#: tcop/postgres.c:3446 #, c-format msgid "canceling statement due to statement timeout" msgstr "ステートメントのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3452 +#: tcop/postgres.c:3453 #, c-format msgid "canceling autovacuum task" msgstr "自動VACUUM処理をキャンセルしています" -#: tcop/postgres.c:3465 +#: tcop/postgres.c:3466 #, c-format msgid "canceling statement due to user request" msgstr "ユーザーからの要求により文をキャンセルしています" -#: tcop/postgres.c:3486 +#: tcop/postgres.c:3487 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "トランザクション中アイドルタイムアウトのため接続を終了します" -#: tcop/postgres.c:3499 +#: tcop/postgres.c:3500 #, c-format msgid "terminating connection due to transaction timeout" msgstr "トランザクションタイムアウトのため接続を終了します" -#: tcop/postgres.c:3512 +#: tcop/postgres.c:3513 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "アイドルセッションタイムアウトにより接続を終了します" -#: tcop/postgres.c:3548 +#: tcop/postgres.c:3552 #, c-format msgid "\"client_connection_check_interval\" must be set to 0 on this platform." msgstr "このプラットフォームでは\"client_connection_check_interval\"を0に設定する必要があります。" -#: tcop/postgres.c:3569 +#: tcop/postgres.c:3573 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "\"log_statement_stats\"が真の場合、パラメータを有効にできません" -#: tcop/postgres.c:3584 +#: tcop/postgres.c:3588 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "\"log_parser_stats\"、\"log_planner_stats\"、または\"log_executor_stats\"のいずれかがtrueの場合は\"log_statement_stats\"を有効にできません。" -#: tcop/postgres.c:4024 +#: tcop/postgres.c:4028 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "サーバープロセスに対する不正なコマンドライン引数: %s" -#: tcop/postgres.c:4025 tcop/postgres.c:4031 +#: tcop/postgres.c:4029 tcop/postgres.c:4035 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細は\"%s --help\"を実行してください。" -#: tcop/postgres.c:4029 +#: tcop/postgres.c:4033 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: 不正なコマンドライン引数: %s" -#: tcop/postgres.c:4082 +#: tcop/postgres.c:4086 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: データベース名もユーザー名も指定されていません" -#: tcop/postgres.c:4275 +#: tcop/postgres.c:4279 #, c-format msgid "could not generate random cancel key" msgstr "ランダムなキャンセルキーを生成できませんでした" -#: tcop/postgres.c:4677 +#: tcop/postgres.c:4681 #, c-format msgid "connection ready: setup total=%.3f ms, fork=%.3f ms, authentication=%.3f ms" msgstr "接続完了: 所要時間=%.3fミリ秒、fork=%.3fミリ秒、認証処理=%.3fミリ秒" -#: tcop/postgres.c:4908 +#: tcop/postgres.c:4912 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "不正なCLOSEメッセージのサブタイプ%d" -#: tcop/postgres.c:4945 +#: tcop/postgres.c:4949 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "不正なDESCRIBEメッセージのサブタイプ%d" -#: tcop/postgres.c:5039 +#: tcop/postgres.c:5043 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "レプリケーション接続では高速関数呼び出しはサポートされていません" -#: tcop/postgres.c:5043 +#: tcop/postgres.c:5047 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "レプリケーション接続では拡張問い合わせプロトコルはサポートされていません" -#: tcop/postgres.c:5189 +#: tcop/postgres.c:5193 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "接続を切断: セッション時間: %d:%02d:%02d.%03d ユーザー=%s データベース=%s ホスト=%s%s%s" @@ -24515,17 +24584,17 @@ msgstr "重複するAcceptパラメータ" msgid "unrecognized simple dictionary parameter: \"%s\"" msgstr "認識できない単純辞書パラメータ: \"%s\"" -#: tsearch/dict_synonym.c:120 +#: tsearch/dict_synonym.c:119 #, c-format msgid "unrecognized synonym parameter: \"%s\"" msgstr "認識できない類義語パラメータ: \"%s\"" -#: tsearch/dict_synonym.c:127 +#: tsearch/dict_synonym.c:126 #, c-format msgid "missing Synonyms parameter" msgstr "類義語パラメータがありません" -#: tsearch/dict_synonym.c:134 +#: tsearch/dict_synonym.c:133 #, c-format msgid "could not open synonym file \"%s\": %m" msgstr "類義語ファイル\"%s\"をオープンできませんでした: %m" @@ -24600,12 +24669,12 @@ msgstr "認識できないシソーラスパラメータ \"%s\"" msgid "missing Dictionary parameter" msgstr "Dictionaryパラメータがありません" -#: tsearch/spell.c:384 tsearch/spell.c:401 tsearch/spell.c:410 tsearch/spell.c:1041 +#: tsearch/spell.c:384 tsearch/spell.c:401 tsearch/spell.c:410 tsearch/spell.c:1053 #, c-format msgid "invalid affix flag \"%s\"" msgstr "不正な接辞フラグ\"%s\"" -#: tsearch/spell.c:388 tsearch/spell.c:1045 +#: tsearch/spell.c:388 tsearch/spell.c:1057 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "接辞フラグ\"%s\"は範囲外です" @@ -24625,37 +24694,37 @@ msgstr "\"long\"フラグ値を伴った不正な接辞フラグ\"%s\"" msgid "could not open dictionary file \"%s\": %m" msgstr "辞書ファイル\"%s\"をオープンできませんでした: %m" -#: tsearch/spell.c:1168 tsearch/spell.c:1180 tsearch/spell.c:1744 tsearch/spell.c:1749 tsearch/spell.c:1754 +#: tsearch/spell.c:1182 tsearch/spell.c:1194 tsearch/spell.c:1758 tsearch/spell.c:1763 tsearch/spell.c:1768 #, c-format msgid "invalid affix alias \"%s\"" msgstr "不正な接辞の別名 \"%s\"" -#: tsearch/spell.c:1221 tsearch/spell.c:1292 tsearch/spell.c:1441 +#: tsearch/spell.c:1235 tsearch/spell.c:1306 tsearch/spell.c:1455 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "affixファイル\"%s\"をオープンできませんでした: %m" -#: tsearch/spell.c:1275 +#: tsearch/spell.c:1289 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Ispell辞書はフラグ値\"default\"、\"long\"および\"num\"のみをサポートします" -#: tsearch/spell.c:1319 +#: tsearch/spell.c:1333 #, c-format msgid "invalid number of flag vector aliases" msgstr "不正な数のフラグベクタの別名" -#: tsearch/spell.c:1342 +#: tsearch/spell.c:1356 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "別名の数が指定された数 %d を超えています" -#: tsearch/spell.c:1556 +#: tsearch/spell.c:1570 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "接辞ファイルが新旧両方の形式のコマンドを含んでいます" -#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:274 utils/adt/tsvector_op.c:1126 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:274 utils/adt/tsvector_op.c:1099 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "TSベクターのための文字列が長すぎます(%dバイト、最大は%dバイト)" @@ -24690,26 +24759,31 @@ msgstr "ストップワードファイル\"%s\"をオープンできませんで msgid "text search parser does not support headline creation" msgstr "テキスト検索パーサは見出し作成をサポートしません" -#: tsearch/wparser_def.c:2665 +#: tsearch/wparser_def.c:2668 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "認識できない見出しパラメータ: \"%s\"" -#: tsearch/wparser_def.c:2675 +#: tsearch/wparser_def.c:2678 #, c-format msgid "%s must be less than %s" msgstr "\"%s\"は\"%s\"より小さくなければなりません" -#: tsearch/wparser_def.c:2679 +#: tsearch/wparser_def.c:2682 #, c-format msgid "%s must be positive" msgstr "%sは正数でなければなりまsん" -#: tsearch/wparser_def.c:2683 tsearch/wparser_def.c:2687 +#: tsearch/wparser_def.c:2686 tsearch/wparser_def.c:2690 #, c-format msgid "%s must be >= 0" msgstr "%sは0以上でなければなりません" +#: tsearch/wparser_def.c:2729 tsearch/wparser_def.c:2733 tsearch/wparser_def.c:2737 +#, c-format +msgid "value for \"%s\" is too long" +msgstr "\"%s\"の値が長すぎます" + #: utils/activity/pgstat.c:534 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" @@ -24925,68 +24999,73 @@ msgstr "関数\"%s\"は存在しません" msgid "must be able to SET ROLE \"%s\"" msgstr "SET ROLE\"%s\"ができなければなりません" -#: utils/adt/array_userfuncs.c:118 utils/adt/array_userfuncs.c:565 utils/adt/array_userfuncs.c:942 utils/adt/json.c:611 utils/adt/json.c:749 utils/adt/json.c:799 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 +#: utils/adt/array_userfuncs.c:119 utils/adt/array_userfuncs.c:566 utils/adt/array_userfuncs.c:943 utils/adt/json.c:611 utils/adt/json.c:749 utils/adt/json.c:799 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 #, c-format msgid "could not determine input data type" msgstr "入力データ型を特定できませんでした" -#: utils/adt/array_userfuncs.c:123 +#: utils/adt/array_userfuncs.c:124 #, c-format msgid "input data type is not an array" msgstr "入力データ型は配列ではありません" -#: utils/adt/array_userfuncs.c:167 utils/adt/array_userfuncs.c:249 utils/adt/float.c:1229 utils/adt/float.c:1303 utils/adt/float.c:4107 utils/adt/float.c:4145 utils/adt/int.c:807 utils/adt/int.c:829 utils/adt/int.c:843 utils/adt/int.c:857 utils/adt/int.c:888 utils/adt/int.c:909 utils/adt/int.c:1026 utils/adt/int.c:1040 utils/adt/int.c:1054 utils/adt/int.c:1087 utils/adt/int.c:1101 utils/adt/int.c:1115 utils/adt/int.c:1146 utils/adt/int.c:1228 utils/adt/int.c:1292 -#: utils/adt/int.c:1360 utils/adt/int.c:1366 utils/adt/int8.c:1256 utils/adt/numeric.c:2040 utils/adt/numeric.c:4558 utils/adt/rangetypes.c:1552 utils/adt/rangetypes.c:1565 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1148 utils/adt/varlena.c:3202 utils/adt/varlena.c:4136 +#: utils/adt/array_userfuncs.c:168 utils/adt/array_userfuncs.c:250 utils/adt/float.c:1229 utils/adt/float.c:1303 utils/adt/float.c:4107 utils/adt/float.c:4145 utils/adt/int.c:807 utils/adt/int.c:829 utils/adt/int.c:843 utils/adt/int.c:857 utils/adt/int.c:888 utils/adt/int.c:909 utils/adt/int.c:1026 utils/adt/int.c:1040 utils/adt/int.c:1054 utils/adt/int.c:1087 utils/adt/int.c:1101 utils/adt/int.c:1115 utils/adt/int.c:1146 utils/adt/int.c:1228 utils/adt/int.c:1292 +#: utils/adt/int.c:1360 utils/adt/int.c:1366 utils/adt/int8.c:1256 utils/adt/numeric.c:2046 utils/adt/numeric.c:4564 utils/adt/rangetypes.c:1552 utils/adt/rangetypes.c:1565 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1186 utils/adt/varlena.c:3240 utils/adt/varlena.c:4174 #, c-format msgid "integer out of range" msgstr "integerの範囲外です" -#: utils/adt/array_userfuncs.c:174 utils/adt/array_userfuncs.c:259 +#: utils/adt/array_userfuncs.c:175 utils/adt/array_userfuncs.c:260 #, c-format msgid "argument must be empty or one-dimensional array" msgstr "引数は空か1次元の配列でなければなりません" -#: utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:410 utils/adt/array_userfuncs.c:447 utils/adt/array_userfuncs.c:476 utils/adt/array_userfuncs.c:504 +#: utils/adt/array_userfuncs.c:372 utils/adt/array_userfuncs.c:411 utils/adt/array_userfuncs.c:448 utils/adt/array_userfuncs.c:477 utils/adt/array_userfuncs.c:505 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "互換性がない配列を連結できません" -#: utils/adt/array_userfuncs.c:372 +#: utils/adt/array_userfuncs.c:373 #, c-format msgid "Arrays with element types %s and %s are not compatible for concatenation." msgstr "要素型%sと%sの配列の連結には互換性がありません" -#: utils/adt/array_userfuncs.c:411 +#: utils/adt/array_userfuncs.c:412 #, c-format msgid "Arrays of %d and %d dimensions are not compatible for concatenation." msgstr "要素数%dと%dの配列の連結には互換性がありません" -#: utils/adt/array_userfuncs.c:448 +#: utils/adt/array_userfuncs.c:449 #, c-format msgid "Arrays with differing element dimensions are not compatible for concatenation." msgstr "異なる要素次数の配列の連結には互換性がありません。" -#: utils/adt/array_userfuncs.c:477 utils/adt/array_userfuncs.c:505 +#: utils/adt/array_userfuncs.c:478 utils/adt/array_userfuncs.c:506 #, c-format msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "異なる次数の配列の連結には互換性がありません。" -#: utils/adt/array_userfuncs.c:1051 utils/adt/array_userfuncs.c:1059 utils/adt/arrayfuncs.c:5634 utils/adt/arrayfuncs.c:5640 +#: utils/adt/array_userfuncs.c:1053 utils/adt/array_userfuncs.c:1061 utils/adt/arrayfuncs.c:5643 utils/adt/arrayfuncs.c:5649 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "次元の異なる配列は結合できません" -#: utils/adt/array_userfuncs.c:1348 utils/adt/array_userfuncs.c:1502 +#: utils/adt/array_userfuncs.c:1073 utils/adt/arrayfuncs.c:5605 +#, c-format +msgid "array size exceeds the maximum allowed (%zu)" +msgstr "配列のサイズが上限(%zu)を超えています" + +#: utils/adt/array_userfuncs.c:1357 utils/adt/array_userfuncs.c:1511 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "多次元配列内の要素の検索はサポートされません" -#: utils/adt/array_userfuncs.c:1377 +#: utils/adt/array_userfuncs.c:1386 #, c-format msgid "initial position must not be null" msgstr "初期位置nullであってはなりません" -#: utils/adt/array_userfuncs.c:1750 +#: utils/adt/array_userfuncs.c:1759 #, c-format msgid "sample size must be between 0 and %d" msgstr "サンプルの大きさは0と%dの間でなければなりません" @@ -25076,7 +25155,7 @@ msgstr "配列要素が正しくクォートされていません" msgid "Unexpected end of input." msgstr "想定外の入力の終端。" -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3511 utils/adt/arrayfuncs.c:6126 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3511 utils/adt/arrayfuncs.c:6133 #, c-format msgid "invalid number of dimensions: %d" msgstr "不正な次元数: %d" @@ -25091,7 +25170,7 @@ msgstr "不正な配列フラグ" msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "バイナリデータ中に期待される型%3$u(%4$s)の代わりに%1$u(%2$s)がありました" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 utils/adt/rangetypes.c:353 utils/cache/lsyscache.c:3098 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:451 utils/adt/rangetypes.c:353 utils/cache/lsyscache.c:3211 #, c-format msgid "no binary input function available for type %s" msgstr "型%sにはバイナリ入力関数がありません" @@ -25101,7 +25180,7 @@ msgstr "型%sにはバイナリ入力関数がありません" msgid "improper binary format in array element %d" msgstr "配列要素%dのバイナリ書式が不適切です" -#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 utils/adt/rangetypes.c:358 utils/cache/lsyscache.c:3131 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:456 utils/adt/rangetypes.c:358 utils/cache/lsyscache.c:3244 #, c-format msgid "no binary output function available for type %s" msgstr "型%sにはバイナリ出力関数がありません" @@ -25111,7 +25190,7 @@ msgstr "型%sにはバイナリ出力関数がありません" msgid "slices of fixed-length arrays not implemented" msgstr "固定長配列の部分配列は実装されていません" -#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6112 utils/adt/arrayfuncs.c:6138 utils/adt/arrayfuncs.c:6149 utils/adt/json.c:1441 utils/adt/json.c:1509 utils/adt/jsonb.c:1317 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4734 utils/adt/jsonfuncs.c:4887 utils/adt/jsonfuncs.c:4998 utils/adt/jsonfuncs.c:5046 +#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6119 utils/adt/arrayfuncs.c:6145 utils/adt/arrayfuncs.c:6156 utils/adt/json.c:1441 utils/adt/json.c:1509 utils/adt/jsonb.c:1317 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4734 utils/adt/jsonfuncs.c:4887 utils/adt/jsonfuncs.c:4998 utils/adt/jsonfuncs.c:5046 #, c-format msgid "wrong number of array subscripts" msgstr "配列の添え字が不正な数値です" @@ -25156,7 +25235,7 @@ msgstr "この文脈ではNULLの配列要素は許可されません" msgid "cannot compare arrays of different element types" msgstr "要素型の異なる配列を比較できません" -#: utils/adt/arrayfuncs.c:4195 utils/adt/multirangetypes.c:2806 utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1425 utils/adt/rangetypes.c:1489 utils/adt/rowtypes.c:1893 +#: utils/adt/arrayfuncs.c:4195 utils/adt/multirangetypes.c:2807 utils/adt/multirangetypes.c:2879 utils/adt/rangetypes.c:1425 utils/adt/rangetypes.c:1489 utils/adt/rowtypes.c:1893 #, c-format msgid "could not identify a hash function for type %s" msgstr "型 %s のハッシュ関数を特定できません" @@ -25171,52 +25250,52 @@ msgstr "型 %s の拡張ハッシュ関数を特定できませんでした" msgid "data type %s is not an array type" msgstr "データ型%sは配列型ではありません" -#: utils/adt/arrayfuncs.c:5579 +#: utils/adt/arrayfuncs.c:5580 #, c-format msgid "cannot accumulate null arrays" msgstr "null配列は連結できません" -#: utils/adt/arrayfuncs.c:5607 +#: utils/adt/arrayfuncs.c:5616 #, c-format msgid "cannot accumulate empty arrays" msgstr "空の配列は連結できません" -#: utils/adt/arrayfuncs.c:6010 utils/adt/arrayfuncs.c:6050 +#: utils/adt/arrayfuncs.c:6017 utils/adt/arrayfuncs.c:6057 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "次元配列もしくは下限値配列が NULL であってはなりません" -#: utils/adt/arrayfuncs.c:6113 utils/adt/arrayfuncs.c:6139 +#: utils/adt/arrayfuncs.c:6120 utils/adt/arrayfuncs.c:6146 #, c-format msgid "Dimension array must be one dimensional." msgstr "次元配列は1次元でなければなりません" -#: utils/adt/arrayfuncs.c:6118 utils/adt/arrayfuncs.c:6144 +#: utils/adt/arrayfuncs.c:6125 utils/adt/arrayfuncs.c:6151 #, c-format msgid "dimension values cannot be null" msgstr "次元値にnullにはできません" -#: utils/adt/arrayfuncs.c:6150 +#: utils/adt/arrayfuncs.c:6157 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "下限配列が次元配列のサイズと異なっています" -#: utils/adt/arrayfuncs.c:6431 +#: utils/adt/arrayfuncs.c:6438 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "多次元配列からの要素削除はサポートされません" -#: utils/adt/arrayfuncs.c:6708 +#: utils/adt/arrayfuncs.c:6715 #, c-format msgid "thresholds must be one-dimensional array" msgstr "閾値は1次元の配列でなければなりません" -#: utils/adt/arrayfuncs.c:6713 +#: utils/adt/arrayfuncs.c:6720 #, c-format msgid "thresholds array must not contain NULLs" msgstr "閾値配列にはNULL値を含めてはいけません" -#: utils/adt/arrayfuncs.c:6946 +#: utils/adt/arrayfuncs.c:6953 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "削除する要素の数は0と%dとの間でなければなりません" @@ -25258,7 +25337,7 @@ msgstr "%s符号化方式からASCIIへの変換はサポートされていま #. translator: first %s is inet or cidr #: utils/adt/bool.c:150 utils/adt/cash.c:354 utils/adt/datetime.c:4264 utils/adt/float.c:207 utils/adt/float.c:294 utils/adt/float.c:308 utils/adt/float.c:413 utils/adt/float.c:496 utils/adt/float.c:510 utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 utils/adt/geo_ops.c:4672 utils/adt/int.c:198 -#: utils/adt/int.c:210 utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 utils/adt/network.c:99 utils/adt/numeric.c:805 utils/adt/numeric.c:7325 utils/adt/numeric.c:7528 utils/adt/numeric.c:8475 utils/adt/numutils.c:356 utils/adt/numutils.c:617 utils/adt/numutils.c:878 utils/adt/numutils.c:917 utils/adt/numutils.c:939 utils/adt/numutils.c:1003 utils/adt/numutils.c:1025 utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 utils/adt/tid.c:94 +#: utils/adt/int.c:210 utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 utils/adt/network.c:99 utils/adt/numeric.c:805 utils/adt/numeric.c:7331 utils/adt/numeric.c:7534 utils/adt/numeric.c:8481 utils/adt/numutils.c:356 utils/adt/numutils.c:617 utils/adt/numutils.c:878 utils/adt/numutils.c:917 utils/adt/numutils.c:939 utils/adt/numutils.c:1003 utils/adt/numutils.c:1025 utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 utils/adt/tid.c:94 #: utils/adt/tid.c:103 utils/adt/timestamp.c:512 utils/adt/uuid.c:176 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" @@ -25269,8 +25348,8 @@ msgstr "\"%s\"型の入力構文が不正です: \"%s\"" msgid "money out of range" msgstr "マネー型の値が範囲外です" -#: utils/adt/cash.c:161 utils/adt/cash.c:725 utils/adt/float.c:106 utils/adt/int.c:872 utils/adt/int.c:988 utils/adt/int.c:1068 utils/adt/int.c:1130 utils/adt/int.c:1168 utils/adt/int.c:1196 utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 utils/adt/numeric.c:3295 utils/adt/numeric.c:3318 utils/adt/numeric.c:3403 utils/adt/numeric.c:3421 utils/adt/numeric.c:3517 utils/adt/numeric.c:9400 -#: utils/adt/numeric.c:9924 utils/adt/numeric.c:10040 utils/adt/numeric.c:11551 utils/adt/timestamp.c:3772 +#: utils/adt/cash.c:161 utils/adt/cash.c:725 utils/adt/float.c:106 utils/adt/int.c:872 utils/adt/int.c:988 utils/adt/int.c:1068 utils/adt/int.c:1130 utils/adt/int.c:1168 utils/adt/int.c:1196 utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 utils/adt/numeric.c:3301 utils/adt/numeric.c:3324 utils/adt/numeric.c:3409 utils/adt/numeric.c:3427 utils/adt/numeric.c:3523 utils/adt/numeric.c:9406 +#: utils/adt/numeric.c:9930 utils/adt/numeric.c:10046 utils/adt/numeric.c:11557 utils/adt/timestamp.c:3776 #, c-format msgid "division by zero" msgstr "0 による除算が行われました" @@ -25305,7 +25384,7 @@ msgstr "(%d)%sの精度は負ではいけません" msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%sの位取りを許容最大値%dまで減らしました" -#: utils/adt/date.c:168 utils/adt/date.c:176 utils/adt/formatting.c:4172 utils/adt/formatting.c:4181 utils/adt/formatting.c:4286 utils/adt/formatting.c:4296 +#: utils/adt/date.c:168 utils/adt/date.c:176 utils/adt/formatting.c:4174 utils/adt/formatting.c:4183 utils/adt/formatting.c:4288 utils/adt/formatting.c:4298 #, c-format msgid "date out of range: \"%s\"" msgstr "日付が範囲外です: \"%s\"" @@ -25335,25 +25414,25 @@ msgstr "無限大の日付は減算できません" msgid "date out of range for timestamp" msgstr "タイムスタンプで日付が範囲外です" -#: utils/adt/date.c:1187 utils/adt/date.c:1270 utils/adt/date.c:1286 utils/adt/date.c:2280 utils/adt/date.c:3076 utils/adt/timestamp.c:4724 utils/adt/timestamp.c:4815 utils/adt/timestamp.c:4963 utils/adt/timestamp.c:5064 utils/adt/timestamp.c:5179 utils/adt/timestamp.c:5231 utils/adt/timestamp.c:5488 utils/adt/timestamp.c:5689 utils/adt/timestamp.c:5736 utils/adt/timestamp.c:5960 utils/adt/timestamp.c:6007 utils/adt/timestamp.c:6088 utils/adt/timestamp.c:6232 +#: utils/adt/date.c:1187 utils/adt/date.c:1270 utils/adt/date.c:1286 utils/adt/date.c:2280 utils/adt/date.c:3076 utils/adt/timestamp.c:4728 utils/adt/timestamp.c:4819 utils/adt/timestamp.c:4967 utils/adt/timestamp.c:5068 utils/adt/timestamp.c:5183 utils/adt/timestamp.c:5235 utils/adt/timestamp.c:5492 utils/adt/timestamp.c:5693 utils/adt/timestamp.c:5740 utils/adt/timestamp.c:5964 utils/adt/timestamp.c:6011 utils/adt/timestamp.c:6092 utils/adt/timestamp.c:6236 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "単位\"%s\"は型%sに対してはサポートされていません" -#: utils/adt/date.c:1295 utils/adt/date.c:2296 utils/adt/date.c:3096 utils/adt/timestamp.c:4829 utils/adt/timestamp.c:5081 utils/adt/timestamp.c:5245 utils/adt/timestamp.c:5448 utils/adt/timestamp.c:5745 utils/adt/timestamp.c:6016 utils/adt/timestamp.c:6057 utils/adt/timestamp.c:6293 +#: utils/adt/date.c:1295 utils/adt/date.c:2296 utils/adt/date.c:3096 utils/adt/timestamp.c:4833 utils/adt/timestamp.c:5085 utils/adt/timestamp.c:5249 utils/adt/timestamp.c:5452 utils/adt/timestamp.c:5749 utils/adt/timestamp.c:6020 utils/adt/timestamp.c:6061 utils/adt/timestamp.c:6297 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "単位\"%s\"は型%sに対しては認識できません" -#: utils/adt/date.c:1379 utils/adt/date.c:1425 utils/adt/date.c:1984 utils/adt/date.c:2015 utils/adt/date.c:2044 utils/adt/date.c:2934 utils/adt/date.c:3166 utils/adt/datetime.c:432 utils/adt/datetime.c:1826 utils/adt/formatting.c:4017 utils/adt/formatting.c:4053 utils/adt/formatting.c:4140 utils/adt/formatting.c:4262 utils/adt/json.c:375 utils/adt/json.c:414 utils/adt/timestamp.c:250 utils/adt/timestamp.c:282 utils/adt/timestamp.c:707 utils/adt/timestamp.c:716 -#: utils/adt/timestamp.c:794 utils/adt/timestamp.c:827 utils/adt/timestamp.c:3125 utils/adt/timestamp.c:3134 utils/adt/timestamp.c:3151 utils/adt/timestamp.c:3156 utils/adt/timestamp.c:3175 utils/adt/timestamp.c:3188 utils/adt/timestamp.c:3199 utils/adt/timestamp.c:3205 utils/adt/timestamp.c:3211 utils/adt/timestamp.c:3216 utils/adt/timestamp.c:3269 utils/adt/timestamp.c:3278 utils/adt/timestamp.c:3299 utils/adt/timestamp.c:3304 utils/adt/timestamp.c:3325 -#: utils/adt/timestamp.c:3338 utils/adt/timestamp.c:3352 utils/adt/timestamp.c:3360 utils/adt/timestamp.c:3366 utils/adt/timestamp.c:3371 utils/adt/timestamp.c:4439 utils/adt/timestamp.c:4591 utils/adt/timestamp.c:4667 utils/adt/timestamp.c:4733 utils/adt/timestamp.c:4823 utils/adt/timestamp.c:4902 utils/adt/timestamp.c:4972 utils/adt/timestamp.c:5075 utils/adt/timestamp.c:5553 utils/adt/timestamp.c:5827 utils/adt/timestamp.c:6361 utils/adt/timestamp.c:6371 -#: utils/adt/timestamp.c:6376 utils/adt/timestamp.c:6382 utils/adt/timestamp.c:6422 utils/adt/timestamp.c:6509 utils/adt/timestamp.c:6550 utils/adt/timestamp.c:6554 utils/adt/timestamp.c:6608 utils/adt/timestamp.c:6612 utils/adt/timestamp.c:6618 utils/adt/timestamp.c:6659 utils/adt/xml.c:2575 utils/adt/xml.c:2582 utils/adt/xml.c:2602 utils/adt/xml.c:2609 +#: utils/adt/date.c:1379 utils/adt/date.c:1425 utils/adt/date.c:1984 utils/adt/date.c:2015 utils/adt/date.c:2044 utils/adt/date.c:2934 utils/adt/date.c:3166 utils/adt/datetime.c:432 utils/adt/datetime.c:1826 utils/adt/formatting.c:4019 utils/adt/formatting.c:4055 utils/adt/formatting.c:4142 utils/adt/formatting.c:4264 utils/adt/json.c:375 utils/adt/json.c:414 utils/adt/timestamp.c:250 utils/adt/timestamp.c:282 utils/adt/timestamp.c:707 utils/adt/timestamp.c:716 +#: utils/adt/timestamp.c:794 utils/adt/timestamp.c:827 utils/adt/timestamp.c:3129 utils/adt/timestamp.c:3138 utils/adt/timestamp.c:3155 utils/adt/timestamp.c:3160 utils/adt/timestamp.c:3179 utils/adt/timestamp.c:3192 utils/adt/timestamp.c:3203 utils/adt/timestamp.c:3209 utils/adt/timestamp.c:3215 utils/adt/timestamp.c:3220 utils/adt/timestamp.c:3273 utils/adt/timestamp.c:3282 utils/adt/timestamp.c:3303 utils/adt/timestamp.c:3308 utils/adt/timestamp.c:3329 +#: utils/adt/timestamp.c:3342 utils/adt/timestamp.c:3356 utils/adt/timestamp.c:3364 utils/adt/timestamp.c:3370 utils/adt/timestamp.c:3375 utils/adt/timestamp.c:4443 utils/adt/timestamp.c:4595 utils/adt/timestamp.c:4671 utils/adt/timestamp.c:4737 utils/adt/timestamp.c:4827 utils/adt/timestamp.c:4906 utils/adt/timestamp.c:4976 utils/adt/timestamp.c:5079 utils/adt/timestamp.c:5557 utils/adt/timestamp.c:5831 utils/adt/timestamp.c:6365 utils/adt/timestamp.c:6375 +#: utils/adt/timestamp.c:6380 utils/adt/timestamp.c:6386 utils/adt/timestamp.c:6426 utils/adt/timestamp.c:6513 utils/adt/timestamp.c:6554 utils/adt/timestamp.c:6558 utils/adt/timestamp.c:6612 utils/adt/timestamp.c:6616 utils/adt/timestamp.c:6622 utils/adt/timestamp.c:6663 utils/adt/xml.c:2575 utils/adt/xml.c:2582 utils/adt/xml.c:2602 utils/adt/xml.c:2609 #, c-format msgid "timestamp out of range" msgstr "timestampの範囲外です" -#: utils/adt/date.c:1601 utils/adt/date.c:2417 utils/adt/formatting.c:4345 +#: utils/adt/date.c:1601 utils/adt/date.c:2417 utils/adt/formatting.c:4347 #, c-format msgid "time out of range" msgstr "時刻が範囲外です" @@ -25378,7 +25457,7 @@ msgstr "無限大のintervalのtimeへの加算はできません" msgid "cannot subtract infinite interval from time" msgstr "無限大のintervalのtimeからの減算できません" -#: utils/adt/date.c:2180 utils/adt/date.c:2732 utils/adt/float.c:1043 utils/adt/float.c:1119 utils/adt/int.c:664 utils/adt/int.c:711 utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2699 utils/adt/timestamp.c:3869 utils/adt/timestamp.c:3906 utils/adt/timestamp.c:3947 +#: utils/adt/date.c:2180 utils/adt/date.c:2732 utils/adt/float.c:1043 utils/adt/float.c:1119 utils/adt/int.c:664 utils/adt/int.c:711 utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2705 utils/adt/timestamp.c:3873 utils/adt/timestamp.c:3910 utils/adt/timestamp.c:3951 #, c-format msgid "invalid preceding or following size in window function" msgstr "ウィンドウ関数での不正なサイズの PRECEDING または FOLLOWING 指定" @@ -25388,12 +25467,12 @@ msgstr "ウィンドウ関数での不正なサイズの PRECEDING または FOL msgid "time zone displacement out of range" msgstr "タイムゾーンの置換が範囲外です" -#: utils/adt/date.c:3197 utils/adt/timestamp.c:6404 utils/adt/timestamp.c:6641 +#: utils/adt/date.c:3197 utils/adt/timestamp.c:6408 utils/adt/timestamp.c:6645 #, c-format msgid "interval time zone \"%s\" must be finite" msgstr "タイムゾーンのインターバル\"%s\"は有限でなければなりません" -#: utils/adt/date.c:3204 utils/adt/timestamp.c:6411 utils/adt/timestamp.c:6648 +#: utils/adt/date.c:3204 utils/adt/timestamp.c:6415 utils/adt/timestamp.c:6652 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "intervalによるタイムゾーン\"%s\"には月または日を含めてはいけません" @@ -25553,32 +25632,32 @@ msgstr "型realでは\"%s\"は範囲外です" msgid "\"%s\" is out of range for type double precision" msgstr "型double precisionでは\"%s\"は範囲外です" -#: utils/adt/float.c:1254 utils/adt/float.c:1328 utils/adt/int.c:384 utils/adt/int.c:922 utils/adt/int.c:944 utils/adt/int.c:958 utils/adt/int.c:972 utils/adt/int.c:1004 utils/adt/int.c:1242 utils/adt/int8.c:1277 utils/adt/numeric.c:4697 utils/adt/numeric.c:4702 utils/adt/varlena.c:4111 +#: utils/adt/float.c:1254 utils/adt/float.c:1328 utils/adt/int.c:384 utils/adt/int.c:922 utils/adt/int.c:944 utils/adt/int.c:958 utils/adt/int.c:972 utils/adt/int.c:1004 utils/adt/int.c:1242 utils/adt/int8.c:1277 utils/adt/numeric.c:4703 utils/adt/numeric.c:4708 utils/adt/varlena.c:4149 #, c-format msgid "smallint out of range" msgstr "smallintの範囲外です" -#: utils/adt/float.c:1454 utils/adt/numeric.c:3813 utils/adt/numeric.c:10455 +#: utils/adt/float.c:1454 utils/adt/numeric.c:3819 utils/adt/numeric.c:10461 #, c-format msgid "cannot take square root of a negative number" msgstr "負の値の平方根を取ることができません" -#: utils/adt/float.c:1522 utils/adt/numeric.c:4101 utils/adt/numeric.c:4213 +#: utils/adt/float.c:1522 utils/adt/numeric.c:4107 utils/adt/numeric.c:4219 #, c-format msgid "zero raised to a negative power is undefined" msgstr "0 の負数乗は定義されていません" -#: utils/adt/float.c:1526 utils/adt/numeric.c:4105 utils/adt/numeric.c:11346 +#: utils/adt/float.c:1526 utils/adt/numeric.c:4111 utils/adt/numeric.c:11352 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "負数を整数でない数でべき乗すると、結果が複雑になります" -#: utils/adt/float.c:1702 utils/adt/float.c:1735 utils/adt/numeric.c:4013 utils/adt/numeric.c:11126 +#: utils/adt/float.c:1702 utils/adt/float.c:1735 utils/adt/numeric.c:4019 utils/adt/numeric.c:11132 #, c-format msgid "cannot take logarithm of zero" msgstr "ゼロの対数を取ることができません" -#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3951 utils/adt/numeric.c:4008 utils/adt/numeric.c:11130 +#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3957 utils/adt/numeric.c:4014 utils/adt/numeric.c:11136 #, c-format msgid "cannot take logarithm of a negative number" msgstr "負の値の対数を取ることができません" @@ -25588,22 +25667,22 @@ msgstr "負の値の対数を取ることができません" msgid "input is out of range" msgstr "入力が範囲外です" -#: utils/adt/float.c:4085 utils/adt/numeric.c:1980 +#: utils/adt/float.c:4085 utils/adt/numeric.c:1986 #, c-format msgid "count must be greater than zero" msgstr "カウントは0より大きくなければなりません" -#: utils/adt/float.c:4090 utils/adt/numeric.c:1991 +#: utils/adt/float.c:4090 utils/adt/numeric.c:1997 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "オペランド、下限および上限をNaNにすることはできません" -#: utils/adt/float.c:4096 utils/adt/numeric.c:1996 +#: utils/adt/float.c:4096 utils/adt/numeric.c:2002 #, c-format msgid "lower and upper bounds must be finite" msgstr "下限および上限は有限でなければなりません" -#: utils/adt/float.c:4162 utils/adt/numeric.c:2010 +#: utils/adt/float.c:4162 utils/adt/numeric.c:2016 #, c-format msgid "lower bound cannot equal upper bound" msgstr "下限を上限と同じにできません" @@ -25618,257 +25697,257 @@ msgstr "\"tinterval\"値に対する不正な書式指定" msgid "Intervals are not tied to specific calendar dates." msgstr "時間間隔が特定の暦日付に結びついていません" -#: utils/adt/formatting.c:1197 +#: utils/adt/formatting.c:1199 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\"は最終パターンでなければなりません。" -#: utils/adt/formatting.c:1205 +#: utils/adt/formatting.c:1207 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1221 +#: utils/adt/formatting.c:1223 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1248 +#: utils/adt/formatting.c:1250 #, c-format msgid "multiple decimal points" msgstr "複数の小数点があります" -#: utils/adt/formatting.c:1252 utils/adt/formatting.c:1339 +#: utils/adt/formatting.c:1254 utils/adt/formatting.c:1341 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "\"V\"と小数点を混在できません" -#: utils/adt/formatting.c:1264 +#: utils/adt/formatting.c:1266 #, c-format msgid "cannot use \"S\" twice" msgstr "\"S\"は1回しか使用できません" -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1270 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "\"S\"と\"PL\"/\"MI\"/\"SG\"/\"PR\"を混在できません" -#: utils/adt/formatting.c:1288 +#: utils/adt/formatting.c:1290 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "\"S\"と\"MI\"を混在できません" -#: utils/adt/formatting.c:1298 +#: utils/adt/formatting.c:1300 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "\"S\"と\"PL\"を混在できません" -#: utils/adt/formatting.c:1308 +#: utils/adt/formatting.c:1310 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "\"S\"と\"SG\"を混在できません" -#: utils/adt/formatting.c:1317 +#: utils/adt/formatting.c:1319 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "\"PR\"と\"S\"/\"PL\"/\"MI\"/\"SG\"を混在できません" -#: utils/adt/formatting.c:1326 +#: utils/adt/formatting.c:1328 #, c-format msgid "cannot use \"RN\" twice" msgstr "\"RN\"は1回しか使用できません" -#: utils/adt/formatting.c:1347 +#: utils/adt/formatting.c:1349 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "\"EEEE\"は1回しか使用できません" -#: utils/adt/formatting.c:1353 +#: utils/adt/formatting.c:1355 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\"が他のフォーマットと互換性がありません" -#: utils/adt/formatting.c:1354 +#: utils/adt/formatting.c:1356 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\"は数値および小数点パターンと共にのみ使用できます。" -#: utils/adt/formatting.c:1363 +#: utils/adt/formatting.c:1365 #, c-format msgid "\"RN\" is incompatible with other formats" msgstr "\"RN\"が他のフォーマットと互換性がありません" -#: utils/adt/formatting.c:1364 +#: utils/adt/formatting.c:1366 #, c-format msgid "\"RN\" may only be used together with \"FM\"." msgstr "\"RN\"は\"FM\"と共にのみ使用できます。" -#: utils/adt/formatting.c:1445 +#: utils/adt/formatting.c:1447 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "不正なdatetime書式のセパレータ: \"%s\"" -#: utils/adt/formatting.c:1572 +#: utils/adt/formatting.c:1574 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\"は数値ではありません" -#: utils/adt/formatting.c:1653 utils/adt/formatting.c:1717 utils/adt/formatting.c:1781 utils/adt/formatting.c:1845 +#: utils/adt/formatting.c:1655 utils/adt/formatting.c:1719 utils/adt/formatting.c:1783 utils/adt/formatting.c:1847 #, c-format msgid "could not determine which collation to use for %s function" msgstr "%s 関数に対して使用する照合順序を特定できませんでした" -#: utils/adt/formatting.c:1853 +#: utils/adt/formatting.c:1855 #, c-format msgid "Unicode case folding can only be performed if server encoding is UTF8" msgstr "UnicodeケースフォールディングはサーバーエンコーディングがUTF-8の場合にのみ実行可能です" -#: utils/adt/formatting.c:2150 +#: utils/adt/formatting.c:2152 #, c-format msgid "invalid combination of date conventions" msgstr "不正な暦法の組み合わせ" -#: utils/adt/formatting.c:2151 +#: utils/adt/formatting.c:2153 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "単一の書式テンプレートの中では、グレゴリオ暦とISO歴週日付を混在させないでください。" -#: utils/adt/formatting.c:2173 +#: utils/adt/formatting.c:2175 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "書式文字列中で\"%s\"フィールドの値が衝突しています" -#: utils/adt/formatting.c:2175 +#: utils/adt/formatting.c:2177 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "この値は同じフィールド型に対する以前の設定と矛盾しています" -#: utils/adt/formatting.c:2242 +#: utils/adt/formatting.c:2244 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "書式フィールド\"%s\"に対して元の文字列が短すぎます" -#: utils/adt/formatting.c:2244 +#: utils/adt/formatting.c:2246 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "フィールドには%d文字必要ですが、%d文字しか残っていません。" -#: utils/adt/formatting.c:2246 utils/adt/formatting.c:2260 +#: utils/adt/formatting.c:2248 utils/adt/formatting.c:2262 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "元の文字列が固定長でない場合は、修飾子\"FM\"を試してみてください。" -#: utils/adt/formatting.c:2256 utils/adt/formatting.c:2269 utils/adt/formatting.c:2490 utils/adt/formatting.c:3390 utils/adt/formatting.c:3593 +#: utils/adt/formatting.c:2258 utils/adt/formatting.c:2271 utils/adt/formatting.c:2492 utils/adt/formatting.c:3392 utils/adt/formatting.c:3595 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "\"%2$s\"に対する不正な値\"%1$s\"" -#: utils/adt/formatting.c:2258 +#: utils/adt/formatting.c:2260 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "このフィールドには%d文字必要ですが、%d文字しかパースされませんでした。" -#: utils/adt/formatting.c:2271 +#: utils/adt/formatting.c:2273 #, c-format msgid "Value must be an integer." msgstr "値は整数でなければなりません。" -#: utils/adt/formatting.c:2276 utils/adt/formatting.c:3601 +#: utils/adt/formatting.c:2278 utils/adt/formatting.c:3603 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "もとの文字列において\"%s\"に対応する値が範囲外です" -#: utils/adt/formatting.c:2278 +#: utils/adt/formatting.c:2280 #, c-format msgid "Value must be in the range %d to %d." msgstr "値は%dから%dまでの範囲でなければなりません。" -#: utils/adt/formatting.c:2492 +#: utils/adt/formatting.c:2494 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "与えられた値がこの項目に対して許されるいずれの値ともマッチしません。" -#: utils/adt/formatting.c:2708 utils/adt/formatting.c:2728 utils/adt/formatting.c:2748 utils/adt/formatting.c:2768 utils/adt/formatting.c:2787 utils/adt/formatting.c:2806 utils/adt/formatting.c:2830 utils/adt/formatting.c:2848 utils/adt/formatting.c:2866 utils/adt/formatting.c:2884 utils/adt/formatting.c:2901 utils/adt/formatting.c:2918 +#: utils/adt/formatting.c:2710 utils/adt/formatting.c:2730 utils/adt/formatting.c:2750 utils/adt/formatting.c:2770 utils/adt/formatting.c:2789 utils/adt/formatting.c:2808 utils/adt/formatting.c:2832 utils/adt/formatting.c:2850 utils/adt/formatting.c:2868 utils/adt/formatting.c:2886 utils/adt/formatting.c:2903 utils/adt/formatting.c:2920 #, c-format msgid "localized string format value too long" msgstr "地域化した文字列のフォーマットが長すぎます" -#: utils/adt/formatting.c:3198 +#: utils/adt/formatting.c:3200 #, c-format msgid "unmatched format separator \"%c\"" msgstr "合致しないフォーマットセパレータ \"%c\"" -#: utils/adt/formatting.c:3259 +#: utils/adt/formatting.c:3261 #, c-format msgid "unmatched format character \"%s\"" msgstr "合致しないフォーマット文字\"%s\"" -#: utils/adt/formatting.c:3392 +#: utils/adt/formatting.c:3394 #, c-format msgid "Time zone abbreviation is not recognized." msgstr "タイムゾーン省略名が認識されません。" -#: utils/adt/formatting.c:3690 +#: utils/adt/formatting.c:3692 #, c-format msgid "input string is too short for datetime format" msgstr "datetime書式に対して入力文字列が短すぎます" -#: utils/adt/formatting.c:3698 +#: utils/adt/formatting.c:3700 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "datetimeフォーマット後に文字が入力文字列中に残っています" -#: utils/adt/formatting.c:4242 +#: utils/adt/formatting.c:4244 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "timestamptz型に対応する入力に時間帯がありません" -#: utils/adt/formatting.c:4248 +#: utils/adt/formatting.c:4250 #, c-format msgid "timestamptz out of range" msgstr "timestamptzの範囲外です" -#: utils/adt/formatting.c:4276 +#: utils/adt/formatting.c:4278 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetimeフォーマットで時間帯は指定されていますが、時刻が指定されていません" -#: utils/adt/formatting.c:4325 +#: utils/adt/formatting.c:4327 #, c-format msgid "missing time zone in input string for type timetz" msgstr "timetz型に対する入力文字列中に時間帯がありません" -#: utils/adt/formatting.c:4331 +#: utils/adt/formatting.c:4333 #, c-format msgid "timetz out of range" msgstr "timetzの範囲外です" -#: utils/adt/formatting.c:4357 +#: utils/adt/formatting.c:4359 #, c-format msgid "datetime format is not dated and not timed" msgstr "datetimeフォーマットで日付は指定されていますが、時間が指定されていません" -#: utils/adt/formatting.c:4534 +#: utils/adt/formatting.c:4536 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "12時間形式では\"%d\"時は不正です" -#: utils/adt/formatting.c:4536 +#: utils/adt/formatting.c:4538 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "24時間形式を使うか、もしくは 1 から 12 の間で指定してください。" -#: utils/adt/formatting.c:4713 +#: utils/adt/formatting.c:4715 #, c-format msgid "cannot calculate day of year without year information" msgstr "年の情報なしでは年内の日数は計算できません" -#: utils/adt/formatting.c:5836 +#: utils/adt/formatting.c:5849 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\"は入力としてサポートしていません" -#: utils/adt/formatting.c:6113 +#: utils/adt/formatting.c:6139 #, c-format msgid "invalid Roman numeral" msgstr "不正なローマ数字" @@ -25953,13 +26032,13 @@ msgstr "配列は有効な int2vector ではありません" msgid "invalid int2vector data" msgstr "不正なint2vectorデータ" -#: utils/adt/int.c:1558 utils/adt/int8.c:1403 utils/adt/numeric.c:1767 utils/adt/timestamp.c:6708 utils/adt/timestamp.c:6794 +#: utils/adt/int.c:1558 utils/adt/int8.c:1403 utils/adt/numeric.c:1773 utils/adt/timestamp.c:6712 utils/adt/timestamp.c:6798 #, c-format msgid "step size cannot equal zero" msgstr "ステップ数をゼロにすることはできません" #: utils/adt/int8.c:448 utils/adt/int8.c:471 utils/adt/int8.c:485 utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 utils/adt/int8.c:1055 -#: utils/adt/int8.c:1069 utils/adt/int8.c:1100 utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4646 utils/adt/rangetypes.c:1599 utils/adt/rangetypes.c:1612 utils/adt/varbit.c:1676 utils/adt/varlena.c:4161 +#: utils/adt/int8.c:1069 utils/adt/int8.c:1100 utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4652 utils/adt/rangetypes.c:1599 utils/adt/rangetypes.c:1612 utils/adt/varbit.c:1676 utils/adt/varlena.c:4199 #, c-format msgid "bigint out of range" msgstr "bigintの範囲外です" @@ -26377,7 +26456,7 @@ msgstr "jsonpathメンバアクセサはオブジェクトに対してのみ適 msgid "jsonpath item method .%s() can only be applied to an array" msgstr "jsonpath 項目メソッド .%s() は配列にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:1165 utils/adt/jsonpath_exec.c:1191 utils/adt/jsonpath_exec.c:1279 utils/adt/jsonpath_exec.c:1304 utils/adt/jsonpath_exec.c:1356 utils/adt/jsonpath_exec.c:1376 utils/adt/jsonpath_exec.c:1438 utils/adt/jsonpath_exec.c:1527 utils/adt/jsonpath_exec.c:1560 utils/adt/jsonpath_exec.c:1584 +#: utils/adt/jsonpath_exec.c:1165 utils/adt/jsonpath_exec.c:1191 utils/adt/jsonpath_exec.c:1279 utils/adt/jsonpath_exec.c:1304 utils/adt/jsonpath_exec.c:1356 utils/adt/jsonpath_exec.c:1376 utils/adt/jsonpath_exec.c:1438 utils/adt/jsonpath_exec.c:1516 utils/adt/jsonpath_exec.c:1548 utils/adt/jsonpath_exec.c:1572 #, c-format msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type %s" msgstr "jsonpath項目メソッド .%2$s() の引数\"%1$s\"が型%3$sに適合しません" @@ -26387,7 +26466,7 @@ msgstr "jsonpath項目メソッド .%2$s() の引数\"%1$s\"が型%3$sに適合 msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" msgstr "NaNとInifinityはjsonpath項目メソッド .%s() では使用できません" -#: utils/adt/jsonpath_exec.c:1209 utils/adt/jsonpath_exec.c:1312 utils/adt/jsonpath_exec.c:1454 utils/adt/jsonpath_exec.c:1592 +#: utils/adt/jsonpath_exec.c:1209 utils/adt/jsonpath_exec.c:1312 utils/adt/jsonpath_exec.c:1454 utils/adt/jsonpath_exec.c:1580 #, c-format msgid "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "jsonpath 項目メソッド .%s() は文字列または数値にのみ適用可能です" @@ -26397,132 +26476,132 @@ msgstr "jsonpath 項目メソッド .%s() は文字列または数値にのみ msgid "jsonpath item method .%s() can only be applied to a boolean, string, or numeric value" msgstr "jsonpath 項目メソッド .%s() は真偽値、文字列または数値にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:1486 +#: utils/adt/jsonpath_exec.c:1482 #, c-format msgid "precision of jsonpath item method .%s() is out of range for type integer" msgstr "JSONパス項目メソッド .%s() の精度がinteger型の範囲外です" -#: utils/adt/jsonpath_exec.c:1500 +#: utils/adt/jsonpath_exec.c:1496 #, c-format msgid "scale of jsonpath item method .%s() is out of range for type integer" msgstr "JSONパス項目メソッド .%s() のスケールがinteger型の範囲外です" -#: utils/adt/jsonpath_exec.c:1647 +#: utils/adt/jsonpath_exec.c:1635 #, c-format msgid "jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value" msgstr "jsonpath 項目メソッド .%s() は真偽値、文字列、数値、または日時値にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:2136 +#: utils/adt/jsonpath_exec.c:2124 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "jsonpath演算子 %s の左辺値が単一の数値ではありません" -#: utils/adt/jsonpath_exec.c:2143 +#: utils/adt/jsonpath_exec.c:2131 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "jsonpath演算子 %s の右辺値が単一の数値ではありません" -#: utils/adt/jsonpath_exec.c:2211 +#: utils/adt/jsonpath_exec.c:2199 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "単項jsonpath演算子 %s のオペランドが数値ではありません" -#: utils/adt/jsonpath_exec.c:2310 +#: utils/adt/jsonpath_exec.c:2298 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "jsonpath 項目メソッド .%s() は数値にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:2356 +#: utils/adt/jsonpath_exec.c:2344 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "jsonpath 項目メソッド .%s() は文字列にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:2449 +#: utils/adt/jsonpath_exec.c:2437 #, c-format msgid "time precision of jsonpath item method .%s() is out of range for type integer" msgstr "JSONパス項目メソッド .%s() の日付時刻精度がinteger型の範囲外です" -#: utils/adt/jsonpath_exec.c:2483 utils/adt/jsonpath_exec.c:2489 utils/adt/jsonpath_exec.c:2516 utils/adt/jsonpath_exec.c:2544 utils/adt/jsonpath_exec.c:2597 utils/adt/jsonpath_exec.c:2648 utils/adt/jsonpath_exec.c:2719 +#: utils/adt/jsonpath_exec.c:2471 utils/adt/jsonpath_exec.c:2477 utils/adt/jsonpath_exec.c:2504 utils/adt/jsonpath_exec.c:2532 utils/adt/jsonpath_exec.c:2585 utils/adt/jsonpath_exec.c:2636 utils/adt/jsonpath_exec.c:2707 #, c-format msgid "%s format is not recognized: \"%s\"" msgstr "%sの書式を認識できません: \"%s\"" -#: utils/adt/jsonpath_exec.c:2485 +#: utils/adt/jsonpath_exec.c:2473 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "datetimeテンプレート引数を使って入力データフォーマットを指定してください。" -#: utils/adt/jsonpath_exec.c:2678 utils/adt/jsonpath_exec.c:2759 +#: utils/adt/jsonpath_exec.c:2666 utils/adt/jsonpath_exec.c:2747 #, c-format msgid "time precision of jsonpath item method .%s() is invalid" msgstr "jsonpath項目メソッド .%s() の日付時刻精度が不正です" -#: utils/adt/jsonpath_exec.c:2839 +#: utils/adt/jsonpath_exec.c:2827 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "jsonpath項目メソッド .%s() はオブジェクトに対してのみ適用可能です" -#: utils/adt/jsonpath_exec.c:3123 +#: utils/adt/jsonpath_exec.c:3111 #, c-format msgid "could not convert value of type %s to jsonpath" msgstr "型%sの値のjsonpathへ変換ができませんでした" -#: utils/adt/jsonpath_exec.c:3157 +#: utils/adt/jsonpath_exec.c:3145 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "jsonpath変数\"%s\"が見つかりませんでした" -#: utils/adt/jsonpath_exec.c:3210 +#: utils/adt/jsonpath_exec.c:3198 #, c-format msgid "\"vars\" argument is not an object" msgstr "引数\"vars\"がオブジェクトではありません" -#: utils/adt/jsonpath_exec.c:3211 +#: utils/adt/jsonpath_exec.c:3199 #, c-format msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." msgstr "Jsonpath パラメータは \"vars\"オブジェクトの key-value ペアの形にエンコードされていなければなりません。" -#: utils/adt/jsonpath_exec.c:3474 +#: utils/adt/jsonpath_exec.c:3462 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "jsonpath配列添え字が単一の数値ではありません" -#: utils/adt/jsonpath_exec.c:3486 +#: utils/adt/jsonpath_exec.c:3474 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "jsonpath配列の添え字が整数の範囲外です" -#: utils/adt/jsonpath_exec.c:3670 +#: utils/adt/jsonpath_exec.c:3658 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "時間帯を使用せずに%sから%sへの値の変換はできません" -#: utils/adt/jsonpath_exec.c:3672 +#: utils/adt/jsonpath_exec.c:3660 #, c-format msgid "Use *_tz() function for time zone support." msgstr "*_tz() 関数を使用することで時間帯がサポートされます。" -#: utils/adt/jsonpath_exec.c:3980 +#: utils/adt/jsonpath_exec.c:3968 #, c-format msgid "JSON path expression for column \"%s\" must return single item when no wrapper is requested" msgstr "ラッパーが要求されていない場合は、列\"%s\"に対するJSONパス式は単一要素を返却する必要があります" -#: utils/adt/jsonpath_exec.c:3982 utils/adt/jsonpath_exec.c:3987 +#: utils/adt/jsonpath_exec.c:3970 utils/adt/jsonpath_exec.c:3975 #, c-format msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." msgstr "SQL/JSON要素列を配列にまとめるにはWITH WRAPPER句を使用してください。" -#: utils/adt/jsonpath_exec.c:3986 +#: utils/adt/jsonpath_exec.c:3974 #, c-format msgid "JSON path expression in JSON_QUERY must return single item when no wrapper is requested" msgstr "ラッパーが要求されていない場合は、JSON_QUERY中のJSONパス式は単一要素を返却する必要があります" -#: utils/adt/jsonpath_exec.c:4044 utils/adt/jsonpath_exec.c:4068 +#: utils/adt/jsonpath_exec.c:4032 utils/adt/jsonpath_exec.c:4056 #, c-format msgid "JSON path expression for column \"%s\" must return single scalar item" msgstr "列\"%s\"に対するJSONパス式は単一のスカラー要素を返却する必要があります" -#: utils/adt/jsonpath_exec.c:4049 utils/adt/jsonpath_exec.c:4073 +#: utils/adt/jsonpath_exec.c:4037 utils/adt/jsonpath_exec.c:4061 #, c-format msgid "JSON path expression in JSON_VALUE must return single scalar item" msgstr "JSON_VALUE中のJSONパス式は単一のスカラー要素を返却する必要があります" @@ -26681,12 +26760,12 @@ msgstr "範囲の開始を予期していました。" msgid "Expected comma or end of multirange." msgstr "カンマまたは複範囲の終了を予期していました。" -#: utils/adt/multirangetypes.c:982 +#: utils/adt/multirangetypes.c:983 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "複範囲型は多次元配列からは生成できません" -#: utils/adt/multirangetypes.c:1008 +#: utils/adt/multirangetypes.c:1009 #, c-format msgid "multirange values cannot contain null members" msgstr "複範囲値はnullの要素を持てません" @@ -26764,7 +26843,7 @@ msgstr "結果が範囲外です" msgid "cannot subtract inet values of different sizes" msgstr "サイズが異なるinet値の引き算はできません" -#: utils/adt/numeric.c:795 utils/adt/numeric.c:3763 utils/adt/numeric.c:7320 utils/adt/numeric.c:7523 utils/adt/numeric.c:7995 utils/adt/numeric.c:10929 utils/adt/numeric.c:11404 utils/adt/numeric.c:11498 utils/adt/numeric.c:11633 +#: utils/adt/numeric.c:795 utils/adt/numeric.c:3769 utils/adt/numeric.c:7326 utils/adt/numeric.c:7529 utils/adt/numeric.c:8001 utils/adt/numeric.c:10935 utils/adt/numeric.c:11410 utils/adt/numeric.c:11504 utils/adt/numeric.c:11639 #, c-format msgid "value overflows numeric format" msgstr "値がnumericの形式でオーバフローします" @@ -26784,107 +26863,107 @@ msgstr "外部\"numeric\"の値の位取りが不正です" msgid "invalid digit in external \"numeric\" value" msgstr "外部\"numeric\"の値の桁が不正です" -#: utils/adt/numeric.c:1338 utils/adt/numeric.c:1352 +#: utils/adt/numeric.c:1335 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "NUMERICの精度%dは1から%dまででなければなりません" -#: utils/adt/numeric.c:1343 +#: utils/adt/numeric.c:1340 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "NUMERICの位取り%dは%dから%dまでの間でなければなりません" -#: utils/adt/numeric.c:1361 +#: utils/adt/numeric.c:1367 #, c-format msgid "invalid NUMERIC type modifier" msgstr "不正なNUMERIC型の修正子" -#: utils/adt/numeric.c:1727 +#: utils/adt/numeric.c:1733 #, c-format msgid "start value cannot be NaN" msgstr "開始値はNaNにはできません" -#: utils/adt/numeric.c:1731 +#: utils/adt/numeric.c:1737 #, c-format msgid "start value cannot be infinity" msgstr "開始値は無限大にはできません" -#: utils/adt/numeric.c:1738 +#: utils/adt/numeric.c:1744 #, c-format msgid "stop value cannot be NaN" msgstr "終了値はNaNにはできません" -#: utils/adt/numeric.c:1742 +#: utils/adt/numeric.c:1748 #, c-format msgid "stop value cannot be infinity" msgstr "終了値は無限大にはできません" -#: utils/adt/numeric.c:1755 +#: utils/adt/numeric.c:1761 #, c-format msgid "step size cannot be NaN" msgstr "加算量はNaNにはできません" -#: utils/adt/numeric.c:1759 +#: utils/adt/numeric.c:1765 #, c-format msgid "step size cannot be infinity" msgstr "加算量は無限大にはできません" -#: utils/adt/numeric.c:3753 +#: utils/adt/numeric.c:3759 #, c-format msgid "factorial of a negative number is undefined" msgstr "負数の階乗は定義されていません" -#: utils/adt/numeric.c:4360 +#: utils/adt/numeric.c:4366 #, c-format msgid "lower bound cannot be NaN" msgstr "下限をNaNにすることはできません" -#: utils/adt/numeric.c:4364 +#: utils/adt/numeric.c:4370 #, c-format msgid "lower bound cannot be infinity" msgstr "下限を無限値にすることはできません" -#: utils/adt/numeric.c:4371 +#: utils/adt/numeric.c:4377 #, c-format msgid "upper bound cannot be NaN" msgstr "上限をNaNにすることはできません" -#: utils/adt/numeric.c:4375 +#: utils/adt/numeric.c:4381 #, c-format msgid "upper bound cannot be infinity" msgstr "上限を無限値にすることはできません" -#: utils/adt/numeric.c:4536 utils/adt/numeric.c:4624 utils/adt/numeric.c:4684 utils/adt/numeric.c:4880 +#: utils/adt/numeric.c:4542 utils/adt/numeric.c:4630 utils/adt/numeric.c:4690 utils/adt/numeric.c:4886 #, c-format msgid "cannot convert NaN to %s" msgstr "NaNを%sには変換できません" -#: utils/adt/numeric.c:4540 utils/adt/numeric.c:4628 utils/adt/numeric.c:4688 utils/adt/numeric.c:4884 +#: utils/adt/numeric.c:4546 utils/adt/numeric.c:4634 utils/adt/numeric.c:4694 utils/adt/numeric.c:4890 #, c-format msgid "cannot convert infinity to %s" msgstr "無限大を%sに変換できません" -#: utils/adt/numeric.c:4893 +#: utils/adt/numeric.c:4899 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsnの範囲外です" -#: utils/adt/numeric.c:8085 utils/adt/numeric.c:8136 +#: utils/adt/numeric.c:8091 utils/adt/numeric.c:8142 #, c-format msgid "numeric field overflow" msgstr "numericフィールドのオーバーフロー" -#: utils/adt/numeric.c:8086 +#: utils/adt/numeric.c:8092 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "精度%d、位取り%dを持つフィールドは、%s%dより小さな絶対値に丸められます。" -#: utils/adt/numeric.c:8137 +#: utils/adt/numeric.c:8143 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "精度%d、位取り%dを持つフィールドは、無限大値を格納できません。" -#: utils/adt/numeric.c:11702 utils/adt/pseudorandomfuncs.c:135 utils/adt/pseudorandomfuncs.c:159 +#: utils/adt/numeric.c:11708 utils/adt/pseudorandomfuncs.c:135 utils/adt/pseudorandomfuncs.c:159 #, c-format msgid "lower bound must be less than or equal to upper bound" msgstr "下限は上限と同じあるいはより小さい必要があります" @@ -26954,32 +27033,32 @@ msgstr "データベース中の照合順序はバージョン%sで作成され msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "この照合順序の影響を受ける全てのオブジェクトを再構築して、ALTER COLLATION %s REFRESH VERSIONを実行するか、正しいバージョンのライブラリを用いてPostgreSQLをビルドしてください。" -#: utils/adt/pg_locale.c:1498 utils/adt/pg_locale.c:1525 utils/adt/pg_locale_builtin.c:188 +#: utils/adt/pg_locale.c:1504 utils/adt/pg_locale.c:1531 utils/adt/pg_locale_builtin.c:188 #, c-format msgid "invalid locale name \"%s\" for builtin provider" msgstr "ロケール名\"%s\"は組み込みプロバイダでは不正です" -#: utils/adt/pg_locale.c:1590 +#: utils/adt/pg_locale.c:1596 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "ロケール名\"%s\"を、言語タグに変換できませんでした: %s" -#: utils/adt/pg_locale.c:1599 utils/adt/pg_locale.c:1674 utils/adt/pg_locale_icu.c:215 +#: utils/adt/pg_locale.c:1605 utils/adt/pg_locale.c:1680 utils/adt/pg_locale_icu.c:215 #, c-format msgid "ICU is not supported in this build" msgstr "このビルドではICUはサポートされていません" -#: utils/adt/pg_locale.c:1632 +#: utils/adt/pg_locale.c:1638 #, c-format msgid "could not get language from ICU locale \"%s\": %s" msgstr "ICUロケール\"%s\"から言語を取得できませんでした: %s" -#: utils/adt/pg_locale.c:1634 utils/adt/pg_locale.c:1664 +#: utils/adt/pg_locale.c:1640 utils/adt/pg_locale.c:1670 #, c-format msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." msgstr "ICUロケールを無効にするには、パラメータ\"%s\"を\"%s\"に設定してください。" -#: utils/adt/pg_locale.c:1662 +#: utils/adt/pg_locale.c:1668 #, c-format msgid "ICU locale \"%s\" has unknown language \"%s\"" msgstr "ICUロケール\"%s\"には未知の言語\"%s\"が含まれています" @@ -26999,32 +27078,32 @@ msgstr "ロケール\"%s\"の照合器をオープンできませんでした: % msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" msgstr "ルール\"%2$s\"を持つロケール\"%1$s\"の照合器をオープンできませんでした: %3$s" -#: utils/adt/pg_locale_icu.c:488 +#: utils/adt/pg_locale_icu.c:490 #, c-format msgid "collation failed: %s" msgstr "照合順序による比較に失敗しました: %s" -#: utils/adt/pg_locale_icu.c:567 utils/adt/pg_locale_icu.c:831 +#: utils/adt/pg_locale_icu.c:563 utils/adt/pg_locale_icu.c:819 #, c-format msgid "sort key generation failed: %s" msgstr "ソートキーの生成に失敗しました: %s" -#: utils/adt/pg_locale_icu.c:641 utils/adt/pg_locale_icu.c:653 utils/adt/pg_locale_icu.c:878 utils/adt/pg_locale_icu.c:899 +#: utils/adt/pg_locale_icu.c:637 utils/adt/pg_locale_icu.c:649 utils/adt/pg_locale_icu.c:873 utils/adt/pg_locale_icu.c:893 #, c-format msgid "%s failed: %s" msgstr "%s が失敗しました: %s" -#: utils/adt/pg_locale_icu.c:682 +#: utils/adt/pg_locale_icu.c:678 #, c-format msgid "case conversion failed: %s" msgstr "文字ケースの変換に失敗しました: %s" -#: utils/adt/pg_locale_icu.c:851 +#: utils/adt/pg_locale_icu.c:842 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "エンコーディング\"%s\"はICUではサポートされていません" -#: utils/adt/pg_locale_icu.c:858 +#: utils/adt/pg_locale_icu.c:849 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "エンコーディング\"%s\"のICU変換器をオープンできませんでした: %s" @@ -27044,32 +27123,32 @@ msgstr "ロケール\"%s\"をロードできませんでした" msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "ロケール\"%s\"に対応する照合順序バージョンを取得できませんでした: エラーコード %lu" -#: utils/adt/pg_locale_libc.c:771 utils/adt/pg_locale_libc.c:784 +#: utils/adt/pg_locale_libc.c:777 utils/adt/pg_locale_libc.c:790 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "文字列をUTF-16に変換できませんでした: エラーコード %lu" -#: utils/adt/pg_locale_libc.c:793 +#: utils/adt/pg_locale_libc.c:799 #, c-format msgid "could not compare Unicode strings: %m" msgstr "Unicode文字列を比較できませんでした: %m" -#: utils/adt/pg_locale_libc.c:825 +#: utils/adt/pg_locale_libc.c:831 #, c-format msgid "could not create locale \"%s\": %m" msgstr "ロケール\"%s\"を作成できませんでした: %m" -#: utils/adt/pg_locale_libc.c:828 +#: utils/adt/pg_locale_libc.c:834 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "オペレーティングシステムはロケール名\"%s\"のロケールデータを見つけられませんでした。" -#: utils/adt/pg_locale_libc.c:1000 +#: utils/adt/pg_locale_libc.c:1006 #, c-format msgid "invalid multibyte character for locale" msgstr "ロケールに対する不正なマルチバイト文字" -#: utils/adt/pg_locale_libc.c:1001 +#: utils/adt/pg_locale_libc.c:1007 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "おそらくサーバーのLC_CTYPEロケールはデータベースの符号化方式と互換性がありません" @@ -27094,17 +27173,17 @@ msgstr "関数はサーバーがバイナリアップグレードモードであ msgid "invalid command name: \"%s\"" msgstr "不正なコマンド名: \"%s\"" -#: utils/adt/pgstatfuncs.c:1909 +#: utils/adt/pgstatfuncs.c:1921 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "認識できないリセットターゲット: \"%s\"" -#: utils/adt/pgstatfuncs.c:1910 +#: utils/adt/pgstatfuncs.c:1922 #, c-format msgid "Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", or \"wal\"." msgstr "対象は\"archiver\"、\"bgwriter\"、\"checkpointer\"、\"io\"、\"recovery_prefetch\"、\"slru\"または\"wal\"でなければなりません。" -#: utils/adt/pgstatfuncs.c:2027 +#: utils/adt/pgstatfuncs.c:2039 #, c-format msgid "invalid subscription OID %u" msgstr "不正なサブスクリプションOID %u" @@ -27189,7 +27268,7 @@ msgstr "カンマが多すぎます" msgid "Junk after right parenthesis or bracket." msgstr "右括弧または右角括弧の後にごみがあります" -#: utils/adt/regexp.c:304 utils/adt/regexp.c:2068 utils/adt/varlena.c:4493 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:2068 utils/adt/varlena.c:4531 #, c-format msgid "regular expression failed: %s" msgstr "正規表現が失敗しました: %s" @@ -27250,7 +27329,7 @@ msgstr "引数が多すぎます" msgid "Provide two argument types for operator." msgstr "演算子では2つの引数型を指定してください" -#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 utils/adt/regproc.c:1815 utils/adt/varlena.c:3499 utils/adt/varlena.c:3504 +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 utils/adt/regproc.c:1815 utils/adt/varlena.c:3537 utils/adt/varlena.c:3542 #, c-format msgid "invalid name syntax" msgstr "不正な名前の構文" @@ -27510,8 +27589,8 @@ msgstr "タイムスタンプは NaN にはできません" msgid "timestamp out of range: \"%g\"" msgstr "timestampが範囲外です: \"%g\"" -#: utils/adt/timestamp.c:948 utils/adt/timestamp.c:1507 utils/adt/timestamp.c:1517 utils/adt/timestamp.c:1578 utils/adt/timestamp.c:2866 utils/adt/timestamp.c:2875 utils/adt/timestamp.c:2890 utils/adt/timestamp.c:2964 utils/adt/timestamp.c:2981 utils/adt/timestamp.c:3038 utils/adt/timestamp.c:3081 utils/adt/timestamp.c:3459 utils/adt/timestamp.c:3517 utils/adt/timestamp.c:3540 utils/adt/timestamp.c:3549 utils/adt/timestamp.c:3573 utils/adt/timestamp.c:3596 -#: utils/adt/timestamp.c:3605 utils/adt/timestamp.c:3740 utils/adt/timestamp.c:3841 utils/adt/timestamp.c:4248 utils/adt/timestamp.c:4285 utils/adt/timestamp.c:4333 utils/adt/timestamp.c:4342 utils/adt/timestamp.c:4434 utils/adt/timestamp.c:4481 utils/adt/timestamp.c:4490 utils/adt/timestamp.c:4586 utils/adt/timestamp.c:4639 utils/adt/timestamp.c:4649 utils/adt/timestamp.c:4874 utils/adt/timestamp.c:4884 utils/adt/timestamp.c:5239 +#: utils/adt/timestamp.c:948 utils/adt/timestamp.c:1507 utils/adt/timestamp.c:1517 utils/adt/timestamp.c:1578 utils/adt/timestamp.c:2870 utils/adt/timestamp.c:2879 utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2968 utils/adt/timestamp.c:2985 utils/adt/timestamp.c:3042 utils/adt/timestamp.c:3085 utils/adt/timestamp.c:3463 utils/adt/timestamp.c:3521 utils/adt/timestamp.c:3544 utils/adt/timestamp.c:3553 utils/adt/timestamp.c:3577 utils/adt/timestamp.c:3600 +#: utils/adt/timestamp.c:3609 utils/adt/timestamp.c:3744 utils/adt/timestamp.c:3845 utils/adt/timestamp.c:4252 utils/adt/timestamp.c:4289 utils/adt/timestamp.c:4337 utils/adt/timestamp.c:4346 utils/adt/timestamp.c:4438 utils/adt/timestamp.c:4485 utils/adt/timestamp.c:4494 utils/adt/timestamp.c:4590 utils/adt/timestamp.c:4643 utils/adt/timestamp.c:4653 utils/adt/timestamp.c:4878 utils/adt/timestamp.c:4888 utils/adt/timestamp.c:5243 #, c-format msgid "interval out of range" msgstr "intervalが範囲外です" @@ -27536,32 +27615,32 @@ msgstr "INTERVAL(%d)の精度を許容最大値%dまで減らしました" msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d)の精度は%dから%dまででなければなりません" -#: utils/adt/timestamp.c:4623 utils/adt/timestamp.c:4858 +#: utils/adt/timestamp.c:4627 utils/adt/timestamp.c:4862 #, c-format msgid "origin out of range" msgstr "基点が範囲外です" -#: utils/adt/timestamp.c:4628 utils/adt/timestamp.c:4863 +#: utils/adt/timestamp.c:4632 utils/adt/timestamp.c:4867 #, c-format msgid "timestamps cannot be binned into infinite intervals" msgstr "タイムスタンプは無限のintervalにビニングすることはできません" -#: utils/adt/timestamp.c:4633 utils/adt/timestamp.c:4868 +#: utils/adt/timestamp.c:4637 utils/adt/timestamp.c:4872 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "タイムスタンプ型は月や年を含む間隔にビニングすることはできません" -#: utils/adt/timestamp.c:4644 utils/adt/timestamp.c:4879 +#: utils/adt/timestamp.c:4648 utils/adt/timestamp.c:4883 #, c-format msgid "stride must be greater than zero" msgstr "増分は0より大きくなければなりません" -#: utils/adt/timestamp.c:5181 utils/adt/timestamp.c:5233 +#: utils/adt/timestamp.c:5185 utils/adt/timestamp.c:5237 #, c-format msgid "Months usually have fractional weeks." msgstr "月は通常週の端数を含んでいます。" -#: utils/adt/timestamp.c:6713 utils/adt/timestamp.c:6799 +#: utils/adt/timestamp.c:6717 utils/adt/timestamp.c:6803 #, c-format msgid "step size cannot be infinite" msgstr "加算量は無限にはできません" @@ -27666,62 +27745,67 @@ msgstr "単語が長すぎます(%ldバイト、最大は%ldバイト)" msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "tsベクターのための文字列が長すぎます(%ldバイト、最大は%ldバイト)" -#: utils/adt/tsvector_op.c:771 +#: utils/adt/tsvector_op.c:238 +#, c-format +msgid "unrecognized weight: \"%c\"" +msgstr "識別不能な重み付け: \"%c\"" + +#: utils/adt/tsvector_op.c:242 +#, c-format +msgid "unrecognized weight: \"\\%03o\"" +msgstr "識別不能な重み付け: \"\\%03o\"" + +#: utils/adt/tsvector_op.c:766 #, c-format msgid "lexeme array may not contain nulls" msgstr "語彙素配列にはnullを含めてはいけません" -#: utils/adt/tsvector_op.c:776 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain empty strings" msgstr "語彙素配列には空文字列を含めてはいけません" -#: utils/adt/tsvector_op.c:845 +#: utils/adt/tsvector_op.c:840 #, c-format msgid "weight array may not contain nulls" msgstr "重み付け配列にはnullを含めてはいけません" -#: utils/adt/tsvector_op.c:869 -#, c-format -msgid "unrecognized weight: \"%c\"" -msgstr "識別不能な重み付け: \"%c\"" - -#: utils/adt/tsvector_op.c:2599 +#: utils/adt/tsvector_op.c:2572 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_statは1つのtsvector列のみを返さなければなりません" -#: utils/adt/tsvector_op.c:2792 +#: utils/adt/tsvector_op.c:2765 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector列\"%s\"は存在しません" -#: utils/adt/tsvector_op.c:2799 +#: utils/adt/tsvector_op.c:2772 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "値\"%s\"は型tsvectorではありません" -#: utils/adt/tsvector_op.c:2811 +#: utils/adt/tsvector_op.c:2784 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "設定列\"%s\"は存在しません" -#: utils/adt/tsvector_op.c:2817 +#: utils/adt/tsvector_op.c:2790 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "%s列はregconfig型ではありません" -#: utils/adt/tsvector_op.c:2824 +#: utils/adt/tsvector_op.c:2797 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "設定列\"%s\"をNULLにすることはできません" -#: utils/adt/tsvector_op.c:2837 +#: utils/adt/tsvector_op.c:2810 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "テキスト検索設定名称\"%s\"はスキーマ修飾しなければなりません" -#: utils/adt/tsvector_op.c:2862 +#: utils/adt/tsvector_op.c:2835 #, c-format msgid "column \"%s\" is not of a character type" msgstr "列\"%s\"は文字型ではありません" @@ -27786,7 +27870,7 @@ msgstr "ビット列の外部値の不正な長さ" msgid "bit string too long for type bit varying(%d)" msgstr "ビット列は型bit varying(%d)には長すぎます" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:922 utils/adt/varlena.c:986 utils/adt/varlena.c:1144 utils/adt/varlena.c:3120 utils/adt/varlena.c:3198 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:923 utils/adt/varlena.c:987 utils/adt/varlena.c:1182 utils/adt/varlena.c:3158 utils/adt/varlena.c:3236 #, c-format msgid "negative substring length not allowed" msgstr "負の長さのsubstringは許可されません" @@ -27811,7 +27895,7 @@ msgstr "サイズが異なるビット列のXORはできません" msgid "bit index %d out of valid range (0..%d)" msgstr "ビットのインデックス%dが有効範囲0..%dの間にありません" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3402 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3440 #, c-format msgid "new bit must be 0 or 1" msgstr "新しいビットは0か1でなければなりません" @@ -27826,92 +27910,92 @@ msgstr "値は型character(%d)としては長すぎます" msgid "value too long for type character varying(%d)" msgstr "値は型character varying(%d)としては長すぎます" -#: utils/adt/varchar.c:737 utils/adt/varlena.c:1609 +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1647 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "文字列比較で使用する照合順序を特定できませんでした" -#: utils/adt/varlena.c:1882 +#: utils/adt/varlena.c:1920 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "非決定的照合順序は部分文字列探索ではサポートされません" -#: utils/adt/varlena.c:3286 utils/adt/varlena.c:3353 +#: utils/adt/varlena.c:3324 utils/adt/varlena.c:3391 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "インデックス%dは有効範囲0..%dの間にありません" -#: utils/adt/varlena.c:3317 utils/adt/varlena.c:3389 +#: utils/adt/varlena.c:3355 utils/adt/varlena.c:3427 #, c-format msgid "index % out of valid range, 0..%" msgstr "インデックス%は有効範囲0..%の間にありません" -#: utils/adt/varlena.c:4605 +#: utils/adt/varlena.c:4643 #, c-format msgid "field position must not be zero" msgstr "フィールド位置には0は指定できません" -#: utils/adt/varlena.c:5853 +#: utils/adt/varlena.c:5891 #, c-format msgid "unterminated format() type specifier" msgstr "終端されていないformat()型指定子" -#: utils/adt/varlena.c:5854 utils/adt/varlena.c:5988 utils/adt/varlena.c:6109 +#: utils/adt/varlena.c:5892 utils/adt/varlena.c:6026 utils/adt/varlena.c:6147 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "一つの\"%%\"には\"%%%%\"を使ってください。" -#: utils/adt/varlena.c:5986 utils/adt/varlena.c:6107 +#: utils/adt/varlena.c:6024 utils/adt/varlena.c:6145 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "認識できない format() の型指定子\"%.*s\"" -#: utils/adt/varlena.c:5999 utils/adt/varlena.c:6056 +#: utils/adt/varlena.c:6037 utils/adt/varlena.c:6094 #, c-format msgid "too few arguments for format()" msgstr "format()の引数が少なすぎます" -#: utils/adt/varlena.c:6152 utils/adt/varlena.c:6334 +#: utils/adt/varlena.c:6190 utils/adt/varlena.c:6372 #, c-format msgid "number is out of range" msgstr "数値が範囲外です" -#: utils/adt/varlena.c:6215 utils/adt/varlena.c:6243 +#: utils/adt/varlena.c:6253 utils/adt/varlena.c:6281 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "書式は引数0を指定していますが、引数が1から始まっています" -#: utils/adt/varlena.c:6236 +#: utils/adt/varlena.c:6274 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "width引数の位置は\"$\"で終わらなければなりません" -#: utils/adt/varlena.c:6281 +#: utils/adt/varlena.c:6319 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "NULLはSQL識別子として書式付けできません" -#: utils/adt/varlena.c:6489 +#: utils/adt/varlena.c:6527 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Unicode正規化はサーバーエンコーディングがUTF-8の場合にのみ実行されます" -#: utils/adt/varlena.c:6502 +#: utils/adt/varlena.c:6540 #, c-format msgid "invalid normalization form: %s" msgstr "不正な正規化形式: %s" -#: utils/adt/varlena.c:6547 +#: utils/adt/varlena.c:6585 #, c-format msgid "Unicode categorization can only be performed if server encoding is UTF8" msgstr "Unicodeカテゴリー分類はサーバーエンコーディングがUTF-8の場合にのみ実行可能です" -#: utils/adt/varlena.c:6764 utils/adt/varlena.c:6799 utils/adt/varlena.c:6834 +#: utils/adt/varlena.c:6802 utils/adt/varlena.c:6837 utils/adt/varlena.c:6872 #, c-format msgid "invalid Unicode code point: %04X" msgstr "不正なUnicodeコードポイント: %04X" -#: utils/adt/varlena.c:6864 +#: utils/adt/varlena.c:6902 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Unicodeエスケープは \\XXXX、\\+XXXXXX、\\uXXXX または \\UXXXXXXXX でなければなりません。" @@ -28050,47 +28134,47 @@ msgstr "不正な無効な問い合わせ" msgid "portal \"%s\" does not return tuples" msgstr "ポータル\"%s\"はタプルを返却しません" -#: utils/adt/xml.c:4363 +#: utils/adt/xml.c:4365 #, c-format msgid "invalid array for XML namespace mapping" msgstr "XML名前空間マッピングに対する不正な配列" -#: utils/adt/xml.c:4364 +#: utils/adt/xml.c:4366 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "この配列は第2軸の長さが2である2次元配列でなければなりません。" -#: utils/adt/xml.c:4388 +#: utils/adt/xml.c:4390 #, c-format msgid "empty XPath expression" msgstr "空のXPath式" -#: utils/adt/xml.c:4440 +#: utils/adt/xml.c:4442 #, c-format msgid "neither namespace name nor URI may be null" msgstr "名前空間名もURIもnullにはできません" -#: utils/adt/xml.c:4447 +#: utils/adt/xml.c:4449 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "\"%s\"という名前のXML名前空間およびURI\"%s\"を登録できませんでした" -#: utils/adt/xml.c:4796 +#: utils/adt/xml.c:4798 #, c-format msgid "DEFAULT namespace is not supported" msgstr "デフォルト名前空間は実装されていません" -#: utils/adt/xml.c:4825 +#: utils/adt/xml.c:4827 #, c-format msgid "row path filter must not be empty string" msgstr "行パスフィルタは空文字列であってはなりません" -#: utils/adt/xml.c:4859 +#: utils/adt/xml.c:4861 #, c-format msgid "column path filter must not be empty string" msgstr "列パスフィルタ空文字列であってはなりません" -#: utils/adt/xml.c:5006 +#: utils/adt/xml.c:5008 #, c-format msgid "more than one value returned by column XPath expression" msgstr "列XPath式が2つ以上の値を返却しました" @@ -28100,22 +28184,22 @@ msgstr "列XPath式が2つ以上の値を返却しました" msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "多相関数\"%s\"の実際の引数の型を特定できませんでした" -#: utils/cache/lsyscache.c:1109 +#: utils/cache/lsyscache.c:1208 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "型%sから型%sへのキャストは存在しません" -#: utils/cache/lsyscache.c:3027 utils/cache/lsyscache.c:3060 utils/cache/lsyscache.c:3093 utils/cache/lsyscache.c:3126 +#: utils/cache/lsyscache.c:3140 utils/cache/lsyscache.c:3173 utils/cache/lsyscache.c:3206 utils/cache/lsyscache.c:3239 #, c-format msgid "type %s is only a shell" msgstr "型%sは単なるシェルです" -#: utils/cache/lsyscache.c:3032 +#: utils/cache/lsyscache.c:3145 #, c-format msgid "no input function available for type %s" msgstr "型%sの利用可能な入力関数がありません" -#: utils/cache/lsyscache.c:3065 +#: utils/cache/lsyscache.c:3178 #, c-format msgid "no output function available for type %s" msgstr "型%sの利用可能な出力関数がありません" @@ -28165,7 +28249,7 @@ msgstr "リレーションマッピングファイル\"%s\"に不正なデータ msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "リレーションマッピングファイル\"%s\"の中に不正なチェックサムがあります" -#: utils/cache/typcache.c:1901 utils/fmgr/funcapi.c:574 +#: utils/cache/typcache.c:1894 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "レコード型は登録されていません" @@ -28880,17 +28964,17 @@ msgstr "符号化方式\"%s\"に対する不正なバイト値: 0x%02x" msgid "invalid Unicode code point" msgstr "不正なUnicodeコードポイント" -#: utils/mb/mbutils.c:1325 +#: utils/mb/mbutils.c:1327 #, c-format msgid "bind_textdomain_codeset failed" msgstr "bind_textdomain_codesetが失敗しました" -#: utils/mb/mbutils.c:1849 +#: utils/mb/mbutils.c:1851 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "符号化方式\"%s\"に対する不正なバイト列です: %s" -#: utils/mb/mbutils.c:1896 +#: utils/mb/mbutils.c:1898 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "符号化方式\"%2$s\"においてバイト列%1$sである文字は符号化方式\"%3$s\"で等価な文字を持ちません" @@ -31452,22 +31536,22 @@ msgstr "問い合わせはテーブル\"%s\"に対する行レベルセキュリ msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "テーブルの所有者に対するポリシを無効にするには、ALTER TABLE NO FORCE ROW LEVEL SECURITY を使ってください。" -#: utils/misc/stack_depth.c:101 +#: utils/misc/stack_depth.c:102 #, c-format msgid "stack depth limit exceeded" msgstr "スタック長制限を越えました" -#: utils/misc/stack_depth.c:102 +#: utils/misc/stack_depth.c:103 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "プラットフォームのスタック長制限が適切であることを確認した後に、設定パラメータ\"max_stack_depth\" (現在 %dkB)を増やしてください。" -#: utils/misc/stack_depth.c:149 +#: utils/misc/stack_depth.c:165 #, c-format msgid "\"max_stack_depth\" must not exceed %zdkB." msgstr "\"max_stack_depth\"は%zdkBを越えてはなりません。" -#: utils/misc/stack_depth.c:151 +#: utils/misc/stack_depth.c:167 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "プラットフォームのスタック長制限を\"ulimit -s\"または同等の機能を使用して増加してください" @@ -31552,16 +31636,26 @@ msgstr "メモリコンテキスト\"%s\"の作成時に失敗しました" msgid "could not attach to dynamic shared area" msgstr "動的共有エリアをアタッチできませんでした" -#: utils/mmgr/mcxt.c:1163 +#: utils/mmgr/mcxt.c:1166 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "メモリコンテクスト\"%2$s\"でサイズ%1$zuの要求が失敗しました。" -#: utils/mmgr/mcxt.c:1319 +#: utils/mmgr/mcxt.c:1322 #, c-format msgid "logging memory contexts of PID %d" msgstr "PID %dのメモリコンテクストを記録します" +#: utils/mmgr/mcxt.c:1691 +#, c-format +msgid "invalid memory allocation request size %zu + %zu" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です" + +#: utils/mmgr/mcxt.c:1710 +#, c-format +msgid "invalid memory allocation request size %zu * %zu" +msgstr "メモリ割り当て要求サイズ %zu * %zu が不正です" + #: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" @@ -31632,7 +31726,7 @@ msgstr "キー%sは重複しています。" msgid "Duplicate keys exist." msgstr "重複したキーが存在します。" -#: utils/sort/tuplestore.c:552 utils/sort/tuplestore.c:562 utils/sort/tuplestore.c:921 utils/sort/tuplestore.c:1025 utils/sort/tuplestore.c:1089 utils/sort/tuplestore.c:1106 utils/sort/tuplestore.c:1308 utils/sort/tuplestore.c:1373 utils/sort/tuplestore.c:1382 +#: utils/sort/tuplestore.c:552 utils/sort/tuplestore.c:562 utils/sort/tuplestore.c:921 utils/sort/tuplestore.c:1025 utils/sort/tuplestore.c:1089 utils/sort/tuplestore.c:1106 utils/sort/tuplestore.c:1320 utils/sort/tuplestore.c:1385 utils/sort/tuplestore.c:1394 #, c-format msgid "could not seek in tuplestore temporary file" msgstr "タプルストア一時ファイルのシークに失敗しました" @@ -31717,6 +31811,9 @@ msgstr "異なるデータベースからのスナップショットを読み込 #~ msgid "Replication slot \"%s\" does not exist." #~ msgstr "レプリケーションスロット\"%s\"は存在しません。" +#~ msgid "aborting startup due to startup process failure" +#~ msgstr "起動プロセスの失敗のため起動を中断しています" + #~ msgid "attribute \"%s\" is not a range type" #~ msgstr "属性 \"%s\" は範囲型ではありません" @@ -31726,6 +31823,9 @@ msgstr "異なるデータベースからのスナップショットを読み込 #~ msgid "cannot specify both attname and attnum" #~ msgstr "attname と attnum の両方を指定することはできません" +#~ msgid "cannot synchronize replication slots when standby promotion is ongoing" +#~ msgstr "スタンバイの昇格処理中はリプリケーションスロットの同期はできません" + #~ msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON LARGE OBJECTS" #~ msgstr "GRANT/REVOKE ON LARGE OBJECTS を使っている時には IN SCHEMA 句は指定できません" @@ -31741,6 +31841,9 @@ msgstr "異なるデータベースからのスナップショットを読み込 #~ msgid "requested DSM segment \"%s\" failed initialization" #~ msgstr "要求されたDSMセグメント\"%s\"の初期化に失敗しました" +#~ msgid "requested shared memory size overflows size_t" +#~ msgstr "要求された共有メモリのサイズはsize_tを超えています" + #~ msgid "unrecognized ANALYZE option \"%s\"" #~ msgstr "ANALYZEオプション\"%s\"が認識できません" diff --git a/src/backend/po/ru.po b/src/backend/po/ru.po index 85393f15e74..6aea137a861 100644 --- a/src/backend/po/ru.po +++ b/src/backend/po/ru.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: postgres (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-21 05:19+0200\n" -"PO-Revision-Date: 2026-02-21 05:29+0200\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-06 07:17+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -96,15 +96,15 @@ msgstr "не удалось открыть файл \"%s\" для чтения: #: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1353 access/transam/xlog.c:3478 -#: access/transam/xlog.c:4369 access/transam/xlogrecovery.c:1257 -#: access/transam/xlogrecovery.c:1355 access/transam/xlogrecovery.c:1392 -#: access/transam/xlogrecovery.c:1459 backup/basebackup.c:2128 +#: access/transam/twophase.c:1354 access/transam/xlog.c:3478 +#: access/transam/xlog.c:4369 access/transam/xlogrecovery.c:1266 +#: access/transam/xlogrecovery.c:1364 access/transam/xlogrecovery.c:1401 +#: access/transam/xlogrecovery.c:1468 backup/basebackup.c:2126 #: backup/walsummary.c:283 commands/extension.c:3970 libpq/hba.c:769 #: replication/logical/origin.c:768 replication/logical/origin.c:804 -#: replication/logical/reorderbuffer.c:5366 -#: replication/logical/snapbuild.c:1951 replication/slot.c:2546 -#: replication/slot.c:2587 replication/walsender.c:643 +#: replication/logical/reorderbuffer.c:5390 +#: replication/logical/snapbuild.c:1951 replication/slot.c:2548 +#: replication/slot.c:2589 replication/walsender.c:643 #: storage/file/buffile.c:470 storage/file/copydir.c:201 #: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format @@ -114,8 +114,8 @@ msgstr "не удалось прочитать файл \"%s\": %m" #: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 #: access/transam/xlog.c:3483 access/transam/xlog.c:4374 #: replication/logical/origin.c:773 replication/logical/origin.c:812 -#: replication/logical/snapbuild.c:1956 replication/slot.c:2550 -#: replication/slot.c:2591 replication/walsender.c:648 +#: replication/logical/snapbuild.c:1956 replication/slot.c:2552 +#: replication/slot.c:2593 replication/walsender.c:648 #: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" @@ -125,16 +125,16 @@ msgstr "не удалось прочитать файл \"%s\" (прочитан #: ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 #: access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:512 access/transam/twophase.c:1365 -#: access/transam/twophase.c:1783 access/transam/xlog.c:3324 +#: access/transam/timeline.c:512 access/transam/twophase.c:1366 +#: access/transam/twophase.c:1784 access/transam/xlog.c:3324 #: access/transam/xlog.c:3518 access/transam/xlog.c:3523 #: access/transam/xlog.c:3659 access/transam/xlog.c:4339 #: access/transam/xlog.c:5311 commands/copyfrom.c:1929 commands/copyto.c:598 #: libpq/be-fsstubs.c:475 libpq/be-fsstubs.c:545 #: replication/logical/origin.c:706 replication/logical/origin.c:845 -#: replication/logical/reorderbuffer.c:5418 +#: replication/logical/reorderbuffer.c:5442 #: replication/logical/snapbuild.c:1696 replication/logical/snapbuild.c:1822 -#: replication/slot.c:2432 replication/slot.c:2598 replication/walsender.c:658 +#: replication/slot.c:2434 replication/slot.c:2600 replication/walsender.c:658 #: storage/file/copydir.c:224 storage/file/copydir.c:229 #: storage/file/copydir.c:284 storage/file/copydir.c:289 storage/file/fd.c:828 #: storage/file/fd.c:3818 storage/file/fd.c:3924 utils/cache/relmapper.c:841 @@ -166,19 +166,19 @@ msgstr "" #: ../common/file_utils.c:428 ../common/file_utils.c:502 #: access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 #: access/transam/timeline.c:251 access/transam/timeline.c:348 -#: access/transam/twophase.c:1309 access/transam/xlog.c:3214 +#: access/transam/twophase.c:1310 access/transam/xlog.c:3214 #: access/transam/xlog.c:3394 access/transam/xlog.c:3433 #: access/transam/xlog.c:3626 access/transam/xlog.c:4359 -#: access/transam/xlogrecovery.c:4307 access/transam/xlogrecovery.c:4408 -#: access/transam/xlogutils.c:825 backup/basebackup.c:549 -#: backup/basebackup.c:1600 backup/walsummary.c:220 libpq/hba.c:626 -#: postmaster/syslogger.c:1512 replication/logical/origin.c:758 -#: replication/logical/reorderbuffer.c:4019 -#: replication/logical/reorderbuffer.c:4573 -#: replication/logical/reorderbuffer.c:5346 +#: access/transam/xlogrecovery.c:4318 access/transam/xlogrecovery.c:4419 +#: access/transam/xlogutils.c:849 backup/basebackup.c:549 +#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:626 +#: postmaster/syslogger.c:1512 postmaster/walsummarizer.c:1617 +#: replication/logical/origin.c:758 replication/logical/reorderbuffer.c:4043 +#: replication/logical/reorderbuffer.c:4597 +#: replication/logical/reorderbuffer.c:5370 #: replication/logical/snapbuild.c:1651 replication/logical/snapbuild.c:1763 -#: replication/slot.c:2518 replication/walsender.c:616 -#: replication/walsender.c:3094 storage/file/copydir.c:167 +#: replication/slot.c:2520 replication/walsender.c:616 +#: replication/walsender.c:3125 storage/file/copydir.c:167 #: storage/file/copydir.c:255 storage/file/fd.c:803 storage/file/fd.c:3575 #: storage/file/fd.c:3805 storage/file/fd.c:3895 storage/smgr/md.c:686 #: utils/cache/relmapper.c:818 utils/cache/relmapper.c:935 @@ -190,10 +190,10 @@ msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" #: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 -#: access/transam/twophase.c:1756 access/transam/twophase.c:1765 -#: access/transam/xlog.c:9340 access/transam/xlogfuncs.c:699 +#: access/transam/twophase.c:1757 access/transam/twophase.c:1766 +#: access/transam/xlog.c:9342 access/transam/xlogfuncs.c:699 #: backup/basebackup_server.c:173 backup/basebackup_server.c:266 -#: backup/walsummary.c:304 postmaster/postmaster.c:4105 +#: backup/walsummary.c:304 postmaster/postmaster.c:4087 #: postmaster/syslogger.c:1523 postmaster/syslogger.c:1536 #: postmaster/syslogger.c:1549 utils/cache/relmapper.c:947 #, c-format @@ -204,12 +204,12 @@ msgstr "не удалось записать файл \"%s\": %m" #: ../common/file_utils.c:440 ../common/file_utils.c:510 #: access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 #: access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 -#: access/transam/timeline.c:506 access/transam/twophase.c:1777 +#: access/transam/timeline.c:506 access/transam/twophase.c:1778 #: access/transam/xlog.c:3314 access/transam/xlog.c:3512 -#: access/transam/xlog.c:4332 access/transam/xlog.c:8726 -#: access/transam/xlog.c:8770 backup/basebackup_server.c:207 +#: access/transam/xlog.c:4332 access/transam/xlog.c:8728 +#: access/transam/xlog.c:8772 backup/basebackup_server.c:207 #: commands/dbcommands.c:515 replication/logical/snapbuild.c:1689 -#: replication/slot.c:2416 replication/slot.c:2528 storage/file/fd.c:820 +#: replication/slot.c:2418 replication/slot.c:2530 storage/file/fd.c:820 #: storage/file/fd.c:3916 storage/smgr/md.c:1469 storage/smgr/md.c:1529 #: storage/sync/sync.c:446 utils/misc/guc.c:4527 #, c-format @@ -220,22 +220,22 @@ msgstr "не удалось синхронизировать с ФС файл \" #: ../common/cryptohash_openssl.c:356 ../common/exec.c:543 ../common/exec.c:588 #: ../common/exec.c:680 ../common/hmac.c:309 ../common/hmac.c:325 #: ../common/hmac_openssl.c:151 ../common/hmac_openssl.c:339 -#: ../common/jsonapi.c:2410 ../common/md5_common.c:156 +#: ../common/jsonapi.c:2459 ../common/md5_common.c:156 #: ../common/parse_manifest.c:157 ../common/parse_manifest.c:852 -#: ../common/psprintf.c:140 ../common/scram-common.c:268 ../port/path.c:829 -#: ../port/path.c:866 ../port/path.c:883 access/transam/twophase.c:1418 -#: access/transam/xlogrecovery.c:571 lib/dshash.c:253 libpq/auth.c:1353 +#: ../common/psprintf.c:140 ../common/scram-common.c:268 ../port/path.c:846 +#: ../port/path.c:883 ../port/path.c:900 access/transam/twophase.c:1419 +#: access/transam/xlogrecovery.c:580 lib/dshash.c:253 libpq/auth.c:1353 #: libpq/auth.c:1397 libpq/auth.c:1959 libpq/be-secure-gssapi.c:537 #: libpq/be-secure-gssapi.c:717 postmaster/bgworker.c:355 -#: postmaster/bgworker.c:1023 postmaster/postmaster.c:3575 -#: postmaster/walsummarizer.c:938 +#: postmaster/bgworker.c:1023 postmaster/postmaster.c:3557 +#: postmaster/walsummarizer.c:1038 #: replication/libpqwalreceiver/libpqwalreceiver.c:364 #: replication/logical/logical.c:212 replication/walsender.c:825 -#: storage/buffer/localbuf.c:745 storage/file/fd.c:912 storage/file/fd.c:1447 +#: storage/buffer/localbuf.c:753 storage/file/fd.c:912 storage/file/fd.c:1447 #: storage/file/fd.c:1608 storage/file/fd.c:2592 storage/ipc/procarray.c:1465 #: storage/ipc/procarray.c:2217 storage/ipc/procarray.c:2224 #: storage/ipc/procarray.c:2727 storage/ipc/procarray.c:3436 -#: utils/activity/pgstat_shmem.c:535 utils/adt/pg_locale.c:517 +#: utils/activity/pgstat_shmem.c:538 utils/adt/pg_locale.c:517 #: utils/adt/pg_locale.c:591 utils/adt/pg_locale_icu.c:358 #: utils/adt/pg_locale_libc.c:207 utils/adt/pg_locale_libc.c:302 #: utils/adt/pg_locale_libc.c:390 utils/fmgr/dfmgr.c:234 @@ -245,7 +245,7 @@ msgstr "не удалось синхронизировать с ФС файл \" #: utils/misc/guc.c:672 utils/misc/guc.c:1060 utils/misc/guc.c:4505 #: utils/misc/tzparser.c:479 utils/mmgr/aset.c:451 utils/mmgr/bump.c:183 #: utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 utils/mmgr/dsa.c:810 -#: utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1162 utils/mmgr/slab.c:370 +#: utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1165 utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "нехватка памяти" @@ -309,27 +309,37 @@ msgstr "команда \"%s\" не выдала данные" 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:142 ../port/path.c:831 ../port/path.c:868 -#: ../port/path.c:885 utils/misc/ps_status.c:195 utils/misc/ps_status.c:203 +#: ../common/fe_memutils.c:41 ../common/fe_memutils.c:81 +#: ../common/fe_memutils.c:104 ../common/fe_memutils.c:167 +#: ../common/psprintf.c:142 ../port/path.c:848 ../port/path.c:885 +#: ../port/path.c:902 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" -#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 +#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../common/file_utils.c:75 storage/file/fd.c:3581 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" #: ../common/file_utils.c:123 ../common/file_utils.c:588 -#: ../common/file_utils.c:592 access/transam/twophase.c:1321 +#: ../common/file_utils.c:592 access/transam/twophase.c:1322 #: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 #: backup/basebackup.c:357 backup/basebackup.c:555 backup/basebackup.c:626 #: backup/walsummary.c:247 commands/copyfrom.c:1889 commands/copyto.c:979 @@ -350,7 +360,7 @@ msgstr "эта сборка программы не поддерживает м #: ../common/file_utils.c:156 ../common/file_utils.c:304 #: ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 -#: commands/tablespace.c:738 postmaster/postmaster.c:1496 +#: commands/tablespace.c:738 postmaster/postmaster.c:1497 #: storage/file/fd.c:2997 storage/file/reinit.c:126 utils/adt/misc.c:256 #: utils/misc/tzparser.c:340 #, c-format @@ -365,8 +375,8 @@ msgstr "не удалось прочитать каталог \"%s\": %m" #: ../common/file_utils.c:520 access/transam/xlogarchive.c:389 #: postmaster/pgarch.c:836 postmaster/syslogger.c:1560 -#: replication/logical/snapbuild.c:1708 replication/slot.c:1027 -#: replication/slot.c:2299 replication/slot.c:2448 storage/file/fd.c:838 +#: replication/logical/snapbuild.c:1708 replication/slot.c:1029 +#: replication/slot.c:2301 replication/slot.c:2450 storage/file/fd.c:838 #: utils/time/snapmgr.c:1273 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -376,92 +386,92 @@ msgstr "не удалось переименовать файл \"%s\" в \"%s\" msgid "internal error" msgstr "внутренняя ошибка" -#: ../common/jsonapi.c:2435 +#: ../common/jsonapi.c:2484 msgid "Recursive descent parser cannot use incremental lexer." msgstr "" "Инкрементальный лексический анализатор не подходит для нисходящего " "рекурсивного разбора." -#: ../common/jsonapi.c:2437 +#: ../common/jsonapi.c:2486 msgid "Incremental parser requires incremental lexer." msgstr "" "Для инкрементального разбора требуется инкрементальный лексический " "анализатор." -#: ../common/jsonapi.c:2439 +#: ../common/jsonapi.c:2488 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "" "Слишком большая вложенность JSON, максимальная допустимая глубина: 6400." -#: ../common/jsonapi.c:2441 +#: ../common/jsonapi.c:2490 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%.*s\"." -#: ../common/jsonapi.c:2445 +#: ../common/jsonapi.c:2494 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../common/jsonapi.c:2449 +#: ../common/jsonapi.c:2498 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%.*s\"." -#: ../common/jsonapi.c:2452 +#: ../common/jsonapi.c:2501 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2455 +#: ../common/jsonapi.c:2504 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2458 +#: ../common/jsonapi.c:2507 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "Ожидалось \":\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2461 +#: ../common/jsonapi.c:2510 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2464 +#: ../common/jsonapi.c:2513 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../common/jsonapi.c:2466 +#: ../common/jsonapi.c:2515 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2469 +#: ../common/jsonapi.c:2518 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2472 +#: ../common/jsonapi.c:2521 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Ожидалась строка, но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2475 +#: ../common/jsonapi.c:2524 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Ошибочный элемент \"%.*s\"." -#: ../common/jsonapi.c:2481 jsonpath_scan.l:585 +#: ../common/jsonapi.c:2530 jsonpath_scan.l:585 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../common/jsonapi.c:2483 +#: ../common/jsonapi.c:2532 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../common/jsonapi.c:2486 +#: ../common/jsonapi.c:2535 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -469,25 +479,25 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../common/jsonapi.c:2495 +#: ../common/jsonapi.c:2544 #, c-format msgid "" "Unicode escape value could not be translated to the server's encoding %s." msgstr "Спецкод Unicode нельзя преобразовать в серверную кодировку %s." -#: ../common/jsonapi.c:2502 jsonpath_scan.l:618 +#: ../common/jsonapi.c:2551 jsonpath_scan.l:618 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../common/jsonapi.c:2504 jsonpath_scan.l:629 jsonpath_scan.l:639 +#: ../common/jsonapi.c:2553 jsonpath_scan.l:629 jsonpath_scan.l:639 #: jsonpath_scan.l:691 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее слово суррогата Unicode должно следовать за старшим словом." -#: ../common/jsonapi.c:2526 +#: ../common/jsonapi.c:2575 msgid "out of memory while constructing error description" msgstr "нехватка памяти при составлении описания ошибки" @@ -601,7 +611,7 @@ msgstr "не удалось декодировать имя файла" msgid "file size is not an integer" msgstr "размер файла не является целочисленным" -#: ../common/parse_manifest.c:699 backup/basebackup.c:872 +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "нераспознанный алгоритм расчёта контрольных сумм: \"%s\"" @@ -670,7 +680,7 @@ msgstr "не удалось разобрать манифест копии: %s" #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 -#: tcop/backend_startup.c:769 utils/misc/guc.c:3164 utils/misc/guc.c:3205 +#: tcop/backend_startup.c:788 utils/misc/guc.c:3164 utils/misc/guc.c:3205 #: utils/misc/guc.c:3280 utils/misc/guc.c:4709 utils/misc/guc.c:6940 #: utils/misc/guc.c:6981 #, c-format @@ -734,12 +744,12 @@ msgid "could not get exit code from subprocess: error code %lu" msgstr "не удалось получить код выхода от подпроцесса (код ошибки: %lu)" #: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 -#: access/transam/twophase.c:1716 access/transam/xlogarchive.c:119 +#: access/transam/twophase.c:1717 access/transam/xlogarchive.c:119 #: access/transam/xlogarchive.c:399 backup/walsummary.c:254 -#: postmaster/postmaster.c:1069 postmaster/syslogger.c:1489 -#: replication/logical/origin.c:614 replication/logical/reorderbuffer.c:4841 +#: postmaster/postmaster.c:1070 postmaster/syslogger.c:1489 +#: replication/logical/origin.c:614 replication/logical/reorderbuffer.c:4865 #: replication/logical/snapbuild.c:1589 replication/logical/snapbuild.c:2045 -#: replication/slot.c:2502 storage/file/fd.c:878 storage/file/fd.c:3443 +#: replication/slot.c:2504 storage/file/fd.c:878 storage/file/fd.c:3443 #: storage/file/fd.c:3505 storage/file/reinit.c:261 storage/ipc/dsm.c:343 #: storage/smgr/md.c:401 storage/smgr/md.c:460 storage/sync/sync.c:243 #: utils/time/snapmgr.c:1609 @@ -891,7 +901,7 @@ msgstr "" "Возможно, работе СУБД мешает антивирус, программа резервного копирования или " "что-то подобное." -#: ../port/path.c:853 +#: ../port/path.c:870 #, c-format msgid "could not get current working directory: %m\n" msgstr "не удалось определить текущий рабочий каталог: %m\n" @@ -932,8 +942,8 @@ msgstr "" #: access/transam/xlogfuncs.c:242 access/transam/xlogfuncs.c:281 #: access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:323 #: access/transam/xlogfuncs.c:389 access/transam/xlogfuncs.c:447 -#: statistics/attribute_stats.c:191 statistics/attribute_stats.c:936 -#: statistics/relation_stats.c:97 +#: statistics/attribute_stats.c:191 statistics/attribute_stats.c:962 +#: statistics/relation_stats.c:99 #, c-format msgid "recovery is in progress" msgstr "идёт процесс восстановления" @@ -959,7 +969,7 @@ msgid "could not open parent table of index \"%s\"" msgstr "не удалось открыть родительскую таблицу индекса \"%s\"" #: access/brin/brin.c:1472 access/brin/brin.c:1568 access/gin/ginfast.c:1085 -#: parser/parse_utilcmd.c:2454 +#: parser/parse_utilcmd.c:2458 #, c-format msgid "index \"%s\" is not valid" msgstr "индекс \"%s\" - нерабочий" @@ -1130,7 +1140,7 @@ msgid "index row requires %zu bytes, maximum size is %zu" msgstr "строка индекса требует байт: %zu, при максимуме: %zu" #: access/common/printtup.c:292 commands/explain_dr.c:94 tcop/fastpath.c:106 -#: tcop/fastpath.c:453 tcop/postgres.c:1950 +#: tcop/fastpath.c:453 tcop/postgres.c:1951 #, c-format msgid "unsupported format code: %d" msgstr "неподдерживаемый код формата: %d" @@ -1264,8 +1274,8 @@ msgid "failed to re-find tuple within index \"%s\"" msgstr "не удалось повторно найти кортеж в индексе \"%s\"" #: access/gin/gininsert.c:1310 access/gin/ginutil.c:152 -#: executor/execExpr.c:2244 utils/adt/array_userfuncs.c:1963 -#: utils/adt/arrayfuncs.c:4034 utils/adt/arrayfuncs.c:6732 +#: executor/execExpr.c:2244 utils/adt/array_userfuncs.c:1972 +#: utils/adt/arrayfuncs.c:4034 utils/adt/arrayfuncs.c:6739 #: utils/adt/rowtypes.c:974 utils/sort/tuplesortvariants.c:646 #, c-format msgid "could not identify a comparison function for type %s" @@ -1387,13 +1397,13 @@ msgstr "" "не удалось определить, какое правило сортировки использовать для хеширования " "строк" -#: access/hash/hashfunc.c:281 access/hash/hashfunc.c:336 catalog/heap.c:688 -#: catalog/heap.c:694 commands/createas.c:203 commands/createas.c:515 -#: commands/indexcmds.c:2090 commands/tablecmds.c:19987 commands/view.c:80 -#: regex/regc_pg_locale.c:242 utils/adt/formatting.c:1655 -#: utils/adt/formatting.c:1719 utils/adt/formatting.c:1783 -#: utils/adt/formatting.c:1847 utils/adt/like.c:163 utils/adt/like.c:194 -#: utils/adt/like_support.c:1020 utils/adt/varchar.c:738 +#: access/hash/hashfunc.c:281 access/hash/hashfunc.c:336 catalog/heap.c:702 +#: catalog/heap.c:708 commands/createas.c:203 commands/createas.c:515 +#: commands/indexcmds.c:2092 commands/tablecmds.c:19998 commands/view.c:80 +#: regex/regc_pg_locale.c:242 utils/adt/formatting.c:1658 +#: utils/adt/formatting.c:1722 utils/adt/formatting.c:1786 +#: utils/adt/formatting.c:1850 utils/adt/like.c:163 utils/adt/like.c:194 +#: utils/adt/like_support.c:1032 utils/adt/varchar.c:738 #: utils/adt/varchar.c:1001 utils/adt/varchar.c:1057 utils/adt/varlena.c:1648 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." @@ -1451,39 +1461,39 @@ msgid "" msgstr "" "в семействе операторов \"%s\" метода доступа %s нет межтипового оператора(ов)" -#: access/heap/heapam.c:2283 +#: access/heap/heapam.c:2310 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "вставлять кортежи в параллельном исполнителе нельзя" -#: access/heap/heapam.c:2806 +#: access/heap/heapam.c:2862 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "удалять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:2853 +#: access/heap/heapam.c:2909 #, c-format msgid "attempted to delete invisible tuple" msgstr "попытка удаления невидимого кортежа" -#: access/heap/heapam.c:3303 access/index/genam.c:829 +#: access/heap/heapam.c:3387 access/index/genam.c:829 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "изменять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:3480 +#: access/heap/heapam.c:3564 #, c-format msgid "attempted to update invisible tuple" msgstr "попытка изменения невидимого кортежа" -#: access/heap/heapam.c:4993 access/heap/heapam.c:5031 -#: access/heap/heapam.c:5298 access/heap/heapam_handler.c:470 +#: access/heap/heapam.c:5196 access/heap/heapam.c:5234 +#: access/heap/heapam.c:5524 access/heap/heapam_handler.c:470 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не удалось получить блокировку строки в таблице \"%s\"" -#: access/heap/heapam.c:6425 commands/trigger.c:3401 -#: executor/nodeModifyTable.c:2568 executor/nodeModifyTable.c:2658 +#: access/heap/heapam.c:6678 commands/trigger.c:3401 +#: executor/nodeModifyTable.c:2587 executor/nodeModifyTable.c:2677 #, c-format msgid "" "tuple to be updated was already modified by an operation triggered by the " @@ -1514,12 +1524,12 @@ msgstr "не удалось записать в файл \"%s\" (записан #: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 #: access/transam/timeline.c:329 access/transam/timeline.c:481 #: access/transam/xlog.c:3239 access/transam/xlog.c:3447 -#: access/transam/xlog.c:4311 access/transam/xlog.c:9329 +#: access/transam/xlog.c:4311 access/transam/xlog.c:9331 #: access/transam/xlogfuncs.c:693 backup/basebackup_server.c:149 #: backup/basebackup_server.c:242 commands/dbcommands.c:495 -#: postmaster/launch_backend.c:354 postmaster/postmaster.c:4092 -#: postmaster/walsummarizer.c:1215 replication/logical/origin.c:626 -#: replication/slot.c:2360 storage/file/copydir.c:173 +#: postmaster/launch_backend.c:354 postmaster/postmaster.c:4074 +#: postmaster/walsummarizer.c:1315 replication/logical/origin.c:626 +#: replication/slot.c:2362 storage/file/copydir.c:173 #: storage/file/copydir.c:261 storage/smgr/md.c:252 utils/time/snapmgr.c:1252 #, c-format msgid "could not create file \"%s\": %m" @@ -1532,12 +1542,12 @@ msgstr "не удалось обрезать файл \"%s\" до нужного #: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:498 -#: access/transam/xlog.c:3300 access/transam/xlog.c:3503 +#: access/transam/xlog.c:3292 access/transam/xlog.c:3503 #: access/transam/xlog.c:4323 commands/dbcommands.c:507 #: postmaster/launch_backend.c:365 postmaster/launch_backend.c:377 #: replication/logical/origin.c:638 replication/logical/origin.c:680 #: replication/logical/origin.c:699 replication/logical/snapbuild.c:1665 -#: replication/slot.c:2396 storage/file/buffile.c:545 +#: replication/slot.c:2398 storage/file/buffile.c:545 #: storage/file/copydir.c:213 utils/init/miscinit.c:1661 #: utils/init/miscinit.c:1672 utils/init/miscinit.c:1680 utils/misc/guc.c:4488 #: utils/misc/guc.c:4519 utils/misc/guc.c:5678 utils/misc/guc.c:5696 @@ -1736,7 +1746,7 @@ msgstr "" msgid "system usage: %s" msgstr "нагрузка системы: %s" -#: access/heap/vacuumlazy.c:1432 +#: access/heap/vacuumlazy.c:1446 #, c-format msgid "" "disabling eager scanning after freezing %u eagerly scanned blocks of " @@ -1745,14 +1755,14 @@ msgstr "" "отключение инициативного сканирования после замораживания %u инициативно " "просканированных блоков отношения \"%s.%s.%s\"" -#: access/heap/vacuumlazy.c:2821 +#: access/heap/vacuumlazy.c:2835 #, c-format msgid "table \"%s\": removed % dead item identifiers in %u pages" msgstr "" "таблица \"%s\": удалено мёртвых идентификаторов элементов: %, на " "страницах: %u" -#: access/heap/vacuumlazy.c:2982 +#: access/heap/vacuumlazy.c:3006 #, c-format msgid "" "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after " @@ -1761,12 +1771,12 @@ msgstr "" "несущественная операция обслуживания таблицы \"%s.%s.%s\" пропускается в " "качестве меры защиты после %d сканирований индекса" -#: access/heap/vacuumlazy.c:2985 +#: access/heap/vacuumlazy.c:3009 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "Значение relfrozenxid или relminmxid таблицы слишком далеко в прошлом." -#: access/heap/vacuumlazy.c:2986 +#: access/heap/vacuumlazy.c:3010 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or " @@ -1779,23 +1789,23 @@ msgstr "" "Также можно рассмотреть другие способы обеспечения производительности " "VACUUM, соответствующей скорости выделения идентификаторов транзакций." -#: access/heap/vacuumlazy.c:3248 +#: access/heap/vacuumlazy.c:3272 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": остановка усечения из-за конфликтующего запроса блокировки" -#: access/heap/vacuumlazy.c:3318 +#: access/heap/vacuumlazy.c:3342 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "таблица \"%s\": усечение (было страниц: %u, стало: %u)" -#: access/heap/vacuumlazy.c:3380 +#: access/heap/vacuumlazy.c:3404 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "" "таблица \"%s\": приостановка усечения из-за конфликтующего запроса блокировки" -#: access/heap/vacuumlazy.c:3499 +#: access/heap/vacuumlazy.c:3523 #, c-format msgid "" "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary " @@ -1804,47 +1814,47 @@ msgstr "" "отключение параллельного режима очистки \"%s\" --- создавать временные " "таблицы в параллельном режиме нельзя" -#: access/heap/vacuumlazy.c:3768 +#: access/heap/vacuumlazy.c:3792 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "при сканировании блока %u (смещение %u) отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3771 +#: access/heap/vacuumlazy.c:3795 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "при сканировании блока %u отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3775 +#: access/heap/vacuumlazy.c:3799 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "при сканировании отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3783 +#: access/heap/vacuumlazy.c:3807 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "при очистке блока %u (смещение %u) отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3786 +#: access/heap/vacuumlazy.c:3810 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "при очистке блока %u отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3790 +#: access/heap/vacuumlazy.c:3814 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "при очистке отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3795 commands/vacuumparallel.c:1126 +#: access/heap/vacuumlazy.c:3819 commands/vacuumparallel.c:1126 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "при очистке индекса \"%s\" отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3800 commands/vacuumparallel.c:1132 +#: access/heap/vacuumlazy.c:3824 commands/vacuumparallel.c:1132 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "при уборке индекса \"%s\" отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3806 +#: access/heap/vacuumlazy.c:3830 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "при усечении отношения \"%s.%s\" до %u блок." @@ -1870,8 +1880,8 @@ msgid "cannot access index \"%s\" while it is being reindexed" msgstr "индекс \"%s\" перестраивается, обращаться к нему нельзя" #: access/index/indexam.c:203 catalog/objectaddress.c:1361 -#: commands/indexcmds.c:3016 commands/tablecmds.c:284 commands/tablecmds.c:308 -#: commands/tablecmds.c:19666 commands/tablecmds.c:21608 +#: commands/indexcmds.c:3018 commands/tablecmds.c:284 commands/tablecmds.c:308 +#: commands/tablecmds.c:19677 commands/tablecmds.c:21619 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" - это не индекс" @@ -1897,7 +1907,7 @@ msgid "This may be because of a non-immutable index expression." msgstr "Возможно, это вызвано переменной природой индексного выражения." #: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 -#: parser/parse_utilcmd.c:2504 +#: parser/parse_utilcmd.c:2508 #, c-format msgid "index \"%s\" is not a btree" msgstr "индекс \"%s\" не является b-деревом" @@ -2005,7 +2015,7 @@ msgid "\"%s\" cannot be empty." msgstr "Значение \"%s\" не может быть пустым." # well-spelled: симв -#: access/table/tableamapi.c:113 access/transam/xlogrecovery.c:4912 +#: access/table/tableamapi.c:113 access/transam/xlogrecovery.c:4923 #, c-format msgid "\"%s\" is too long (maximum %d characters)." msgstr "Длина \"%s\" превышает предел (%d симв.)." @@ -2047,7 +2057,7 @@ msgstr "" msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Убедитесь, что в конфигурации установлен параметр \"%s\"." -#: access/transam/multixact.c:1179 +#: access/transam/multixact.c:1266 #, c-format msgid "" "database is not accepting commands that assign new MultiXactIds to avoid " @@ -2056,20 +2066,18 @@ msgstr "" "база данных не принимает команды, назначающие новые MultiXactId, во " "избежание потери данных из-за зацикливания в базе данных \"%s\"" -#: access/transam/multixact.c:1181 access/transam/multixact.c:1188 -#: access/transam/multixact.c:1212 access/transam/multixact.c:1221 -#: access/transam/varsup.c:158 access/transam/varsup.c:165 +#: access/transam/multixact.c:1268 access/transam/multixact.c:1275 +#: access/transam/multixact.c:1299 access/transam/multixact.c:1308 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" -"You might also need to commit or roll back old prepared transactions, or " -"drop stale replication slots." +"You might also need to commit or roll back old prepared transactions." msgstr "" "Выполните очистку (VACUUM) всей базы данных.\n" -"Возможно, вам также придётся зафиксировать или откатить старые " -"подготовленные транзакции и удалить неиспользуемые слоты репликации." +"Возможно, вам также придётся зафиксировать или откатить старые\n" +"подготовленные транзакции." -#: access/transam/multixact.c:1186 +#: access/transam/multixact.c:1273 #, c-format msgid "" "database is not accepting commands that assign new MultiXactIds to avoid " @@ -2078,7 +2086,7 @@ msgstr "" "база данных не принимает команды, назначающие новые MultiXactId, во " "избежание потери данных из-за зацикливания в базе данных с OID %u" -#: access/transam/multixact.c:1207 access/transam/multixact.c:2552 +#: access/transam/multixact.c:1294 access/transam/multixact.c:2650 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "" @@ -2093,7 +2101,7 @@ msgstr[2] "" "база данных \"%s\" должна быть очищена, прежде чем будут использованы " "оставшиеся MultiXactId (%u)" -#: access/transam/multixact.c:1216 access/transam/multixact.c:2561 +#: access/transam/multixact.c:1303 access/transam/multixact.c:2659 #, c-format msgid "" "database with OID %u must be vacuumed before %u more MultiXactId is used" @@ -2109,12 +2117,12 @@ msgstr[2] "" "база данных с OID %u должна быть очищена, прежде чем будут использованы " "оставшиеся MultiXactId (%u)" -#: access/transam/multixact.c:1280 +#: access/transam/multixact.c:1367 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "слишком много членов мультитранзакции" -#: access/transam/multixact.c:1281 +#: access/transam/multixact.c:1368 #, c-format msgid "" "This command would create a multixact with %u members, but the remaining " @@ -2132,7 +2140,7 @@ msgstr[2] "" "Мультитранзакция, создаваемая этой командой, должна включать членов: %u, но " "оставшегося места хватает только для %u." -#: access/transam/multixact.c:1286 +#: access/transam/multixact.c:1373 #, c-format msgid "" "Execute a database-wide VACUUM in database with OID %u with reduced " @@ -2142,7 +2150,7 @@ msgstr "" "Выполните очистку (VACUUM) всей базы данных с OID %u, уменьшив значения " "\"vacuum_multixact_freeze_min_age\" и \"vacuum_multixact_freeze_table_age\"." -#: access/transam/multixact.c:1317 +#: access/transam/multixact.c:1404 #, c-format msgid "" "database with OID %u must be vacuumed before %d more multixact member is used" @@ -2159,7 +2167,7 @@ msgstr[2] "" "база данных с OID %u должна быть очищена, пока не использованы оставшиеся " "члены мультитранзакций (%d)" -#: access/transam/multixact.c:1322 +#: access/transam/multixact.c:1409 #, c-format msgid "" "Execute a database-wide VACUUM in that database with reduced " @@ -2169,35 +2177,34 @@ msgstr "" "Выполните очистку (VACUUM) всей этой базы данных, уменьшив значения " "\"vacuum_multixact_freeze_min_age\" и \"vacuum_multixact_freeze_table_age\"." -#: access/transam/multixact.c:1461 +#: access/transam/multixact.c:1548 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %u прекратил существование: видимо, произошло зацикливание" -#: access/transam/multixact.c:1467 +#: access/transam/multixact.c:1554 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %u ещё не был создан: видимо, произошло зацикливание" -#: access/transam/multixact.c:1560 +#: access/transam/multixact.c:1647 #, c-format msgid "MultiXact %u has invalid next offset" msgstr "для мультитранзакции %u получено некорректное следующее смещение" -#: access/transam/multixact.c:2557 access/transam/multixact.c:2566 +#: access/transam/multixact.c:2655 access/transam/multixact.c:2664 #, c-format msgid "" "To avoid MultiXactId assignment failures, execute a database-wide VACUUM in " "that database.\n" -"You might also need to commit or roll back old prepared transactions, or " -"drop stale replication slots." +"You might also need to commit or roll back old prepared transactions." msgstr "" "Во избежание сбоев при назначении MultiXactId, выполните очистку (VACUUM) " "всей базы.\n" "Возможно, вам также придётся зафиксировать или откатить старые " -"подготовленные транзакции и удалить неиспользуемые слоты репликации." +"подготовленные транзакции." -#: access/transam/multixact.c:2845 +#: access/transam/multixact.c:2947 #, c-format msgid "" "MultiXact member wraparound protections are disabled because oldest " @@ -2206,12 +2213,12 @@ msgstr "" "Защита от зацикливания членов мультитранзакций отключена, так как старейшая " "отмеченная мультитранзакция %u не найдена на диске" -#: access/transam/multixact.c:2867 +#: access/transam/multixact.c:2969 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "Защита от зацикливания мультитранзакций сейчас включена" -#: access/transam/multixact.c:3258 +#: access/transam/multixact.c:3360 #, c-format msgid "" "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" @@ -2219,7 +2226,7 @@ msgstr "" "старейшая мультитранзакция %u не найдена, новейшая мультитранзакция: %u, " "усечение пропускается" -#: access/transam/multixact.c:3276 +#: access/transam/multixact.c:3378 #, c-format msgid "" "cannot truncate up to MultiXact %u because it does not exist on disk, " @@ -2228,7 +2235,7 @@ msgstr "" "выполнить усечение до мультитранзакции %u нельзя ввиду её отсутствия на " "диске, усечение пропускается" -#: access/transam/multixact.c:3293 +#: access/transam/multixact.c:3395 #, c-format msgid "" "cannot truncate up to MultiXact %u because it has invalid offset, skipping " @@ -2237,7 +2244,7 @@ msgstr "" "выполнить усечение до мультитранзакции %u нельзя из-за некорректного " "смещения, усечение пропускается" -#: access/transam/multixact.c:3628 +#: access/transam/multixact.c:3732 #, c-format msgid "invalid MultiXactId: %u" msgstr "неверный MultiXactId: %u" @@ -2266,12 +2273,12 @@ msgstr "потеряно подключение к параллельному и msgid "parallel worker" msgstr "параллельный исполнитель" -#: access/transam/parallel.c:1355 replication/logical/applyparallelworker.c:897 +#: access/transam/parallel.c:1355 replication/logical/applyparallelworker.c:906 #, c-format msgid "could not map dynamic shared memory segment" msgstr "не удалось отобразить динамический сегмент разделяемой памяти" -#: access/transam/parallel.c:1360 replication/logical/applyparallelworker.c:903 +#: access/transam/parallel.c:1360 replication/logical/applyparallelworker.c:912 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "неверное магическое число в динамическом сегменте разделяемой памяти" @@ -2443,7 +2450,7 @@ msgid "Timeline IDs must be less than child timeline's ID." msgstr "" "Идентификаторы линий времени должны быть меньше идентификатора линии-потомка." -#: access/transam/timeline.c:589 +#: access/transam/timeline.c:589 postmaster/walsummarizer.c:930 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "в истории сервера нет запрошенной линии времени %u" @@ -2468,12 +2475,12 @@ msgstr "Установите ненулевое значение парамет msgid "transaction identifier \"%s\" is already in use" msgstr "идентификатор транзакции \"%s\" уже используется" -#: access/transam/twophase.c:404 access/transam/twophase.c:2530 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "достигнут предел числа подготовленных транзакций" -#: access/transam/twophase.c:405 access/transam/twophase.c:2531 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format msgid "Increase \"max_prepared_transactions\" (currently %d)." msgstr "" @@ -2515,12 +2522,12 @@ msgstr "" msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "подготовленной транзакции с идентификатором \"%s\" нет" -#: access/transam/twophase.c:1174 +#: access/transam/twophase.c:1175 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "превышен предельный размер файла состояния 2PC" -#: access/transam/twophase.c:1329 +#: access/transam/twophase.c:1330 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" @@ -2528,63 +2535,63 @@ msgstr[0] "некорректный размер файла \"%s\": %lld Б" msgstr[1] "некорректный размер файла \"%s\": %lld Б" msgstr[2] "некорректный размер файла \"%s\": %lld Б" -#: access/transam/twophase.c:1338 +#: access/transam/twophase.c:1339 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "некорректное выравнивание смещения CRC для файла \"%s\"" -#: access/transam/twophase.c:1356 +#: access/transam/twophase.c:1357 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %lld)" -#: access/transam/twophase.c:1371 +#: access/transam/twophase.c:1372 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "в файле \"%s\" содержится неверная сигнатура" -#: access/transam/twophase.c:1377 +#: access/transam/twophase.c:1378 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "в файле \"%s\" содержится неверный размер" -#: access/transam/twophase.c:1389 +#: access/transam/twophase.c:1390 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "" "вычисленная контрольная сумма (CRC) не соответствует значению, сохранённому " "в файле \"%s\"" -#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:572 -#: postmaster/walsummarizer.c:939 replication/logical/logical.c:213 +#: access/transam/twophase.c:1420 access/transam/xlogrecovery.c:581 +#: postmaster/walsummarizer.c:1039 replication/logical/logical.c:213 #: replication/walsender.c:826 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Не удалось разместить обработчик журнала транзакций." -#: access/transam/twophase.c:1429 +#: access/transam/twophase.c:1430 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "не удалось прочитать состояние 2PC из WAL в позиции %X/%X: %s" -#: access/transam/twophase.c:1434 +#: access/transam/twophase.c:1435 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "не удалось прочитать состояние 2PC из WAL в позиции %X/%X" -#: access/transam/twophase.c:1442 +#: access/transam/twophase.c:1443 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "" "ожидаемые данные состояния двухфазной фиксации отсутствуют в WAL в позиции " "%X/%X" -#: access/transam/twophase.c:1744 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "пересоздать файл \"%s\" не удалось: %m" -#: access/transam/twophase.c:1871 +#: access/transam/twophase.c:1872 #, c-format msgid "" "%u two-phase state file was written for a long-running prepared transaction" @@ -2597,47 +2604,47 @@ msgstr[1] "" msgstr[2] "" "для длительных подготовленных транзакций записано файлов состояния 2PC: %u" -#: access/transam/twophase.c:2106 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "восстановление подготовленной транзакции %u из разделяемой памяти" -#: access/transam/twophase.c:2199 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "удаление устаревшего файла состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2206 +#: access/transam/twophase.c:2207 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "удаление из памяти устаревшего состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2219 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "удаление файла будущего состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2226 +#: access/transam/twophase.c:2227 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "удаление из памяти будущего состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2251 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "испорчен файл состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2256 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "испорчено состояние 2PC в памяти для транзакции %u" -#: access/transam/twophase.c:2513 +#: access/transam/twophase.c:2514 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "не удалось восстановить файл состояния 2PC для транзакции %u" -#: access/transam/twophase.c:2515 +#: access/transam/twophase.c:2516 #, c-format msgid "" "Two-phase state file has been found in WAL record %X/%X, but this " @@ -2646,7 +2653,7 @@ msgstr "" "Для WAL-записи %X/%X найден файл состояния двухфазной фиксации, но эта " "транзакция уже была восстановлена с диска." -#: access/transam/twophase.c:2523 storage/file/fd.c:514 utils/fmgr/dfmgr.c:214 +#: access/transam/twophase.c:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:214 #, c-format msgid "could not access file \"%s\": %m" msgstr "ошибка при обращении к файлу \"%s\": %m" @@ -2661,6 +2668,17 @@ msgstr "" "транзакций, во избежание потери данных из-за зацикливания в базе данных " "\"%s\"" +#: access/transam/varsup.c:158 access/transam/varsup.c:165 +#, c-format +msgid "" +"Execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or " +"drop stale replication slots." +msgstr "" +"Выполните очистку (VACUUM) всей базы данных.\n" +"Возможно, вам также придётся зафиксировать или откатить старые " +"подготовленные транзакции и удалить неиспользуемые слоты репликации." + #: access/transam/varsup.c:163 #, c-format msgid "" @@ -2851,14 +2869,14 @@ msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." msgstr "" "Размер сегмента WAL должен задаваться степенью 2 в интервале от 1 МБ до 1 ГБ." -#: access/transam/xlog.c:2454 +#: access/transam/xlog.c:2451 #, c-format msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" msgstr "" "не удалось записать в файл журнала \"%s\" (смещение: %u, длина: %zu): %m" -#: access/transam/xlog.c:3740 access/transam/xlogutils.c:820 -#: replication/walsender.c:3088 +#: access/transam/xlog.c:3740 access/transam/xlogutils.c:844 +#: postmaster/walsummarizer.c:1631 replication/walsender.c:3119 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запрошенный сегмент WAL %s уже удалён" @@ -3006,13 +3024,13 @@ msgstr "\"%s\" должно быть как минимум вдвое больш #: access/transam/xlog.c:4725 catalog/namespace.c:4699 #: commands/tablespace.c:1210 commands/user.c:2531 commands/variable.c:72 -#: replication/slot.c:2768 tcop/postgres.c:3626 utils/error/elog.c:2257 +#: replication/slot.c:2770 tcop/postgres.c:3630 utils/error/elog.c:2257 #, c-format msgid "List syntax is invalid." msgstr "Ошибка синтаксиса в списке." #: access/transam/xlog.c:4771 commands/user.c:2547 commands/variable.c:173 -#: tcop/postgres.c:3642 utils/error/elog.c:2283 +#: tcop/postgres.c:3646 utils/error/elog.c:2283 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "нераспознанное ключевое слово: \"%s\"." @@ -3143,25 +3161,25 @@ msgstr "выбранный ID новой линии времени: %u" msgid "archive recovery complete" msgstr "восстановление архива завершено" -#: access/transam/xlog.c:6653 +#: access/transam/xlog.c:6655 #, c-format msgid "shutting down" msgstr "выключение" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6692 +#: access/transam/xlog.c:6694 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "начата точка перезапуска:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6704 +#: access/transam/xlog.c:6706 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "начата контрольная точка:%s%s%s%s%s%s%s%s" # well-spelled: синхр -#: access/transam/xlog.c:6769 +#: access/transam/xlog.c:6771 #, c-format msgid "" "restartpoint complete: wrote %d buffers (%.1f%%), wrote %d SLRU buffers; %d " @@ -3176,7 +3194,7 @@ msgstr "" "%03d сек.; расстояние=%d КБ, ожидалось=%d КБ; lsn=%X/%X, lsn redo=%X/%X" # well-spelled: синхр -#: access/transam/xlog.c:6793 +#: access/transam/xlog.c:6795 #, c-format msgid "" "checkpoint complete: wrote %d buffers (%.1f%%), wrote %d SLRU buffers; %d " @@ -3190,7 +3208,7 @@ msgstr "" "синхронизировано_файлов=%d, самая_долгая_синхр.=%ld.%03d сек., средняя=%ld." "%03d сек.; расстояние=%d КБ, ожидалось=%d КБ; lsn=%X/%X, lsn redo=%X/%X" -#: access/transam/xlog.c:7279 +#: access/transam/xlog.c:7281 #, c-format msgid "" "concurrent write-ahead log activity while database system is shutting down" @@ -3198,64 +3216,64 @@ msgstr "" "во время выключения системы баз данных отмечена активность в журнале " "предзаписи" -#: access/transam/xlog.c:7871 +#: access/transam/xlog.c:7873 #, c-format msgid "recovery restart point at %X/%X" msgstr "точка перезапуска восстановления в позиции %X/%X" -#: access/transam/xlog.c:7873 +#: access/transam/xlog.c:7875 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Последняя завершённая транзакция была выполнена в %s." -#: access/transam/xlog.c:8137 +#: access/transam/xlog.c:8139 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "точка восстановления \"%s\" создана в позиции %X/%X" -#: access/transam/xlog.c:8344 +#: access/transam/xlog.c:8346 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "" "резервное копирование \"на ходу\" было отменено, продолжить восстановление " "нельзя" -#: access/transam/xlog.c:8402 +#: access/transam/xlog.c:8404 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи точки выключения" -#: access/transam/xlog.c:8468 +#: access/transam/xlog.c:8470 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи точки активности" -#: access/transam/xlog.c:8505 +#: access/transam/xlog.c:8507 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи конец-" "восстановления" -#: access/transam/xlog.c:8775 +#: access/transam/xlog.c:8777 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл сквозной записи %s: %m" -#: access/transam/xlog.c:8780 +#: access/transam/xlog.c:8782 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "не удалось синхронизировать с ФС данные (fdatasync) файла \"%s\": %m" -#: access/transam/xlog.c:8857 access/transam/xlog.c:9193 +#: access/transam/xlog.c:8859 access/transam/xlog.c:9195 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "" "Выбранный уровень WAL недостаточен для резервного копирования \"на ходу\"" -#: access/transam/xlog.c:8858 access/transam/xlog.c:9194 +#: access/transam/xlog.c:8860 access/transam/xlog.c:9196 #: access/transam/xlogfuncs.c:249 #, c-format msgid "" @@ -3264,12 +3282,12 @@ msgstr "" "Параметр \"wal_level\" должен иметь значение \"replica\" или \"logical\" при " "запуске сервера." -#: access/transam/xlog.c:8863 +#: access/transam/xlog.c:8865 #, c-format msgid "backup label too long (max %d bytes)" msgstr "длина метки резервной копии превышает предел (%d байт)" -#: access/transam/xlog.c:8984 +#: access/transam/xlog.c:8986 #, c-format msgid "" "WAL generated with \"full_page_writes=off\" was replayed since last " @@ -3278,7 +3296,7 @@ msgstr "" "после последней точки перезапуска был воспроизведён WAL, созданный в режиме " "\"full_page_writes=off\"" -#: access/transam/xlog.c:8986 access/transam/xlog.c:9282 +#: access/transam/xlog.c:8988 access/transam/xlog.c:9284 #, c-format msgid "" "This means that the backup being taken on the standby is corrupt and should " @@ -3290,23 +3308,23 @@ msgstr "" "CHECKPOINT на ведущем сервере, а затем попробуйте резервное копирование \"на " "ходу\" ещё раз." -#: access/transam/xlog.c:9066 backup/basebackup.c:1419 utils/adt/misc.c:354 +#: access/transam/xlog.c:9068 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: access/transam/xlog.c:9073 backup/basebackup.c:1424 utils/adt/misc.c:359 +#: access/transam/xlog.c:9075 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "целевой путь символической ссылки \"%s\" слишком длинный" -#: access/transam/xlog.c:9232 backup/basebackup.c:1283 +#: access/transam/xlog.c:9234 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "" "ведомый сервер был повышен в процессе резервного копирования \"на ходу\"" -#: access/transam/xlog.c:9233 backup/basebackup.c:1284 +#: access/transam/xlog.c:9235 backup/basebackup.c:1282 #, c-format msgid "" "This means that the backup being taken is corrupt and should not be used. " @@ -3315,7 +3333,7 @@ msgstr "" "Это означает, что создаваемая резервная копия испорчена и использовать её не " "следует. Попробуйте резервное копирование \"на ходу\" ещё раз." -#: access/transam/xlog.c:9280 +#: access/transam/xlog.c:9282 #, c-format msgid "" "WAL generated with \"full_page_writes=off\" was replayed during online backup" @@ -3323,13 +3341,13 @@ msgstr "" "в процессе резервного копирования \"на ходу\" был воспроизведён WAL, " "созданный в режиме \"full_page_writes=off\"" -#: access/transam/xlog.c:9396 +#: access/transam/xlog.c:9398 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "" "базовое копирование выполнено, ожидается архивация нужных сегментов WAL" -#: access/transam/xlog.c:9410 +#: access/transam/xlog.c:9412 #, c-format msgid "" "still waiting for all required WAL segments to be archived (%d seconds " @@ -3337,7 +3355,7 @@ msgid "" msgstr "" "продолжается ожидание архивации всех нужных сегментов WAL (прошло %d сек.)" -#: access/transam/xlog.c:9412 +#: access/transam/xlog.c:9414 #, c-format msgid "" "Check that your \"archive_command\" is executing properly. You can safely " @@ -3348,12 +3366,12 @@ msgstr "" "копирования можно отменить безопасно, но резервная копия базы будет " "непригодна без всех сегментов WAL." -#: access/transam/xlog.c:9419 +#: access/transam/xlog.c:9421 #, c-format msgid "all required WAL segments have been archived" msgstr "все нужные сегменты WAL заархивированы" -#: access/transam/xlog.c:9423 +#: access/transam/xlog.c:9425 #, c-format msgid "" "WAL archiving is not enabled; you must ensure that all required WAL segments " @@ -3362,7 +3380,7 @@ msgstr "" "архивация WAL не настроена; вы должны обеспечить копирование всех требуемых " "сегментов WAL другими средствами для получения резервной копии" -#: access/transam/xlog.c:9462 +#: access/transam/xlog.c:9464 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "" @@ -3409,7 +3427,7 @@ msgstr "не удалось создать файл состояния архи msgid "could not write archive status file \"%s\": %m" msgstr "не удалось записать файл состояния архива \"%s\": %m" -#: access/transam/xlogfuncs.c:70 backup/basebackup.c:999 +#: access/transam/xlogfuncs.c:70 backup/basebackup.c:997 #, c-format msgid "a backup is already in progress in this session" msgstr "резервное копирование уже выполняется в этом сеансе" @@ -3621,23 +3639,23 @@ msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте WAL " "%s, LSN %X/%X, смещение %u" -#: access/transam/xlogreader.c:1769 +#: access/transam/xlogreader.c:1771 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: access/transam/xlogreader.c:1793 +#: access/transam/xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: access/transam/xlogreader.c:1800 +#: access/transam/xlogreader.c:1802 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" -#: access/transam/xlogreader.c:1836 +#: access/transam/xlogreader.c:1838 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -3646,21 +3664,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1852 +#: access/transam/xlogreader.c:1854 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина " "%u в позиции %X/%X" -#: access/transam/xlogreader.c:1866 +#: access/transam/xlogreader.c:1868 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/" "%X" -#: access/transam/xlogreader.c:1881 +#: access/transam/xlogreader.c:1883 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -3669,41 +3687,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " "блока равна %u в позиции %X/%X" -#: access/transam/xlogreader.c:1897 +#: access/transam/xlogreader.c:1899 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: access/transam/xlogreader.c:1909 +#: access/transam/xlogreader.c:1911 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1976 +#: access/transam/xlogreader.c:1978 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: access/transam/xlogreader.c:2002 +#: access/transam/xlogreader.c:2004 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: access/transam/xlogreader.c:2086 +#: access/transam/xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: access/transam/xlogreader.c:2093 +#: access/transam/xlogreader.c:2095 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "" "не удалось восстановить образ в позиции %X/%X с неверным состоянием, блок %d" -#: access/transam/xlogreader.c:2120 access/transam/xlogreader.c:2137 +#: access/transam/xlogreader.c:2122 access/transam/xlogreader.c:2139 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -3712,7 +3730,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " "поддерживается этой сборкой, блок %d" -#: access/transam/xlogreader.c:2146 +#: access/transam/xlogreader.c:2148 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -3720,12 +3738,12 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " "блок %d" -#: access/transam/xlogreader.c:2154 +#: access/transam/xlogreader.c:2156 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалось развернуть образ в позиции %X/%X, блок %d" -#: access/transam/xlogrecovery.c:624 +#: access/transam/xlogrecovery.c:633 #, c-format msgid "" "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on " @@ -3734,7 +3752,7 @@ msgstr "" "начинается восстановление копии с LSN redo %X/%X, LSN контрольной точки %X/" "%X, на линии времени %u" -#: access/transam/xlogrecovery.c:656 +#: access/transam/xlogrecovery.c:665 #, c-format msgid "" "could not find redo location %X/%X referenced by checkpoint record at %X/%X" @@ -3742,7 +3760,7 @@ msgstr "" "не удалось найти положение REDO %X/%X, указанное в записи контрольной точки " "в %X/%X" -#: access/transam/xlogrecovery.c:658 access/transam/xlogrecovery.c:669 +#: access/transam/xlogrecovery.c:667 access/transam/xlogrecovery.c:678 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/" @@ -3758,42 +3776,42 @@ msgstr "" "Будьте осторожны: при восстановлении резервной копии удаление \"%s/" "backup_label\" приведёт к повреждению кластера." -#: access/transam/xlogrecovery.c:667 +#: access/transam/xlogrecovery.c:676 #, c-format msgid "could not locate required checkpoint record at %X/%X" msgstr "не удалось найти нужную запись контрольной точки в %X/%X" -#: access/transam/xlogrecovery.c:697 commands/tablespace.c:664 +#: access/transam/xlogrecovery.c:706 commands/tablespace.c:664 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не удалось создать символическую ссылку \"%s\": %m" -#: access/transam/xlogrecovery.c:730 access/transam/xlogrecovery.c:736 +#: access/transam/xlogrecovery.c:739 access/transam/xlogrecovery.c:745 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "файл \"%s\" игнорируется ввиду отсутствия файла \"%s\"" -#: access/transam/xlogrecovery.c:732 +#: access/transam/xlogrecovery.c:741 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Файл \"%s\" был переименован в \"%s\"." -#: access/transam/xlogrecovery.c:738 +#: access/transam/xlogrecovery.c:747 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Не удалось переименовать файл \"%s\" в \"%s\" (%m)." -#: access/transam/xlogrecovery.c:777 +#: access/transam/xlogrecovery.c:786 #, c-format msgid "restarting backup recovery with redo LSN %X/%X" msgstr "перезапуск восстановления копии с LSN redo %X/%X" -#: access/transam/xlogrecovery.c:802 +#: access/transam/xlogrecovery.c:811 #, c-format msgid "could not locate a valid checkpoint record at %X/%X" msgstr "не удалось найти корректную запись контрольной точки в %X/%X" -#: access/transam/xlogrecovery.c:814 +#: access/transam/xlogrecovery.c:823 #, c-format msgid "" "could not find redo location %X/%08X referenced by checkpoint record at %X/" @@ -3802,50 +3820,50 @@ msgstr "" "не удалось найти положение REDO %X/%08X, указанное в записи контрольной " "точки в %X/%08X" -#: access/transam/xlogrecovery.c:823 +#: access/transam/xlogrecovery.c:832 #, c-format msgid "entering standby mode" msgstr "переход в режим резервного сервера" -#: access/transam/xlogrecovery.c:826 +#: access/transam/xlogrecovery.c:835 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "начинается восстановление точки во времени до XID %u" -#: access/transam/xlogrecovery.c:830 +#: access/transam/xlogrecovery.c:839 #, c-format msgid "starting point-in-time recovery to %s" msgstr "начинается восстановление точки во времени до %s" -#: access/transam/xlogrecovery.c:834 +#: access/transam/xlogrecovery.c:843 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "начинается восстановление точки во времени до \"%s\"" -#: access/transam/xlogrecovery.c:838 +#: access/transam/xlogrecovery.c:847 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "" "начинается восстановление точки во времени до позиции в WAL (LSN) \"%X/%X\"" -#: access/transam/xlogrecovery.c:842 +#: access/transam/xlogrecovery.c:851 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "" "начинается восстановление точки во времени до первой точки согласованности" -#: access/transam/xlogrecovery.c:845 +#: access/transam/xlogrecovery.c:854 #, c-format msgid "starting archive recovery" msgstr "начинается восстановление архива" -#: access/transam/xlogrecovery.c:866 +#: access/transam/xlogrecovery.c:875 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "в истории сервера нет ответвления запрошенной линии времени %u" #. translator: %s is a backup_label file or a pg_control file -#: access/transam/xlogrecovery.c:869 +#: access/transam/xlogrecovery.c:878 #, c-format msgid "" "Latest checkpoint in file \"%s\" is at %X/%X on timeline %u, but in the " @@ -3855,7 +3873,7 @@ msgstr "" "Последняя контрольная точка в файле \"%s\": %X/%X на линии времени %u, но в " "истории запрошенной линии времени сервер ответвился с этой линии в %X/%X." -#: access/transam/xlogrecovery.c:884 +#: access/transam/xlogrecovery.c:893 #, c-format msgid "" "requested timeline %u does not contain minimum recovery point %X/%X on " @@ -3864,22 +3882,22 @@ msgstr "" "запрошенная линия времени %u не содержит минимальную точку восстановления %X/" "%X на линии времени %u" -#: access/transam/xlogrecovery.c:912 +#: access/transam/xlogrecovery.c:921 #, c-format msgid "invalid next transaction ID" msgstr "неверный ID следующей транзакции" -#: access/transam/xlogrecovery.c:917 +#: access/transam/xlogrecovery.c:926 #, c-format msgid "invalid redo in checkpoint record" msgstr "неверная запись REDO в контрольной точке" -#: access/transam/xlogrecovery.c:928 +#: access/transam/xlogrecovery.c:937 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "неверная запись REDO в контрольной точке выключения" -#: access/transam/xlogrecovery.c:957 +#: access/transam/xlogrecovery.c:966 #, c-format msgid "" "database system was not properly shut down; automatic recovery in progress" @@ -3887,19 +3905,19 @@ msgstr "" "система БД была остановлена нештатно; производится автоматическое " "восстановление" -#: access/transam/xlogrecovery.c:961 +#: access/transam/xlogrecovery.c:970 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "" "восстановление после сбоя начинается на линии времени %u, целевая линия " "времени: %u" -#: access/transam/xlogrecovery.c:1004 +#: access/transam/xlogrecovery.c:1013 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label содержит данные, не согласованные с файлом pg_control" -#: access/transam/xlogrecovery.c:1005 +#: access/transam/xlogrecovery.c:1014 #, c-format msgid "" "This means that the backup is corrupted and you will have to use another " @@ -3908,24 +3926,24 @@ msgstr "" "Это означает, что резервная копия повреждена и для восстановления БД " "придётся использовать другую копию." -#: access/transam/xlogrecovery.c:1059 +#: access/transam/xlogrecovery.c:1068 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "" "использование файла с конфигурацией восстановления \"%s\" не поддерживается" -#: access/transam/xlogrecovery.c:1124 +#: access/transam/xlogrecovery.c:1133 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "" "режим резервного сервера не поддерживается однопользовательским сервером" -#: access/transam/xlogrecovery.c:1141 +#: access/transam/xlogrecovery.c:1150 #, c-format msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" msgstr "не указано ни \"primary_conninfo\", ни \"restore_command\"" -#: access/transam/xlogrecovery.c:1142 +#: access/transam/xlogrecovery.c:1151 #, c-format msgid "" "The database server will regularly poll the pg_wal subdirectory to check for " @@ -3934,102 +3952,102 @@ msgstr "" "Сервер БД будет регулярно опрашивать подкаталог pg_wal и проверять " "содержащиеся в нём файлы." -#: access/transam/xlogrecovery.c:1150 +#: access/transam/xlogrecovery.c:1159 #, c-format msgid "must specify \"restore_command\" when standby mode is not enabled" msgstr "" "необходимо задать \"restore_command\", если не выбран режим резервного " "сервера" -#: access/transam/xlogrecovery.c:1188 +#: access/transam/xlogrecovery.c:1197 #, c-format msgid "recovery target timeline %u does not exist" msgstr "целевая линия времени для восстановления %u не существует" -#: access/transam/xlogrecovery.c:1271 access/transam/xlogrecovery.c:1278 -#: access/transam/xlogrecovery.c:1337 access/transam/xlogrecovery.c:1425 -#: access/transam/xlogrecovery.c:1434 access/transam/xlogrecovery.c:1454 +#: access/transam/xlogrecovery.c:1280 access/transam/xlogrecovery.c:1287 +#: access/transam/xlogrecovery.c:1346 access/transam/xlogrecovery.c:1434 +#: access/transam/xlogrecovery.c:1443 access/transam/xlogrecovery.c:1463 #, c-format msgid "invalid data in file \"%s\"" msgstr "неверные данные в файле \"%s\"" -#: access/transam/xlogrecovery.c:1338 +#: access/transam/xlogrecovery.c:1347 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "Получен идентификатор линии времени %u, но ожидался %u." -#: access/transam/xlogrecovery.c:1349 +#: access/transam/xlogrecovery.c:1358 #, c-format msgid "this is an incremental backup, not a data directory" msgstr "это каталог инкрементальной копии, не каталог данных" -#: access/transam/xlogrecovery.c:1350 +#: access/transam/xlogrecovery.c:1359 #, c-format msgid "Use pg_combinebackup to reconstruct a valid data directory." msgstr "" "Реконструируйте полноценный каталог данных, используя pg_combinebackup." -#: access/transam/xlogrecovery.c:1736 +#: access/transam/xlogrecovery.c:1745 #, c-format msgid "unexpected record type found at redo point %X/%X" msgstr "в точке redo %X/%X обнаружена запись неожиданного типа" -#: access/transam/xlogrecovery.c:1759 +#: access/transam/xlogrecovery.c:1768 #, c-format msgid "redo starts at %X/%X" msgstr "запись REDO начинается со смещения %X/%X" -#: access/transam/xlogrecovery.c:1772 +#: access/transam/xlogrecovery.c:1781 #, c-format msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" msgstr "" "выполняется воспроизведение, прошло времени: %ld.%02d с, текущий LSN: %X/%X" -#: access/transam/xlogrecovery.c:1862 +#: access/transam/xlogrecovery.c:1871 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "" "запрошенная точка остановки восстановления предшествует согласованной точке " "восстановления" -#: access/transam/xlogrecovery.c:1894 +#: access/transam/xlogrecovery.c:1903 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "записи REDO обработаны до смещения %X/%X, нагрузка системы: %s" -#: access/transam/xlogrecovery.c:1900 +#: access/transam/xlogrecovery.c:1909 #, c-format msgid "last completed transaction was at log time %s" msgstr "последняя завершённая транзакция была выполнена в %s" -#: access/transam/xlogrecovery.c:1909 +#: access/transam/xlogrecovery.c:1918 #, c-format msgid "redo is not required" msgstr "данные REDO не требуются" -#: access/transam/xlogrecovery.c:1921 +#: access/transam/xlogrecovery.c:1930 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "восстановление окончилось до достижения заданной цели восстановления" -#: access/transam/xlogrecovery.c:2115 +#: access/transam/xlogrecovery.c:2124 #, c-format msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" msgstr "" "успешно пропущена отсутствующая запись contrecord в %X/%X, перезаписанная в " "%s" -#: access/transam/xlogrecovery.c:2182 +#: access/transam/xlogrecovery.c:2191 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "в %2$s обнаружен недопустимый элемент-каталог \"%1$s\"" -#: access/transam/xlogrecovery.c:2184 +#: access/transam/xlogrecovery.c:2193 #, c-format msgid "All directory entries in %s/ should be symbolic links." msgstr "Все элементы-каталоги в %s/ должны быть символическими ссылками." -#: access/transam/xlogrecovery.c:2186 +#: access/transam/xlogrecovery.c:2195 #, c-format msgid "" "Remove those directories, or set \"allow_in_place_tablespaces\" to ON " @@ -4038,23 +4056,23 @@ msgstr "" "Удалите эти каталоги или на время установите в " "\"allow_in_place_tablespaces\" значение ON, чтобы восстановление завершилось." -#: access/transam/xlogrecovery.c:2238 +#: access/transam/xlogrecovery.c:2247 #, c-format msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" msgstr "завершено восстановление копии с LSN redo %X/%X и конечным LSN %X/%X" -#: access/transam/xlogrecovery.c:2269 +#: access/transam/xlogrecovery.c:2278 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "согласованное состояние восстановления достигнуто в позиции %X/%X" #. translator: %s is a WAL record description -#: access/transam/xlogrecovery.c:2307 +#: access/transam/xlogrecovery.c:2316 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "запись REDO в WAL в позиции %X/%X для %s" -#: access/transam/xlogrecovery.c:2405 +#: access/transam/xlogrecovery.c:2414 #, c-format msgid "" "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint " @@ -4063,13 +4081,13 @@ msgstr "" "неожиданный ID предыдущей линии времени %u (ID текущей линии времени %u) в " "записи контрольной точки" -#: access/transam/xlogrecovery.c:2414 +#: access/transam/xlogrecovery.c:2423 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "неожиданный ID линии времени %u (после %u) в записи контрольной точки" # skip-rule: capital-letter-first -#: access/transam/xlogrecovery.c:2430 +#: access/transam/xlogrecovery.c:2439 #, c-format msgid "" "unexpected timeline ID %u in checkpoint record, before reaching minimum " @@ -4078,83 +4096,83 @@ msgstr "" "неожиданный ID линии времени %u в записи контрольной точки, до достижения " "минимальной к. т. %X/%X на линии времени %u" -#: access/transam/xlogrecovery.c:2614 access/transam/xlogrecovery.c:2890 +#: access/transam/xlogrecovery.c:2623 access/transam/xlogrecovery.c:2899 #, c-format msgid "recovery stopping after reaching consistency" msgstr "" "восстановление останавливается после достижения согласованного состояния" -#: access/transam/xlogrecovery.c:2635 +#: access/transam/xlogrecovery.c:2644 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "восстановление останавливается перед позицией в WAL (LSN) \"%X/%X\"" -#: access/transam/xlogrecovery.c:2725 +#: access/transam/xlogrecovery.c:2734 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "" "восстановление останавливается перед фиксированием транзакции %u, время %s" -#: access/transam/xlogrecovery.c:2732 +#: access/transam/xlogrecovery.c:2741 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "" "восстановление останавливается перед прерыванием транзакции %u, время %s" -#: access/transam/xlogrecovery.c:2785 +#: access/transam/xlogrecovery.c:2794 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "восстановление останавливается в точке восстановления \"%s\", время %s" -#: access/transam/xlogrecovery.c:2803 +#: access/transam/xlogrecovery.c:2812 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "восстановление останавливается после позиции в WAL (LSN) \"%X/%X\"" -#: access/transam/xlogrecovery.c:2870 +#: access/transam/xlogrecovery.c:2879 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "" "восстановление останавливается после фиксирования транзакции %u, время %s" -#: access/transam/xlogrecovery.c:2878 +#: access/transam/xlogrecovery.c:2887 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "" "восстановление останавливается после прерывания транзакции %u, время %s" -#: access/transam/xlogrecovery.c:2959 +#: access/transam/xlogrecovery.c:2968 #, c-format msgid "pausing at the end of recovery" msgstr "остановка в конце восстановления" -#: access/transam/xlogrecovery.c:2960 +#: access/transam/xlogrecovery.c:2969 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Выполните pg_wal_replay_resume() для повышения." -#: access/transam/xlogrecovery.c:2963 access/transam/xlogrecovery.c:4720 +#: access/transam/xlogrecovery.c:2972 access/transam/xlogrecovery.c:4731 #, c-format msgid "recovery has paused" msgstr "восстановление приостановлено" -#: access/transam/xlogrecovery.c:2964 +#: access/transam/xlogrecovery.c:2973 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Выполните pg_wal_replay_resume() для продолжения." -#: access/transam/xlogrecovery.c:3227 +#: access/transam/xlogrecovery.c:3236 #, c-format msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" msgstr "" "неожиданный ID линии времени %u в сегменте WAL %s, LSN %X/%X, смещение %u" -#: access/transam/xlogrecovery.c:3443 +#: access/transam/xlogrecovery.c:3454 #, c-format msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" msgstr "не удалось прочитать сегмент WAL %s, LSN %X/%X, смещение %u: %m" -#: access/transam/xlogrecovery.c:3450 +#: access/transam/xlogrecovery.c:3461 #, c-format msgid "" "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" @@ -4162,38 +4180,38 @@ msgstr "" "не удалось прочитать сегмент WAL %s, LSN %X/%X, смещение %u (прочитано байт: " "%d из %zu)" -#: access/transam/xlogrecovery.c:4104 +#: access/transam/xlogrecovery.c:4115 #, c-format msgid "invalid checkpoint location" msgstr "неверное положение контрольной точки" -#: access/transam/xlogrecovery.c:4114 +#: access/transam/xlogrecovery.c:4125 #, c-format msgid "invalid checkpoint record" msgstr "неверная запись контрольной точки" -#: access/transam/xlogrecovery.c:4120 +#: access/transam/xlogrecovery.c:4131 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "неверный ID менеджера ресурсов в записи контрольной точки" -#: access/transam/xlogrecovery.c:4128 +#: access/transam/xlogrecovery.c:4139 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "неверные флаги xl_info в записи контрольной точки" -#: access/transam/xlogrecovery.c:4134 +#: access/transam/xlogrecovery.c:4145 #, c-format msgid "invalid length of checkpoint record" msgstr "неверная длина записи контрольной точки" -#: access/transam/xlogrecovery.c:4188 +#: access/transam/xlogrecovery.c:4199 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "" "новая линия времени %u не является ответвлением линии времени системы БД %u" -#: access/transam/xlogrecovery.c:4202 +#: access/transam/xlogrecovery.c:4213 #, c-format msgid "" "new timeline %u forked off current database system timeline %u before " @@ -4202,30 +4220,30 @@ msgstr "" "новая линия времени %u ответвилась от текущей линии времени базы данных %u " "до текущей точки восстановления %X/%X" -#: access/transam/xlogrecovery.c:4221 +#: access/transam/xlogrecovery.c:4232 #, c-format msgid "new target timeline is %u" msgstr "новая целевая линия времени %u" -#: access/transam/xlogrecovery.c:4422 +#: access/transam/xlogrecovery.c:4433 #, c-format msgid "WAL receiver process shutdown requested" msgstr "получен запрос на выключение процесса приёмника WAL" -#: access/transam/xlogrecovery.c:4482 +#: access/transam/xlogrecovery.c:4493 #, c-format msgid "received promote request" msgstr "получен запрос повышения статуса" -#: access/transam/xlogrecovery.c:4711 +#: access/transam/xlogrecovery.c:4722 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "" "режим горячего резерва невозможен из-за отсутствия достаточных значений " "параметров" -#: access/transam/xlogrecovery.c:4712 access/transam/xlogrecovery.c:4739 -#: access/transam/xlogrecovery.c:4769 +#: access/transam/xlogrecovery.c:4723 access/transam/xlogrecovery.c:4750 +#: access/transam/xlogrecovery.c:4780 #, c-format msgid "" "%s = %d is a lower setting than on the primary server, where its value was " @@ -4233,12 +4251,12 @@ msgid "" msgstr "" "Параметр %s = %d меньше, чем на ведущем сервере, где его значение было %d." -#: access/transam/xlogrecovery.c:4721 +#: access/transam/xlogrecovery.c:4732 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "В случае возобновления восстановления сервер отключится." -#: access/transam/xlogrecovery.c:4722 +#: access/transam/xlogrecovery.c:4733 #, c-format msgid "" "You can then restart the server after making the necessary configuration " @@ -4247,24 +4265,24 @@ msgstr "" "Затем вы можете перезапустить сервер после внесения необходимых изменений " "конфигурации." -#: access/transam/xlogrecovery.c:4733 +#: access/transam/xlogrecovery.c:4744 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "повышение невозможно из-за отсутствия достаточных значений параметров" -#: access/transam/xlogrecovery.c:4743 +#: access/transam/xlogrecovery.c:4754 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "" "Перезапустите сервер после внесения необходимых изменений конфигурации." -#: access/transam/xlogrecovery.c:4767 +#: access/transam/xlogrecovery.c:4778 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "" "восстановление прервано из-за отсутствия достаточных значений параметров" -#: access/transam/xlogrecovery.c:4773 +#: access/transam/xlogrecovery.c:4784 #, c-format msgid "" "You can restart the server after making the necessary configuration changes." @@ -4272,28 +4290,28 @@ msgstr "" "Вы можете перезапустить сервер после внесения необходимых изменений " "конфигурации." -#: access/transam/xlogrecovery.c:4793 access/transam/xlogrecovery.c:4795 +#: access/transam/xlogrecovery.c:4804 access/transam/xlogrecovery.c:4806 #: catalog/dependency.c:1153 catalog/dependency.c:1160 -#: catalog/dependency.c:1171 commands/tablecmds.c:1519 -#: commands/tablecmds.c:16740 commands/tablespace.c:460 commands/user.c:1302 -#: commands/vacuum.c:226 commands/view.c:441 executor/execExprInterp.c:5211 -#: executor/execExprInterp.c:5219 libpq/auth.c:320 -#: replication/logical/applyparallelworker.c:1048 replication/slot.c:1705 -#: replication/slot.c:2783 replication/slot.c:2785 replication/syncrep.c:1079 +#: catalog/dependency.c:1171 commands/tablecmds.c:1529 +#: commands/tablecmds.c:16751 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:226 commands/view.c:441 executor/execExprInterp.c:5282 +#: executor/execExprInterp.c:5290 libpq/auth.c:320 +#: replication/logical/applyparallelworker.c:1057 replication/slot.c:1707 +#: replication/slot.c:2785 replication/slot.c:2787 replication/syncrep.c:1079 #: storage/aio/method_io_uring.c:389 storage/lmgr/deadlock.c:1137 -#: storage/lmgr/proc.c:1525 utils/misc/guc.c:3166 utils/misc/guc.c:3207 +#: storage/lmgr/proc.c:1558 utils/misc/guc.c:3166 utils/misc/guc.c:3207 #: utils/misc/guc.c:3282 utils/misc/guc.c:6834 utils/misc/guc.c:6868 #: utils/misc/guc.c:6902 utils/misc/guc.c:6945 utils/misc/guc.c:6987 #, c-format msgid "%s" msgstr "%s" -#: access/transam/xlogrecovery.c:4825 +#: access/transam/xlogrecovery.c:4836 #, c-format msgid "multiple recovery targets specified" msgstr "указано несколько целей восстановления" -#: access/transam/xlogrecovery.c:4826 +#: access/transam/xlogrecovery.c:4837 #, c-format msgid "" "At most one of \"recovery_target\", \"recovery_target_lsn\", " @@ -4304,27 +4322,27 @@ msgstr "" "\"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", " "\"recovery_target_xid\"." -#: access/transam/xlogrecovery.c:4837 +#: access/transam/xlogrecovery.c:4848 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Единственное допустимое значение: \"immediate\"." -#: access/transam/xlogrecovery.c:4991 +#: access/transam/xlogrecovery.c:5002 #, c-format msgid "Timestamp out of range: \"%s\"." msgstr "Timestamp вне диапазона: \"%s\"." -#: access/transam/xlogrecovery.c:5036 +#: access/transam/xlogrecovery.c:5047 #, c-format msgid "\"recovery_target_timeline\" is not a valid number." msgstr "Значение \"recovery_target_timeline\" не является допустимым числом." -#: access/transam/xlogutils.c:1023 +#: access/transam/xlogutils.c:1059 #, c-format msgid "could not read from WAL segment %s, offset %d: %m" msgstr "не удалось прочитать из сегмента WAL %s по смещению %d: %m" -#: access/transam/xlogutils.c:1030 +#: access/transam/xlogutils.c:1066 #, c-format msgid "could not read from WAL segment %s, offset %d: read %d of %d" msgstr "" @@ -4347,7 +4365,7 @@ msgstr "Команда архивации с ошибкой: %s" msgid "archive command was terminated by exception 0x%X" msgstr "команда архивации была прервана исключением 0x%X" -#: archive/shell_archive.c:109 postmaster/postmaster.c:2850 +#: archive/shell_archive.c:109 postmaster/postmaster.c:2832 #, c-format msgid "" "See C include file \"ntstatus.h\" for a description of the hexadecimal value." @@ -4413,90 +4431,90 @@ msgstr[2] "всего ошибок контрольных сумм: %lld" msgid "checksum verification failure during base backup" msgstr "при базовом резервном копировании выявлены ошибки контрольных сумм" -#: backup/basebackup.c:735 backup/basebackup.c:744 backup/basebackup.c:755 -#: backup/basebackup.c:772 backup/basebackup.c:781 backup/basebackup.c:790 -#: backup/basebackup.c:805 backup/basebackup.c:822 backup/basebackup.c:831 -#: backup/basebackup.c:843 backup/basebackup.c:867 backup/basebackup.c:881 -#: backup/basebackup.c:892 backup/basebackup.c:903 backup/basebackup.c:916 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 +#: backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 +#: backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 +#: backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 +#: backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format msgid "duplicate option \"%s\"" msgstr "повторяющийся параметр \"%s\"" -#: backup/basebackup.c:763 +#: backup/basebackup.c:761 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "нераспознанный тип контрольной точки: \"%s\"" -#: backup/basebackup.c:795 +#: backup/basebackup.c:793 #, c-format msgid "incremental backups cannot be taken unless WAL summarization is enabled" msgstr "" "сделать инкрементальную копию можно, только когда включено обобщение WAL" -#: backup/basebackup.c:811 +#: backup/basebackup.c:809 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d вне диапазона, допустимого для параметра \"%s\" (%d .. %d)" -#: backup/basebackup.c:856 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "нераспознанный параметр в манифесте: \"%s\"" -#: backup/basebackup.c:907 +#: backup/basebackup.c:905 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "нераспознанный алгоритм сжатия: \"%s\"" -#: backup/basebackup.c:923 +#: backup/basebackup.c:921 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "нераспознанный параметр операции базового копирования: \"%s\"" -#: backup/basebackup.c:934 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "контрольные суммы не могут рассчитываться без манифеста копии" # skip-rule: capital-letter-first -#: backup/basebackup.c:943 +#: backup/basebackup.c:941 #, c-format msgid "target detail cannot be used without target" msgstr "доп. информацию о получателе нельзя задать без указания получателя" # skip-rule: capital-letter-first -#: backup/basebackup.c:952 backup/basebackup_target.c:218 +#: backup/basebackup.c:950 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "получатель \"%s\" не принимает доп. информацию" -#: backup/basebackup.c:963 +#: backup/basebackup.c:961 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "параметры сжатия нельзя указывать, если не включено сжатие" -#: backup/basebackup.c:976 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "неправильное указание сжатия: %s" -#: backup/basebackup.c:1026 +#: backup/basebackup.c:1024 #, c-format msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" msgstr "" "инкрементальной команде BASE_BACKUP должна предшествовать UPLOAD_MANIFEST" -#: backup/basebackup.c:1159 backup/basebackup.c:1360 +#: backup/basebackup.c:1157 backup/basebackup.c:1358 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не удалось получить информацию о файле или каталоге \"%s\": %m" -#: backup/basebackup.c:1546 +#: backup/basebackup.c:1544 #, c-format msgid "skipping special file \"%s\"" msgstr "специальный файл \"%s\" пропускается" -#: backup/basebackup.c:1753 +#: backup/basebackup.c:1751 #, c-format msgid "" "could not verify checksum in file \"%s\", block %u: read buffer size %d and " @@ -4505,7 +4523,7 @@ msgstr "" "не удалось проверить контрольную сумму в файле \"%s\", блоке %u: размер " "прочитанного буфера (%d) отличается от размера страницы (%d)" -#: backup/basebackup.c:1815 +#: backup/basebackup.c:1813 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" @@ -4513,7 +4531,7 @@ msgstr[0] "всего в файле \"%s\" обнаружено ошибок к msgstr[1] "всего в файле \"%s\" обнаружено ошибок контрольных сумм: %d" msgstr[2] "всего в файле \"%s\" обнаружено ошибок контрольных сумм: %d" -#: backup/basebackup.c:1920 +#: backup/basebackup.c:1918 #, c-format msgid "" "checksum verification failed in file \"%s\", block %u: calculated %X but " @@ -4522,19 +4540,19 @@ msgstr "" "ошибка контрольной суммы в файле \"%s\", блоке %u: вычислено значение %X, но " "ожидалось %X" -#: backup/basebackup.c:1927 +#: backup/basebackup.c:1925 #, c-format msgid "" "further checksum verification failures in file \"%s\" will not be reported" msgstr "" "о дальнейших ошибках контрольных сумм в файле \"%s\" сообщаться не будет" -#: backup/basebackup.c:2052 +#: backup/basebackup.c:2050 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "слишком длинное имя файла для формата tar: \"%s\"" -#: backup/basebackup.c:2058 +#: backup/basebackup.c:2056 #, c-format msgid "" "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" @@ -4542,7 +4560,7 @@ msgstr "" "цель символической ссылки слишком длинная для формата tar: имя файла \"%s\", " "цель \"%s\"" -#: backup/basebackup.c:2132 +#: backup/basebackup.c:2130 #, c-format msgid "could not read file \"%s\": read %zd of %zu" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %zd из %zu)" @@ -4678,7 +4696,7 @@ msgstr "" #: backup/basebackup_server.c:102 commands/dbcommands.c:478 #: commands/tablespace.c:157 commands/tablespace.c:173 -#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2287 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2289 #: storage/file/copydir.c:58 #, c-format msgid "could not create directory \"%s\": %m" @@ -4703,11 +4721,10 @@ msgid "Check free disk space." msgstr "Проверьте, есть ли место на диске." #: backup/basebackup_server.c:179 backup/basebackup_server.c:272 -#: backup/walsummary.c:309 #, c-format -msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %lld" msgstr "" -"не удалось записать файл \"%s\" (записано байт: %d из %d по смещению %u)" +"не удалось записать файл \"%s\" (записано байт: %d из %d по смещению %lld)" #: backup/basebackup_target.c:146 #, c-format @@ -4735,28 +4752,34 @@ msgstr "не удалось установить число потоков сж msgid "could not enable long-distance mode: %s" msgstr "не удалось включить режим большой дистанции: %s" +#: backup/walsummary.c:309 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "" +"не удалось записать файл \"%s\" (записано байт: %d из %d по смещению %u)" + #: backup/walsummaryfuncs.c:95 #, c-format msgid "invalid timeline %" msgstr "неверная линия времени %" -#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:626 tcop/postgres.c:3858 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:627 tcop/postgres.c:3862 #, c-format msgid "--%s must be first argument" msgstr "--%s должно быть первым аргументом" -#: bootstrap/bootstrap.c:253 postmaster/postmaster.c:640 tcop/postgres.c:3872 +#: bootstrap/bootstrap.c:253 postmaster/postmaster.c:641 tcop/postgres.c:3876 #, c-format msgid "--%s requires a value" msgstr "для --%s требуется значение" -#: bootstrap/bootstrap.c:258 postmaster/postmaster.c:645 tcop/postgres.c:3877 +#: bootstrap/bootstrap.c:258 postmaster/postmaster.c:646 tcop/postgres.c:3881 #, c-format msgid "-c %s requires a value" msgstr "для -c %s требуется значение" -#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:763 -#: postmaster/postmaster.c:776 +#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:764 +#: postmaster/postmaster.c:777 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Для дополнительной информации попробуйте \"%s --help\".\n" @@ -4913,23 +4936,23 @@ msgstr "нет полномочий для изменения прав дост msgid "cannot use IN SCHEMA clause when using %s" msgstr "предложение IN SCHEMA нельзя использовать в %s" -#: catalog/aclchk.c:1577 catalog/catalog.c:684 catalog/heap.c:2621 -#: catalog/heap.c:2941 catalog/objectaddress.c:1528 -#: catalog/pg_publication.c:570 commands/analyze.c:388 commands/copy.c:1039 -#: commands/sequence.c:1655 commands/tablecmds.c:7751 commands/tablecmds.c:7929 -#: commands/tablecmds.c:8130 commands/tablecmds.c:8259 -#: commands/tablecmds.c:8413 commands/tablecmds.c:8507 -#: commands/tablecmds.c:8610 commands/tablecmds.c:8776 -#: commands/tablecmds.c:8806 commands/tablecmds.c:8961 -#: commands/tablecmds.c:9064 commands/tablecmds.c:9198 -#: commands/tablecmds.c:9311 commands/tablecmds.c:14397 -#: commands/tablecmds.c:14600 commands/tablecmds.c:14761 -#: commands/tablecmds.c:15989 commands/tablecmds.c:18756 commands/trigger.c:948 -#: parser/analyze.c:2575 parser/parse_relation.c:749 parser/parse_target.c:1070 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3662 -#: parser/parse_utilcmd.c:3702 parser/parse_utilcmd.c:3744 -#: statistics/attribute_stats.c:212 statistics/attribute_stats.c:955 -#: utils/adt/acl.c:2938 utils/adt/ruleutils.c:2858 +#: catalog/aclchk.c:1577 catalog/catalog.c:684 catalog/heap.c:2638 +#: catalog/heap.c:2960 catalog/objectaddress.c:1528 +#: catalog/pg_publication.c:570 commands/analyze.c:388 commands/copy.c:1040 +#: commands/sequence.c:1655 commands/tablecmds.c:7761 commands/tablecmds.c:7935 +#: commands/tablecmds.c:8136 commands/tablecmds.c:8265 +#: commands/tablecmds.c:8419 commands/tablecmds.c:8513 +#: commands/tablecmds.c:8616 commands/tablecmds.c:8777 +#: commands/tablecmds.c:8807 commands/tablecmds.c:8962 +#: commands/tablecmds.c:9065 commands/tablecmds.c:9199 +#: commands/tablecmds.c:9312 commands/tablecmds.c:14408 +#: commands/tablecmds.c:14611 commands/tablecmds.c:14772 +#: commands/tablecmds.c:16000 commands/tablecmds.c:18767 commands/trigger.c:948 +#: parser/analyze.c:2591 parser/parse_relation.c:781 parser/parse_target.c:1070 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3671 +#: parser/parse_utilcmd.c:3711 parser/parse_utilcmd.c:3753 +#: statistics/attribute_stats.c:212 statistics/attribute_stats.c:981 +#: utils/adt/acl.c:2938 utils/adt/ruleutils.c:2860 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "столбец \"%s\" в таблице \"%s\" не существует" @@ -4939,13 +4962,13 @@ msgstr "столбец \"%s\" в таблице \"%s\" не существует msgid "\"%s\" is an index" msgstr "\"%s\" - это индекс" -#: catalog/aclchk.c:1829 commands/tablecmds.c:16146 commands/tablecmds.c:19675 +#: catalog/aclchk.c:1829 commands/tablecmds.c:16157 commands/tablecmds.c:19686 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" - это составной тип" #: catalog/aclchk.c:1837 catalog/objectaddress.c:1368 commands/tablecmds.c:266 -#: commands/tablecmds.c:19639 utils/adt/acl.c:2122 utils/adt/acl.c:2152 +#: commands/tablecmds.c:19650 utils/adt/acl.c:2122 utils/adt/acl.c:2152 #: utils/adt/acl.c:2185 utils/adt/acl.c:2221 utils/adt/acl.c:2252 #: utils/adt/acl.c:2283 #, c-format @@ -5425,7 +5448,7 @@ msgstr "вызывать %s() может только суперпользова msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() можно использовать только для системных каталогов" -#: catalog/catalog.c:676 parser/parse_utilcmd.c:2447 +#: catalog/catalog.c:676 parser/parse_utilcmd.c:2451 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "индекс \"%s\" не принадлежит таблице \"%s\"" @@ -5507,19 +5530,19 @@ msgstr[0] "удаление распространяется на ещё %d об msgstr[1] "удаление распространяется на ещё %d объекта" msgstr[2] "удаление распространяется на ещё %d объектов" -#: catalog/dependency.c:1850 +#: catalog/dependency.c:1853 #, c-format msgid "constant of the type %s cannot be used here" msgstr "константу типа %s здесь использовать нельзя" -#: catalog/dependency.c:2205 +#: catalog/dependency.c:2208 #, c-format msgid "transition table \"%s\" cannot be referenced in a persistent object" msgstr "на переходную таблицу \"%s\" нельзя ссылаться в постоянном объекте" -#: catalog/dependency.c:2390 parser/parse_relation.c:3513 -#: parser/parse_relation.c:3523 statistics/attribute_stats.c:224 -#: statistics/attribute_stats.c:596 statistics/attribute_stats.c:604 +#: catalog/dependency.c:2393 parser/parse_relation.c:3545 +#: parser/parse_relation.c:3555 statistics/attribute_stats.c:224 +#: statistics/attribute_stats.c:613 statistics/attribute_stats.c:621 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "столбец %d отношения \"%s\" не существует" @@ -5534,13 +5557,13 @@ msgstr "нет прав для создания отношения \"%s.%s\"" msgid "System catalog modifications are currently disallowed." msgstr "Изменение системного каталога в текущем состоянии запрещено." -#: catalog/heap.c:463 commands/tablecmds.c:2562 commands/tablecmds.c:3014 -#: commands/tablecmds.c:7361 +#: catalog/heap.c:463 commands/tablecmds.c:2572 commands/tablecmds.c:3024 +#: commands/tablecmds.c:7371 #, c-format msgid "tables can have at most %d columns" msgstr "максимальное число столбцов в таблице: %d" -#: catalog/heap.c:481 commands/tablecmds.c:7663 +#: catalog/heap.c:481 commands/tablecmds.c:7673 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "имя столбца \"%s\" конфликтует с системным столбцом" @@ -5551,33 +5574,33 @@ msgid "column name \"%s\" specified more than once" msgstr "имя столбца \"%s\" указано неоднократно" #. translator: first %s is an integer not a name -#: catalog/heap.c:575 +#: catalog/heap.c:579 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "столбец \"%s\" ключа разбиения имеет псевдотип %s" -#: catalog/heap.c:580 +#: catalog/heap.c:584 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "столбец \"%s\" имеет псевдотип %s" -#: catalog/heap.c:595 +#: catalog/heap.c:599 #, c-format msgid "virtual generated column \"%s\" cannot have a domain type" msgstr "виртуальный генерируемый столбец \"%s\" не может иметь доменный тип" -#: catalog/heap.c:622 +#: catalog/heap.c:626 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "составной тип %s не может содержать себя же" -#: catalog/heap.c:673 +#: catalog/heap.c:687 #, c-format msgid "virtual generated column \"%s\" cannot have a user-defined type" msgstr "" "виртуальный генерируемый столбец \"%s\" не может иметь пользовательский тип" -#: catalog/heap.c:674 catalog/heap.c:3295 +#: catalog/heap.c:688 catalog/heap.c:3314 #, c-format msgid "" "Virtual generated columns that make use of user-defined types are not yet " @@ -5587,7 +5610,7 @@ msgstr "" "данный момент не поддерживаются." #. translator: first %s is an integer not a name -#: catalog/heap.c:686 +#: catalog/heap.c:700 #, c-format msgid "" "no collation was derived for partition key column %s with collatable type %s" @@ -5595,28 +5618,28 @@ msgstr "" "для входящего в ключ разбиения столбца \"%s\" с сортируемым типом %s не " "удалось получить правило сортировки" -#: catalog/heap.c:692 commands/createas.c:200 commands/createas.c:512 +#: catalog/heap.c:706 commands/createas.c:200 commands/createas.c:512 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "" "для столбца \"%s\" с сортируемым типом %s не удалось получить правило " "сортировки" -#: catalog/heap.c:1179 catalog/index.c:901 commands/createas.c:408 -#: commands/tablecmds.c:4296 +#: catalog/heap.c:1196 catalog/index.c:905 commands/createas.c:408 +#: commands/tablecmds.c:4306 #, c-format msgid "relation \"%s\" already exists" msgstr "отношение \"%s\" уже существует" -#: catalog/heap.c:1195 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: catalog/heap.c:1212 catalog/pg_type.c:434 catalog/pg_type.c:805 #: catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 #: commands/typecmds.c:758 commands/typecmds.c:1213 commands/typecmds.c:1439 -#: commands/typecmds.c:1619 commands/typecmds.c:2594 +#: commands/typecmds.c:1626 commands/typecmds.c:2601 #, c-format msgid "type \"%s\" already exists" msgstr "тип \"%s\" уже существует" -#: catalog/heap.c:1196 +#: catalog/heap.c:1213 #, c-format msgid "" "A relation has an associated type of the same name, so you must use a name " @@ -5625,59 +5648,59 @@ msgstr "" "С отношением уже связан тип с таким же именем; выберите имя, не " "конфликтующее с существующими типами." -#: catalog/heap.c:1236 +#: catalog/heap.c:1253 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "" "значение relfilenumber для TOAST не задано в режиме двоичного обновления" -#: catalog/heap.c:1247 +#: catalog/heap.c:1264 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "значение OID кучи в pg_class не задано в режиме двоичного обновления" -#: catalog/heap.c:1257 +#: catalog/heap.c:1274 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "значение relfilenumber не задано в режиме двоичного обновления" -#: catalog/heap.c:2202 +#: catalog/heap.c:2219 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "" "добавить ограничение NO INHERIT к секционированной таблице \"%s\" нельзя" -#: catalog/heap.c:2525 +#: catalog/heap.c:2542 #, c-format msgid "check constraint \"%s\" already exists" msgstr "ограничение-проверка \"%s\" уже существует" -#: catalog/heap.c:2626 catalog/heap.c:2947 +#: catalog/heap.c:2643 catalog/heap.c:2966 #, c-format msgid "cannot add not-null constraint on system column \"%s\"" msgstr "добавить ограничение NOT NULL для системного столбца \"%s\" нельзя" -#: catalog/heap.c:2654 catalog/heap.c:2780 catalog/heap.c:3031 -#: catalog/index.c:915 catalog/pg_constraint.c:1025 commands/tablecmds.c:9821 +#: catalog/heap.c:2671 catalog/heap.c:2797 catalog/heap.c:3050 +#: catalog/index.c:919 catalog/pg_constraint.c:1025 commands/tablecmds.c:9822 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "ограничение \"%s\" для отношения \"%s\" уже существует" -#: catalog/heap.c:2787 +#: catalog/heap.c:2804 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2798 +#: catalog/heap.c:2815 #, c-format msgid "" "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с наследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2808 +#: catalog/heap.c:2825 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" @@ -5685,7 +5708,7 @@ msgstr "" "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "таблицы \"%s\"" -#: catalog/heap.c:2820 +#: catalog/heap.c:2837 #, c-format msgid "" "constraint \"%s\" conflicts with NOT ENFORCED constraint on relation \"%s\"" @@ -5693,74 +5716,74 @@ msgstr "" "ограничение \"%s\" конфликтует с неконтролируемым (NOT ENFORCED) " "ограничением таблицы \"%s\"" -#: catalog/heap.c:2825 +#: catalog/heap.c:2842 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "слияние ограничения \"%s\" с унаследованным определением" -#: catalog/heap.c:2849 catalog/pg_constraint.c:803 catalog/pg_constraint.c:1154 -#: commands/tablecmds.c:3179 commands/tablecmds.c:3499 -#: commands/tablecmds.c:7286 commands/tablecmds.c:7967 -#: commands/tablecmds.c:17583 commands/tablecmds.c:17765 +#: catalog/heap.c:2866 catalog/pg_constraint.c:803 catalog/pg_constraint.c:1154 +#: commands/tablecmds.c:3189 commands/tablecmds.c:3509 +#: commands/tablecmds.c:7296 commands/tablecmds.c:7973 +#: commands/tablecmds.c:17594 commands/tablecmds.c:17776 #, c-format msgid "too many inheritance parents" msgstr "слишком много родителей в иерархии наследования" -#: catalog/heap.c:2966 parser/parse_utilcmd.c:2655 +#: catalog/heap.c:2985 parser/parse_utilcmd.c:2659 #, c-format msgid "" "conflicting NO INHERIT declaration for not-null constraint on column \"%s\"" msgstr "" "конфликтующее объявление NO INHERIT для ограничения NOT NULL столбца \"%s\"" -#: catalog/heap.c:2980 +#: catalog/heap.c:2999 #, c-format msgid "conflicting not-null constraint names \"%s\" and \"%s\"" msgstr "конфликтующие имена ограничений NOT NULL \"%s\" и \"%s\"" -#: catalog/heap.c:3010 +#: catalog/heap.c:3029 #, c-format msgid "cannot define not-null constraint with NO INHERIT on column \"%s\"" msgstr "" "добавить ограничение NOT NULL со свойством NO INHERIT для столбца \"%s\" " "нельзя" -#: catalog/heap.c:3012 +#: catalog/heap.c:3031 #, c-format msgid "The column has an inherited not-null constraint." msgstr "Столбец имеет наследуемое ограничение NOT NULL." -#: catalog/heap.c:3202 +#: catalog/heap.c:3221 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "" "использовать генерируемый столбец \"%s\" в выражении генерируемого столбца " "нельзя" -#: catalog/heap.c:3204 +#: catalog/heap.c:3223 #, c-format msgid "A generated column cannot reference another generated column." msgstr "" "Генерируемый столбец не может ссылаться на другой генерируемый столбец." -#: catalog/heap.c:3210 +#: catalog/heap.c:3229 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "" "в выражении генерируемого столбца нельзя использовать переменные «вся строка»" -#: catalog/heap.c:3211 +#: catalog/heap.c:3230 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "" "Это сделало бы генерируемый столбец зависимым от собственного значения." -#: catalog/heap.c:3278 +#: catalog/heap.c:3297 #, c-format msgid "generation expression uses user-defined function" msgstr "генерирующее выражение использует пользовательскую функцию" -#: catalog/heap.c:3279 +#: catalog/heap.c:3298 #, c-format msgid "" "Virtual generated columns that make use of user-defined functions are not " @@ -5769,39 +5792,39 @@ msgstr "" "Виртуальные генерируемые столбцы, использующие пользовательские функции, на " "данный момент не поддерживаются." -#: catalog/heap.c:3294 +#: catalog/heap.c:3313 #, c-format msgid "generation expression uses user-defined type" msgstr "генерирующее выражение использует пользовательский тип" -#: catalog/heap.c:3346 +#: catalog/heap.c:3365 #, c-format msgid "generation expression is not immutable" msgstr "генерирующее выражение не является постоянным" -#: catalog/heap.c:3378 rewrite/rewriteHandler.c:1288 +#: catalog/heap.c:3397 rewrite/rewriteHandler.c:1321 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "столбец \"%s\" имеет тип %s, но тип выражения по умолчанию %s" -#: catalog/heap.c:3383 commands/prepare.c:334 parser/analyze.c:2906 +#: catalog/heap.c:3402 commands/prepare.c:334 parser/analyze.c:2922 #: parser/parse_target.c:595 parser/parse_target.c:885 -#: parser/parse_target.c:895 rewrite/rewriteHandler.c:1293 +#: parser/parse_target.c:895 rewrite/rewriteHandler.c:1326 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Перепишите выражение или преобразуйте его тип." -#: catalog/heap.c:3430 +#: catalog/heap.c:3449 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в ограничении-проверке можно ссылаться только на таблицу \"%s\"" -#: catalog/heap.c:3736 +#: catalog/heap.c:3755 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "неподдерживаемое сочетание внешнего ключа с ON COMMIT" -#: catalog/heap.c:3737 +#: catalog/heap.c:3756 #, c-format msgid "" "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT " @@ -5809,23 +5832,23 @@ msgid "" msgstr "" "Таблица \"%s\" ссылается на \"%s\", и для них задан разный режим ON COMMIT." -#: catalog/heap.c:3742 +#: catalog/heap.c:3761 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "опустошить таблицу, на которую ссылается внешний ключ, нельзя" -#: catalog/heap.c:3743 +#: catalog/heap.c:3762 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Таблица \"%s\" ссылается на \"%s\"." -#: catalog/heap.c:3745 +#: catalog/heap.c:3764 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "" "Опустошите таблицу \"%s\" параллельно или используйте TRUNCATE ... CASCADE." -#: catalog/index.c:220 parser/parse_utilcmd.c:2352 +#: catalog/index.c:220 parser/parse_utilcmd.c:2356 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "таблица \"%s\" не может иметь несколько первичных ключей" @@ -5845,82 +5868,82 @@ msgstr "первичные ключи не могут быть выражени msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "столбец первичного ключа \"%s\" не помечен как NOT NULL" -#: catalog/index.c:800 catalog/index.c:1921 +#: catalog/index.c:804 catalog/index.c:1935 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "" "пользовательские индексы в таблицах системного каталога не поддерживаются" -#: catalog/index.c:840 +#: catalog/index.c:844 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "" "недетерминированные правила сортировки не поддерживаются для класса " "операторов \"%s\"" -#: catalog/index.c:855 +#: catalog/index.c:859 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "" "параллельное создание индекса в таблицах системного каталога не " "поддерживается" -#: catalog/index.c:864 catalog/index.c:1333 +#: catalog/index.c:868 catalog/index.c:1340 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "" "параллельное создание индекса для ограничений-исключений не поддерживается" -#: catalog/index.c:873 +#: catalog/index.c:877 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "нельзя создать разделяемые индексы после initdb" -#: catalog/index.c:893 commands/createas.c:423 commands/sequence.c:159 +#: catalog/index.c:897 commands/createas.c:423 commands/sequence.c:159 #: parser/parse_utilcmd.c:210 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "отношение \"%s\" уже существует, пропускается" -#: catalog/index.c:943 +#: catalog/index.c:947 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "" "значение OID индекса в pg_class не задано в режиме двоичного обновления" -#: catalog/index.c:953 utils/cache/relcache.c:3795 +#: catalog/index.c:957 utils/cache/relcache.c:3797 #, c-format msgid "index relfilenumber value not set when in binary upgrade mode" msgstr "" "значение relfilenumber для индекса не задано в режиме двоичного обновления" -#: catalog/index.c:2222 +#: catalog/index.c:2236 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY должен быть первым действием в транзакции" -#: catalog/index.c:3729 +#: catalog/index.c:3755 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "переиндексировать временные таблицы других сеансов нельзя" -#: catalog/index.c:3740 commands/indexcmds.c:3791 +#: catalog/index.c:3766 commands/indexcmds.c:3793 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "перестроить нерабочий индекс в таблице TOAST нельзя" -#: catalog/index.c:3756 commands/indexcmds.c:3669 commands/indexcmds.c:3815 -#: commands/tablecmds.c:3703 +#: catalog/index.c:3782 commands/indexcmds.c:3671 commands/indexcmds.c:3817 +#: commands/tablecmds.c:3713 #, c-format msgid "cannot move system relation \"%s\"" msgstr "переместить системную таблицу \"%s\" нельзя" -#: catalog/index.c:3893 +#: catalog/index.c:3919 #, c-format msgid "index \"%s\" was reindexed" msgstr "индекс \"%s\" был перестроен" -#: catalog/index.c:4059 +#: catalog/index.c:4085 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "" @@ -5948,13 +5971,13 @@ msgstr "не удалось получить блокировку таблицы msgid "could not obtain lock on relation \"%s\"" msgstr "не удалось получить блокировку таблицы \"%s\"" -#: catalog/namespace.c:633 parser/parse_relation.c:1447 +#: catalog/namespace.c:633 parser/parse_relation.c:1479 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "отношение \"%s.%s\" не существует" -#: catalog/namespace.c:638 parser/parse_relation.c:1460 -#: parser/parse_relation.c:1468 utils/adt/regproc.c:913 +#: catalog/namespace.c:638 parser/parse_relation.c:1492 +#: parser/parse_relation.c:1500 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "отношение \"%s\" не существует" @@ -6001,7 +6024,7 @@ msgid "text search template \"%s\" does not exist" msgstr "шаблон текстового поиска \"%s\" не существует" #: catalog/namespace.c:3200 commands/tsearchcmds.c:1168 -#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 +#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:648 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "конфигурация текстового поиска \"%s\" не существует" @@ -6028,7 +6051,7 @@ msgid "cannot move objects into or out of TOAST schema" msgstr "перемещать объекты в/из схем TOAST нельзя" #: catalog/namespace.c:3547 commands/schemacmds.c:264 commands/schemacmds.c:344 -#: commands/tablecmds.c:1464 utils/adt/regproc.c:1688 +#: commands/tablecmds.c:1474 utils/adt/regproc.c:1688 #, c-format msgid "schema \"%s\" does not exist" msgstr "схема \"%s\" не существует" @@ -6064,26 +6087,26 @@ msgid "cannot create temporary tables during a parallel operation" msgstr "создавать временные таблицы во время параллельных операций нельзя" #: catalog/objectaddress.c:1376 commands/policy.c:93 commands/policy.c:373 -#: commands/tablecmds.c:260 commands/tablecmds.c:302 commands/tablecmds.c:2387 -#: commands/tablecmds.c:14535 +#: commands/tablecmds.c:260 commands/tablecmds.c:302 commands/tablecmds.c:2397 +#: commands/tablecmds.c:14546 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" - это не таблица" #: catalog/objectaddress.c:1383 commands/tablecmds.c:272 -#: commands/tablecmds.c:19644 commands/view.c:113 +#: commands/tablecmds.c:19655 commands/view.c:113 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" - это не представление" #: catalog/objectaddress.c:1390 commands/matview.c:201 commands/tablecmds.c:278 -#: commands/tablecmds.c:19649 +#: commands/tablecmds.c:19660 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" - это не материализованное представление" #: catalog/objectaddress.c:1397 commands/tablecmds.c:296 -#: commands/tablecmds.c:19654 +#: commands/tablecmds.c:19665 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" - это не сторонняя таблица" @@ -6105,7 +6128,7 @@ msgstr "" "значение по умолчанию для столбца \"%s\" отношения \"%s\" не существует" #: catalog/objectaddress.c:1623 commands/functioncmds.c:132 -#: commands/tablecmds.c:288 commands/typecmds.c:278 commands/typecmds.c:3842 +#: commands/tablecmds.c:288 commands/typecmds.c:278 commands/typecmds.c:3849 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 #: utils/adt/acl.c:4575 #, c-format @@ -6133,7 +6156,7 @@ msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "сопоставление для пользователя \"%s\" на сервере \"%s\" не существует" #: catalog/objectaddress.c:1839 commands/foreigncmds.c:441 -#: commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 +#: commands/foreigncmds.c:1009 commands/foreigncmds.c:1372 #: foreign/foreign.c:714 #, c-format msgid "server \"%s\" does not exist" @@ -6380,7 +6403,7 @@ msgstr "конфигурация текстового поиска %s" msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3665 catalog/objectaddress.c:5589 +#: catalog/objectaddress.c:3665 #, c-format msgid "membership of role %s in role %s" msgstr "членство роли %s в роли %s" @@ -6620,7 +6643,7 @@ msgstr "" msgid "return type of inverse transition function %s is not %s" msgstr "обратная функция перехода %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3057 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3105 #, c-format msgid "" "strictness of aggregate's forward and inverse transition functions must match" @@ -6708,12 +6731,12 @@ msgid "cannot change number of direct arguments of an aggregate function" msgstr "изменить число непосредственных аргументов агрегатной функции нельзя" #: catalog/pg_aggregate.c:859 commands/functioncmds.c:701 -#: commands/typecmds.c:2023 commands/typecmds.c:2069 commands/typecmds.c:2121 -#: commands/typecmds.c:2158 commands/typecmds.c:2192 commands/typecmds.c:2226 -#: commands/typecmds.c:2260 commands/typecmds.c:2289 commands/typecmds.c:2376 -#: commands/typecmds.c:2418 parser/parse_func.c:417 parser/parse_func.c:448 +#: commands/typecmds.c:2030 commands/typecmds.c:2076 commands/typecmds.c:2128 +#: commands/typecmds.c:2165 commands/typecmds.c:2199 commands/typecmds.c:2233 +#: commands/typecmds.c:2267 commands/typecmds.c:2296 commands/typecmds.c:2383 +#: commands/typecmds.c:2425 parser/parse_func.c:417 parser/parse_func.c:448 #: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 -#: parser/parse_func.c:631 parser/parse_func.c:2172 parser/parse_func.c:2445 +#: parser/parse_func.c:631 parser/parse_func.c:2170 parser/parse_func.c:2443 #, c-format msgid "function %s does not exist" msgstr "функция %s не существует" @@ -6811,7 +6834,7 @@ msgstr "правило сортировки \"%s\" уже существует" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "правило сортировки \"%s\" для кодировки \"%s\" уже существует" -#: catalog/pg_constraint.c:764 commands/tablecmds.c:7952 +#: catalog/pg_constraint.c:764 commands/tablecmds.c:7958 #, c-format msgid "" "cannot change NO INHERIT status of NOT NULL constraint \"%s\" on relation " @@ -6820,20 +6843,20 @@ msgstr "" "изменить статус NO INHERIT ограничения NOT NULL \"%s\" для отношения \"%s\" " "нельзя" -#: catalog/pg_constraint.c:766 commands/tablecmds.c:9584 +#: catalog/pg_constraint.c:766 commands/tablecmds.c:9585 #, c-format msgid "You might need to make the existing constraint inheritable using %s." msgstr "" "Возможно, существующее ограничение нужно сделать наследуемым, выполнив %s." -#: catalog/pg_constraint.c:776 commands/tablecmds.c:8301 +#: catalog/pg_constraint.c:776 commands/tablecmds.c:8307 #, c-format msgid "incompatible NOT VALID constraint \"%s\" on relation \"%s\"" msgstr "" "несовместимое непроверенное (NOT VALID) ограничение \"%s\" в отношении \"%s\"" -#: catalog/pg_constraint.c:778 commands/tablecmds.c:8303 -#: commands/tablecmds.c:9596 +#: catalog/pg_constraint.c:778 commands/tablecmds.c:8309 +#: commands/tablecmds.c:9597 #, c-format msgid "You might need to validate it using %s." msgstr "Возможно, следует проверить его, выполнив %s." @@ -6885,23 +6908,23 @@ msgstr "преобразование \"%s\" уже существует" msgid "default conversion for %s to %s already exists" msgstr "преобразование по умолчанию из %s в %s уже существует" -#: catalog/pg_depend.c:225 commands/extension.c:3818 +#: catalog/pg_depend.c:236 commands/extension.c:3818 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s уже относится к расширению \"%s\"" -#: catalog/pg_depend.c:232 catalog/pg_depend.c:283 commands/extension.c:3858 +#: catalog/pg_depend.c:243 catalog/pg_depend.c:294 commands/extension.c:3858 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s не относится к расширению \"%s\"" -#: catalog/pg_depend.c:235 +#: catalog/pg_depend.c:246 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "" "Расширениям не разрешается заменять объекты, которые им не принадлежат." -#: catalog/pg_depend.c:286 +#: catalog/pg_depend.c:297 #, c-format msgid "" "An extension may only use CREATE ... IF NOT EXISTS to skip object creation " @@ -6910,12 +6933,22 @@ msgstr "" "Расширение может выполнять CREATE ... IF NOT EXISTS только для того, чтобы " "не создавать объект, когда оно уже владеет конфликтующим объектом." -#: catalog/pg_depend.c:649 +#: catalog/pg_depend.c:667 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "" "ликвидировать зависимость от объекта %s нельзя, так как это системный объект" +#: catalog/pg_depend.c:812 +#, c-format +msgid "referenced %s was concurrently dropped" +msgstr "зависимый объект %s был удалён другим процессом" + +#: catalog/pg_depend.c:844 +#, c-format +msgid "referenced relation was concurrently dropped" +msgstr "зависимое отношение было удалено другим процессом" + #: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 #, c-format msgid "invalid enum label \"%s\"" @@ -6966,8 +6999,8 @@ msgstr "" "Эта секция отсоединяется параллельно или для неё не была завершена операция " "отсоединения." -#: catalog/pg_inherits.c:595 commands/tablecmds.c:4916 -#: commands/tablecmds.c:17891 +#: catalog/pg_inherits.c:595 commands/tablecmds.c:4926 +#: commands/tablecmds.c:17902 #, c-format msgid "" "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending " @@ -7082,7 +7115,7 @@ msgstr "обратный оператор %s уже является обрат msgid "parameter ACL \"%s\" does not exist" msgstr "ACL параметра \"%s\" не существует" -#: catalog/pg_proc.c:158 parser/parse_func.c:2234 +#: catalog/pg_proc.c:158 parser/parse_func.c:2232 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" @@ -7378,7 +7411,7 @@ msgstr "внутренний размер %d не подходит для тип msgid "alignment \"%c\" is invalid for variable-length type" msgstr "выравнивание \"%c\" не подходит для типа переменной длины" -#: catalog/pg_type.c:325 commands/typecmds.c:4362 +#: catalog/pg_type.c:325 commands/typecmds.c:4369 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "для типов постоянного размера применим только режим хранения PLAIN" @@ -7397,7 +7430,7 @@ msgstr "" "Имя мультидиапазонного типа можно указать вручную, воспользовавшись " "атрибутом \"multirange_type_name\"." -#: catalog/storage.c:549 storage/buffer/bufmgr.c:7338 +#: catalog/storage.c:549 storage/buffer/bufmgr.c:7361 #, c-format msgid "invalid page in block %u of relation \"%s\"" msgstr "некорректная страница в блоке %u отношения \"%s\"" @@ -7510,7 +7543,7 @@ msgstr "событийный триггер \"%s\" уже существует" msgid "foreign-data wrapper \"%s\" already exists" msgstr "обёртка сторонних данных \"%s\" уже существует" -#: commands/alter.c:89 commands/foreigncmds.c:895 +#: commands/alter.c:89 commands/foreigncmds.c:900 #, c-format msgid "server \"%s\" already exists" msgstr "сервер \"%s\" уже существует" @@ -7525,7 +7558,7 @@ msgstr "язык \"%s\" уже существует" msgid "publication \"%s\" already exists" msgstr "публикация \"%s\" уже существует" -#: commands/alter.c:98 commands/subscriptioncmds.c:629 +#: commands/alter.c:98 commands/subscriptioncmds.c:655 #, c-format msgid "subscription \"%s\" already exists" msgstr "подписка \"%s\" уже существует" @@ -7565,16 +7598,16 @@ msgstr "конфигурация текстового поиска \"%s\" уже msgid "must be superuser to rename %s" msgstr "переименовать \"%s\" может только суперпользователь" -#: commands/alter.c:256 commands/subscriptioncmds.c:608 -#: commands/subscriptioncmds.c:1147 commands/subscriptioncmds.c:1231 -#: commands/subscriptioncmds.c:1991 +#: commands/alter.c:256 commands/subscriptioncmds.c:634 +#: commands/subscriptioncmds.c:1173 commands/subscriptioncmds.c:1257 +#: commands/subscriptioncmds.c:2019 #, c-format msgid "password_required=false is superuser-only" msgstr "задать password_required=false может только суперпользователь" -#: commands/alter.c:257 commands/subscriptioncmds.c:609 -#: commands/subscriptioncmds.c:1148 commands/subscriptioncmds.c:1232 -#: commands/subscriptioncmds.c:1992 +#: commands/alter.c:257 commands/subscriptioncmds.c:635 +#: commands/subscriptioncmds.c:1174 commands/subscriptioncmds.c:1258 +#: commands/subscriptioncmds.c:2020 #, c-format msgid "" "Subscriptions with the password_required option set to false may only be " @@ -7737,7 +7770,7 @@ msgstr "" "текущую транзакцию." #: commands/cluster.c:127 commands/dbcommands.c:2356 -#: commands/explain_state.c:165 commands/indexcmds.c:2846 commands/vacuum.c:234 +#: commands/explain_state.c:165 commands/indexcmds.c:2848 commands/vacuum.c:234 #: commands/vacuum.c:308 #, c-format msgid "unrecognized %s option \"%s\"" @@ -7753,7 +7786,7 @@ msgstr "кластеризовать временные таблицы друг msgid "there is no previously clustered index for table \"%s\"" msgstr "таблица \"%s\" ранее не кластеризовалась по какому-либо индексу" -#: commands/cluster.c:190 commands/tablecmds.c:16447 commands/tablecmds.c:18513 +#: commands/cluster.c:190 commands/tablecmds.c:16458 commands/tablecmds.c:18524 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "индекс \"%s\" для таблицы \"%s\" не существует" @@ -7768,7 +7801,7 @@ msgstr "кластеризовать разделяемый каталог не msgid "cannot vacuum temporary tables of other sessions" msgstr "очищать временные таблицы других сеансов нельзя" -#: commands/cluster.c:507 commands/tablecmds.c:18523 +#: commands/cluster.c:507 commands/tablecmds.c:18534 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не является индексом таблицы \"%s\"" @@ -7840,14 +7873,14 @@ msgid "collation attribute \"%s\" not recognized" msgstr "атрибут COLLATION \"%s\" не распознан" #: commands/collationcmds.c:123 commands/collationcmds.c:129 -#: commands/define.c:375 commands/tablecmds.c:8394 +#: commands/define.c:375 commands/tablecmds.c:8400 #: replication/pgoutput/pgoutput.c:321 replication/pgoutput/pgoutput.c:344 #: replication/pgoutput/pgoutput.c:362 replication/pgoutput/pgoutput.c:372 #: replication/pgoutput/pgoutput.c:382 replication/pgoutput/pgoutput.c:392 -#: replication/pgoutput/pgoutput.c:404 replication/walsender.c:1137 -#: replication/walsender.c:1159 replication/walsender.c:1169 -#: replication/walsender.c:1178 replication/walsender.c:1420 -#: replication/walsender.c:1429 +#: replication/pgoutput/pgoutput.c:404 replication/walsender.c:1159 +#: replication/walsender.c:1181 replication/walsender.c:1191 +#: replication/walsender.c:1200 replication/walsender.c:1442 +#: replication/walsender.c:1451 #, c-format msgid "conflicting or redundant options" msgstr "конфликтующие или избыточные параметры" @@ -7917,11 +7950,11 @@ msgstr "нельзя обновить версию правила сортиро #. translator: %s is an SQL command #. translator: %s is an SQL ALTER command -#: commands/collationcmds.c:443 commands/subscriptioncmds.c:1445 -#: commands/tablecmds.c:8146 commands/tablecmds.c:8156 -#: commands/tablecmds.c:8158 commands/tablecmds.c:16149 -#: commands/tablecmds.c:19677 commands/tablecmds.c:19698 -#: commands/typecmds.c:3786 commands/typecmds.c:3871 commands/typecmds.c:4225 +#: commands/collationcmds.c:443 commands/subscriptioncmds.c:1471 +#: commands/tablecmds.c:8152 commands/tablecmds.c:8162 +#: commands/tablecmds.c:8164 commands/tablecmds.c:16160 +#: commands/tablecmds.c:19688 commands/tablecmds.c:19709 +#: commands/typecmds.c:3793 commands/typecmds.c:3878 commands/typecmds.c:4232 #, c-format msgid "Use %s instead." msgstr "Выполните %s." @@ -8061,194 +8094,194 @@ msgid "Only roles with privileges of the \"%s\" role may COPY to a file." msgstr "" "Выполнять COPY с записью в файл могут только роли с правами роли \"%s\"." -#: commands/copy.c:182 +#: commands/copy.c:183 #, c-format msgid "generated columns are not supported in COPY FROM WHERE conditions" msgstr "генерируемые столбцы не поддерживаются в условиях COPY FROM WHERE" -#: commands/copy.c:183 commands/tablecmds.c:14418 commands/tablecmds.c:19824 -#: commands/tablecmds.c:19906 commands/trigger.c:660 -#: rewrite/rewriteHandler.c:952 rewrite/rewriteHandler.c:987 +#: commands/copy.c:184 commands/tablecmds.c:14429 commands/tablecmds.c:19835 +#: commands/tablecmds.c:19917 commands/trigger.c:660 +#: rewrite/rewriteHandler.c:985 rewrite/rewriteHandler.c:1020 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Столбец \"%s\" является генерируемым." -#: commands/copy.c:232 +#: commands/copy.c:233 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM не поддерживается с защитой на уровне строк." -#: commands/copy.c:233 +#: commands/copy.c:234 #, c-format msgid "Use INSERT statements instead." msgstr "Используйте операторы INSERT." -#: commands/copy.c:414 +#: commands/copy.c:415 #, c-format msgid "cannot use \"%s\" with HEADER in COPY TO" msgstr "использовать \"%s\" с параметром HEADER в COPY TO нельзя" -#: commands/copy.c:423 +#: commands/copy.c:424 #, c-format msgid "%s requires a Boolean value or \"match\"" msgstr "%s требует логическое значение или \"match\"" #. translator: first %s is the name of a COPY option, e.g. ON_ERROR, #. second %s is a COPY with direction, e.g. COPY TO -#: commands/copy.c:441 commands/copy.c:857 commands/copy.c:873 -#: commands/copy.c:890 commands/copy.c:916 commands/copy.c:926 +#: commands/copy.c:442 commands/copy.c:858 commands/copy.c:874 +#: commands/copy.c:891 commands/copy.c:917 commands/copy.c:927 #, c-format msgid "COPY %s cannot be used with %s" msgstr "COPY %s нельзя использовать с %s" #. translator: first %s is the name of a COPY option, e.g. ON_ERROR -#: commands/copy.c:455 commands/copy.c:513 +#: commands/copy.c:456 commands/copy.c:514 #, c-format msgid "COPY %s \"%s\" not recognized" msgstr "параметр COPY %s \"%s\" не распознан" -#: commands/copy.c:475 commands/define.c:73 commands/define.c:84 +#: commands/copy.c:476 commands/define.c:73 commands/define.c:84 #: commands/define.c:178 commands/define.c:196 commands/define.c:211 #: commands/define.c:229 #, c-format msgid "%s requires a numeric value" msgstr "%s требует числовое значение" -#: commands/copy.c:485 +#: commands/copy.c:486 #, c-format msgid "REJECT_LIMIT (%) must be greater than zero" msgstr "значение REJECT_LIMIT (%) должно быть больше нуля" -#: commands/copy.c:575 +#: commands/copy.c:576 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "формат \"%s\" для COPY не распознан" -#: commands/copy.c:633 commands/copy.c:648 commands/copy.c:663 -#: commands/copy.c:682 +#: commands/copy.c:634 commands/copy.c:649 commands/copy.c:664 +#: commands/copy.c:683 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "аргументом параметра \"%s\" должен быть список имён столбцов" -#: commands/copy.c:694 +#: commands/copy.c:695 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "аргументом параметра \"%s\" должно быть название допустимой кодировки" -#: commands/copy.c:722 commands/dbcommands.c:880 commands/dbcommands.c:2421 +#: commands/copy.c:723 commands/dbcommands.c:880 commands/dbcommands.c:2421 #, c-format msgid "option \"%s\" not recognized" msgstr "параметр \"%s\" не распознан" #. translator: %s is the name of a COPY option, e.g. ON_ERROR -#: commands/copy.c:735 commands/copy.c:740 commands/copy.c:745 -#: commands/copy.c:815 +#: commands/copy.c:736 commands/copy.c:741 commands/copy.c:746 +#: commands/copy.c:816 #, c-format msgid "cannot specify %s in BINARY mode" msgstr "в режиме BINARY нельзя указывать %s" -#: commands/copy.c:767 +#: commands/copy.c:768 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "разделитель для COPY должен быть однобайтным символом" -#: commands/copy.c:774 +#: commands/copy.c:775 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "" "разделителем для COPY не может быть символ новой строки или возврата каретки" -#: commands/copy.c:780 +#: commands/copy.c:781 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "" "представление NULL для COPY не может включать символ новой строки или " "возврата каретки" -#: commands/copy.c:790 +#: commands/copy.c:791 #, c-format msgid "COPY default representation cannot use newline or carriage return" msgstr "" "представление DEFAULT для COPY не может включать символ новой строки или " "возврата каретки" -#: commands/copy.c:808 +#: commands/copy.c:809 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "\"%s\" не может быть разделителем для COPY" #. translator: %s is the name of a COPY option, e.g. ON_ERROR -#: commands/copy.c:822 commands/copy.c:839 commands/copy.c:851 -#: commands/copy.c:866 commands/copy.c:882 +#: commands/copy.c:823 commands/copy.c:840 commands/copy.c:852 +#: commands/copy.c:867 commands/copy.c:883 #, c-format msgid "COPY %s requires CSV mode" msgstr "для COPY %s требуется режим CSV" -#: commands/copy.c:827 +#: commands/copy.c:828 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "символ кавычек для COPY должен быть однобайтным" -#: commands/copy.c:832 +#: commands/copy.c:833 #, c-format msgid "COPY delimiter and quote must be different" msgstr "символ кавычек для COPY должен отличаться от разделителя" -#: commands/copy.c:844 +#: commands/copy.c:845 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "спецсимвол для COPY должен быть однобайтным" #. translator: %s is the name of a COPY option, e.g. NULL -#: commands/copy.c:898 commands/copy.c:934 +#: commands/copy.c:899 commands/copy.c:935 #, c-format msgid "COPY delimiter character must not appear in the %s specification" msgstr "символ разделителя для COPY не должен присутствовать в указании %s" #. translator: %s is the name of a COPY option, e.g. NULL -#: commands/copy.c:907 commands/copy.c:943 +#: commands/copy.c:908 commands/copy.c:944 #, c-format msgid "CSV quote character must not appear in the %s specification" msgstr "символ кавычек в CSV не должен присутствовать в указании %s" -#: commands/copy.c:952 +#: commands/copy.c:953 #, c-format msgid "NULL specification and DEFAULT specification cannot be the same" msgstr "представления NULL и DEFAULT не могут быть одинаковыми" -#: commands/copy.c:958 +#: commands/copy.c:959 #, c-format msgid "only ON_ERROR STOP is allowed in BINARY mode" msgstr "в режиме BINARY допускается только ON_ERROR STOP" #. translator: first and second %s are the names of COPY option, e.g. #. * ON_ERROR, third is the value of the COPY option, e.g. IGNORE -#: commands/copy.c:965 +#: commands/copy.c:966 #, c-format msgid "COPY %s requires %s to be set to %s" msgstr "для COPY %s требуется установить %s %s" -#: commands/copy.c:1027 +#: commands/copy.c:1028 #, c-format msgid "column \"%s\" is a generated column" msgstr "столбец \"%s\" — генерируемый" -#: commands/copy.c:1029 +#: commands/copy.c:1030 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Генерируемые столбцы нельзя использовать в COPY." -#: commands/copy.c:1044 commands/indexcmds.c:1959 commands/statscmds.c:260 -#: commands/tablecmds.c:2593 commands/tablecmds.c:3101 -#: commands/tablecmds.c:3930 parser/parse_relation.c:3798 -#: parser/parse_relation.c:3808 parser/parse_relation.c:3826 -#: parser/parse_relation.c:3833 parser/parse_relation.c:3847 -#: utils/adt/tsvector_op.c:2857 +#: commands/copy.c:1045 commands/indexcmds.c:1961 commands/statscmds.c:260 +#: commands/tablecmds.c:2603 commands/tablecmds.c:3111 +#: commands/tablecmds.c:3940 parser/parse_relation.c:3830 +#: parser/parse_relation.c:3840 parser/parse_relation.c:3858 +#: parser/parse_relation.c:3865 parser/parse_relation.c:3879 +#: utils/adt/tsvector_op.c:2830 #, c-format msgid "column \"%s\" does not exist" msgstr "столбец \"%s\" не существует" -#: commands/copy.c:1051 commands/tablecmds.c:2619 commands/trigger.c:957 +#: commands/copy.c:1052 commands/tablecmds.c:2629 commands/trigger.c:957 #: parser/parse_target.c:1086 parser/parse_target.c:1097 #, c-format msgid "column \"%s\" specified more than once" @@ -8427,7 +8460,7 @@ msgid "could not read from COPY file: %m" msgstr "не удалось прочитать файл COPY: %m" #: commands/copyfromparse.c:278 commands/copyfromparse.c:303 -#: replication/walsender.c:746 replication/walsender.c:772 tcop/postgres.c:369 +#: replication/walsender.c:746 replication/walsender.c:772 tcop/postgres.c:370 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "неожиданный обрыв соединения с клиентом при открытой транзакции" @@ -9014,7 +9047,7 @@ msgid "data directory with the specified OID %u already exists" msgstr "каталог данных с указанным OID %u уже существует" #: commands/dbcommands.c:1610 commands/dbcommands.c:1625 -#: utils/adt/pg_locale.c:1532 +#: utils/adt/pg_locale.c:1538 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "кодировка \"%s\" не соответствует локали \"%s\"" @@ -9202,7 +9235,7 @@ msgid "invalid argument for %s: \"%s\"" msgstr "неверный аргумент для %s: \"%s\"" #: commands/dropcmds.c:96 commands/functioncmds.c:1400 -#: utils/adt/ruleutils.c:2956 +#: utils/adt/ruleutils.c:2958 #, c-format msgid "\"%s\" is an aggregate function" msgstr "функция \"%s\" является агрегатной" @@ -9212,14 +9245,14 @@ msgstr "функция \"%s\" является агрегатной" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Используйте DROP AGGREGATE для удаления агрегатных функций." -#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:4014 -#: commands/tablecmds.c:4175 commands/tablecmds.c:4227 -#: commands/tablecmds.c:18954 tcop/utility.c:1328 +#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:4024 +#: commands/tablecmds.c:4185 commands/tablecmds.c:4237 +#: commands/tablecmds.c:18965 tcop/utility.c:1328 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "отношение \"%s\" не существует, пропускается" -#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1469 +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1479 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "схема \"%s\" не существует, пропускается" @@ -9339,7 +9372,7 @@ msgstr "правило \"%s\" для отношения \"%s\" не сущест msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "обёртка сторонних данных \"%s\" не существует, пропускается" -#: commands/dropcmds.c:448 commands/foreigncmds.c:1371 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1376 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "сервер \"%s\" не существует, пропускается" @@ -9425,23 +9458,23 @@ msgstr "нет прав для изменения владельца событ msgid "The owner of an event trigger must be a superuser." msgstr "Владельцем событийного триггера должен быть суперпользователь." -#: commands/event_trigger.c:1536 +#: commands/event_trigger.c:1544 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s можно вызывать только в событийной триггерной функции sql_drop" -#: commands/event_trigger.c:1629 commands/event_trigger.c:1650 +#: commands/event_trigger.c:1637 commands/event_trigger.c:1658 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%s можно вызывать только в событийной триггерной функции table_rewrite" -#: commands/event_trigger.c:2063 +#: commands/event_trigger.c:2074 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s можно вызывать только в событийной триггерной функции" #: commands/explain_state.c:133 commands/explain_state.c:158 -#: replication/walsender.c:1151 +#: replication/walsender.c:1173 #, c-format msgid "unrecognized value for %s option \"%s\": \"%s\"" msgstr "нераспознанное значение для параметра %s \"%s\": \"%s\"" @@ -9777,7 +9810,7 @@ msgstr "" "добавить схему \"%s\" к расширению \"%s\" нельзя, так как схема содержит " "расширение" -#: commands/extension.c:3912 commands/typecmds.c:4041 utils/fmgr/funcapi.c:725 +#: commands/extension.c:3912 commands/typecmds.c:4048 utils/fmgr/funcapi.c:725 #, c-format msgid "could not find multirange type for data type %s" msgstr "тип мультидиапазона для типа данных %s не найден" @@ -9862,7 +9895,7 @@ msgstr "" "при изменении обработчика в обёртке сторонних данных может измениться " "поведение существующих сторонних таблиц" -#: commands/foreigncmds.c:756 +#: commands/foreigncmds.c:761 #, c-format msgid "" "changing the foreign-data wrapper validator can cause the options for " @@ -9871,46 +9904,46 @@ msgstr "" "при изменении функции проверки в обёртке сторонних данных параметры " "зависимых объектов могут стать неверными" -#: commands/foreigncmds.c:887 +#: commands/foreigncmds.c:892 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "сервер \"%s\" уже существует, пропускается" -#: commands/foreigncmds.c:1155 +#: commands/foreigncmds.c:1160 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует, " "пропускается" -#: commands/foreigncmds.c:1165 +#: commands/foreigncmds.c:1170 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует" -#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 +#: commands/foreigncmds.c:1270 commands/foreigncmds.c:1390 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" не существует" -#: commands/foreigncmds.c:1390 +#: commands/foreigncmds.c:1395 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" не существует, " "пропускается" -#: commands/foreigncmds.c:1518 foreign/foreign.c:405 +#: commands/foreigncmds.c:1523 foreign/foreign.c:405 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "обёртка сторонних данных \"%s\" не имеет обработчика" -#: commands/foreigncmds.c:1524 +#: commands/foreigncmds.c:1529 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "обёртка сторонних данных \"%s\" не поддерживает IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1626 +#: commands/foreigncmds.c:1631 #, c-format msgid "importing foreign table \"%s\"" msgstr "импорт сторонней таблицы \"%s\"" @@ -10331,14 +10364,14 @@ msgstr "" msgid "cannot create indexes on temporary tables of other sessions" msgstr "создавать индексы во временных таблицах других сеансов нельзя" -#: commands/indexcmds.c:786 commands/tablecmds.c:892 commands/tablespace.c:1178 +#: commands/indexcmds.c:786 commands/tablecmds.c:893 commands/tablespace.c:1178 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "" "для секционированных отношений нельзя назначить табличное пространство по " "умолчанию" -#: commands/indexcmds.c:818 commands/tablecmds.c:923 commands/tablecmds.c:3710 +#: commands/indexcmds.c:818 commands/tablecmds.c:924 commands/tablecmds.c:3720 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "" @@ -10387,17 +10420,17 @@ msgstr "" "Ограничения %s не могут использоваться, когда ключи секционирования включают " "выражения." -#: commands/indexcmds.c:1056 commands/indexcmds.c:2469 -#: commands/indexcmds.c:2488 executor/execReplication.c:329 +#: commands/indexcmds.c:1056 commands/indexcmds.c:2471 +#: commands/indexcmds.c:2490 executor/execReplication.c:329 #: parser/parse_cte.c:303 parser/parse_oper.c:221 -#: utils/adt/array_userfuncs.c:1410 utils/adt/array_userfuncs.c:1553 +#: utils/adt/array_userfuncs.c:1419 utils/adt/array_userfuncs.c:1562 #: utils/adt/arrayfuncs.c:3870 utils/adt/arrayfuncs.c:4425 -#: utils/adt/arrayfuncs.c:6446 utils/adt/rowtypes.c:1220 +#: utils/adt/arrayfuncs.c:6453 utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" msgstr "не удалось найти оператор равенства для типа %s" -#: commands/indexcmds.c:1057 commands/indexcmds.c:2491 +#: commands/indexcmds.c:1057 commands/indexcmds.c:2493 #, c-format msgid "" "There is no suitable operator in operator family \"%s\" for access method " @@ -10432,110 +10465,110 @@ msgstr "" "В ограничении %s таблицы \"%s\" не хватает столбца \"%s\", входящего в ключ " "секционирования." -#: commands/indexcmds.c:1116 commands/indexcmds.c:1147 +#: commands/indexcmds.c:1116 commands/indexcmds.c:1148 #, c-format msgid "index creation on system columns is not supported" msgstr "создание индекса для системных столбцов не поддерживается" -#: commands/indexcmds.c:1123 +#: commands/indexcmds.c:1124 #, c-format msgid "primary keys on virtual generated columns are not supported" msgstr "" "первичные ключи с виртуальными генерируемыми столбцами не поддерживаются" -#: commands/indexcmds.c:1125 commands/indexcmds.c:1164 +#: commands/indexcmds.c:1126 commands/indexcmds.c:1166 #, c-format msgid "unique constraints on virtual generated columns are not supported" msgstr "" "ограничения уникальности с виртуальными генерируемыми столбцами не " "поддерживаются" -#: commands/indexcmds.c:1126 commands/indexcmds.c:1165 +#: commands/indexcmds.c:1127 commands/indexcmds.c:1167 #, c-format msgid "indexes on virtual generated columns are not supported" msgstr "индексы с виртуальными генерируемыми столбцами не поддерживаются" -#: commands/indexcmds.c:1397 tcop/utility.c:1518 +#: commands/indexcmds.c:1399 tcop/utility.c:1518 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "создать уникальный индекс в секционированной таблице \"%s\" нельзя" -#: commands/indexcmds.c:1399 tcop/utility.c:1520 +#: commands/indexcmds.c:1401 tcop/utility.c:1520 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Таблица \"%s\" содержит секции, являющиеся сторонними таблицами." -#: commands/indexcmds.c:1857 +#: commands/indexcmds.c:1859 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "функции в предикате индекса должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:1954 parser/parse_utilcmd.c:2735 -#: parser/parse_utilcmd.c:2918 +#: commands/indexcmds.c:1956 parser/parse_utilcmd.c:2739 +#: parser/parse_utilcmd.c:2927 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "указанный в ключе столбец \"%s\" не существует" -#: commands/indexcmds.c:1978 parser/parse_utilcmd.c:1988 +#: commands/indexcmds.c:1980 parser/parse_utilcmd.c:1988 #, c-format msgid "expressions are not supported in included columns" msgstr "выражения во включаемых столбцах не поддерживаются" -#: commands/indexcmds.c:2019 +#: commands/indexcmds.c:2021 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "функции в индексном выражении должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:2034 +#: commands/indexcmds.c:2036 #, c-format msgid "including column does not support a collation" msgstr "включаемые столбцы не поддерживают правила сортировки" -#: commands/indexcmds.c:2038 +#: commands/indexcmds.c:2040 #, c-format msgid "including column does not support an operator class" msgstr "включаемые столбцы не поддерживают классы операторов" -#: commands/indexcmds.c:2042 +#: commands/indexcmds.c:2044 #, c-format msgid "including column does not support ASC/DESC options" msgstr "включаемые столбцы не поддерживают сортировку ASC/DESC" -#: commands/indexcmds.c:2046 +#: commands/indexcmds.c:2048 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "включаемые столбцы не поддерживают указания NULLS FIRST/LAST" -#: commands/indexcmds.c:2089 +#: commands/indexcmds.c:2091 #, c-format msgid "could not determine which collation to use for index expression" msgstr "не удалось определить правило сортировки для индексного выражения" -#: commands/indexcmds.c:2097 commands/tablecmds.c:19994 commands/typecmds.c:812 -#: parser/parse_expr.c:2815 parser/parse_type.c:568 parser/parse_utilcmd.c:4064 +#: commands/indexcmds.c:2099 commands/tablecmds.c:20005 commands/typecmds.c:812 +#: parser/parse_expr.c:2815 parser/parse_type.c:568 parser/parse_utilcmd.c:4073 #: utils/adt/misc.c:630 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не поддерживает сортировку (COLLATION)" -#: commands/indexcmds.c:2164 +#: commands/indexcmds.c:2166 #, c-format msgid "operator %s is not commutative" msgstr "оператор %s не коммутативен" -#: commands/indexcmds.c:2166 +#: commands/indexcmds.c:2168 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "" "В ограничениях-исключениях могут использоваться только коммутативные " "операторы." -#: commands/indexcmds.c:2176 +#: commands/indexcmds.c:2178 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "оператор \"%s\" не входит в семейство операторов \"%s\"" -#: commands/indexcmds.c:2179 +#: commands/indexcmds.c:2181 #, c-format msgid "" "The exclusion operator must be related to the index operator class for the " @@ -10544,25 +10577,25 @@ msgstr "" "Оператор исключения для ограничения должен относиться к классу операторов " "индекса." -#: commands/indexcmds.c:2228 +#: commands/indexcmds.c:2230 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "метод доступа \"%s\" не поддерживает сортировку ASC/DESC" -#: commands/indexcmds.c:2233 +#: commands/indexcmds.c:2235 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доступа \"%s\" не поддерживает параметр NULLS FIRST/LAST" -#: commands/indexcmds.c:2277 commands/tablecmds.c:20019 -#: commands/tablecmds.c:20025 commands/typecmds.c:2349 +#: commands/indexcmds.c:2279 commands/tablecmds.c:20030 +#: commands/tablecmds.c:20036 commands/typecmds.c:2356 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" "для типа данных %s не определён класс операторов по умолчанию для метода " "доступа \"%s\"" -#: commands/indexcmds.c:2279 +#: commands/indexcmds.c:2281 #, c-format msgid "" "You must specify an operator class for the index or define a default " @@ -10571,34 +10604,34 @@ msgstr "" "Вы должны указать класс операторов для индекса или определить класс " "операторов по умолчанию для этого типа данных." -#: commands/indexcmds.c:2308 commands/indexcmds.c:2316 +#: commands/indexcmds.c:2310 commands/indexcmds.c:2318 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "класс операторов \"%s\" для метода доступа \"%s\" не существует" -#: commands/indexcmds.c:2330 commands/typecmds.c:2337 +#: commands/indexcmds.c:2332 commands/typecmds.c:2344 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "класс операторов \"%s\" не принимает тип данных %s" -#: commands/indexcmds.c:2420 +#: commands/indexcmds.c:2422 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "" "для типа данных %s определено несколько классов операторов по умолчанию" -#: commands/indexcmds.c:2470 commands/indexcmds.c:2489 +#: commands/indexcmds.c:2472 commands/indexcmds.c:2491 #, c-format msgid "could not identify an overlaps operator for type %s" msgstr "для типа %s не удалось найти оператор пересечения" -#: commands/indexcmds.c:2471 commands/indexcmds.c:2490 +#: commands/indexcmds.c:2473 commands/indexcmds.c:2492 #, c-format msgid "could not identify a contained-by operator for type %s" msgstr "не удалось найти оператор «содержится в» для типа %s" -#: commands/indexcmds.c:2472 commands/tablecmds.c:10358 +#: commands/indexcmds.c:2474 commands/tablecmds.c:10358 #, c-format msgid "" "Could not translate compare type %d for operator family \"%s\" of access " @@ -10607,67 +10640,67 @@ msgstr "" "Не удалось перевести тип сравнения %d для семейства операторов \"%s\" метода " "доступа \"%s\"." -#: commands/indexcmds.c:3078 +#: commands/indexcmds.c:3080 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "" "в таблице \"%s\" нет индексов, которые можно переиндексировать неблокирующим " "способом" -#: commands/indexcmds.c:3092 +#: commands/indexcmds.c:3094 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "в таблице \"%s\" нет индексов для переиндексации" -#: commands/indexcmds.c:3139 commands/indexcmds.c:3650 -#: commands/indexcmds.c:3780 +#: commands/indexcmds.c:3141 commands/indexcmds.c:3652 +#: commands/indexcmds.c:3782 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Переиндексировать системные каталоги неблокирующим способом нельзя" -#: commands/indexcmds.c:3163 +#: commands/indexcmds.c:3165 #, c-format msgid "can only reindex the currently open database" msgstr "переиндексировать можно только текущую базу данных" -#: commands/indexcmds.c:3255 +#: commands/indexcmds.c:3257 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "все системные каталоги пропускаются, так как их нельзя переиндексировать " "неблокирующим способом" -#: commands/indexcmds.c:3288 +#: commands/indexcmds.c:3290 #, c-format msgid "cannot move system relations, skipping all" msgstr "переместить системные отношения нельзя, все они пропускаются" -#: commands/indexcmds.c:3334 +#: commands/indexcmds.c:3336 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "при переиндексировании секционированной таблицы \"%s.%s\"" -#: commands/indexcmds.c:3337 +#: commands/indexcmds.c:3339 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "при перестроении секционированного индекса \"%s.%s\"" -#: commands/indexcmds.c:3530 commands/indexcmds.c:4422 +#: commands/indexcmds.c:3532 commands/indexcmds.c:4426 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблица \"%s.%s\" переиндексирована" -#: commands/indexcmds.c:3682 commands/indexcmds.c:3735 +#: commands/indexcmds.c:3684 commands/indexcmds.c:3737 #, c-format msgid "skipping reindex of invalid index \"%s.%s\"" msgstr "индекс \"%s.%s\" — нерабочий, переиндексация пропускается" -#: commands/indexcmds.c:3685 commands/indexcmds.c:3738 +#: commands/indexcmds.c:3687 commands/indexcmds.c:3740 #, c-format msgid "Use DROP INDEX or REINDEX INDEX." msgstr "Выполните DROP INDEX или REINDEX INDEX." -#: commands/indexcmds.c:3689 +#: commands/indexcmds.c:3691 #, c-format msgid "" "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" @@ -10675,24 +10708,24 @@ msgstr "" "перестроить индекс ограничения-исключения \"%s.%s\" неблокирующим способом " "нельзя, он пропускается" -#: commands/indexcmds.c:3845 +#: commands/indexcmds.c:3847 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "переиндексировать отношение такого типа неблокирующим способом нельзя" -#: commands/indexcmds.c:3863 +#: commands/indexcmds.c:3865 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "" "переместить отношение, не являющееся разделяемым, в табличное пространство " "\"%s\" нельзя" -#: commands/indexcmds.c:4403 commands/indexcmds.c:4415 +#: commands/indexcmds.c:4407 commands/indexcmds.c:4419 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "индекс \"%s.%s\" был перестроен" -#: commands/indexcmds.c:4405 commands/indexcmds.c:4424 +#: commands/indexcmds.c:4409 commands/indexcmds.c:4428 #, c-format msgid "%s." msgstr "%s." @@ -11098,12 +11131,12 @@ msgid "operator attribute \"%s\" cannot be changed if it has already been set" msgstr "атрибут оператора \"%s\" нельзя изменить, если он уже установлен" #: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:152 -#: commands/tablecmds.c:1800 commands/tablecmds.c:2400 -#: commands/tablecmds.c:3824 commands/tablecmds.c:6793 -#: commands/tablecmds.c:10114 commands/tablecmds.c:19565 -#: commands/tablecmds.c:19600 commands/trigger.c:319 commands/trigger.c:1338 +#: commands/tablecmds.c:1810 commands/tablecmds.c:2410 +#: commands/tablecmds.c:3834 commands/tablecmds.c:6803 +#: commands/tablecmds.c:10114 commands/tablecmds.c:19576 +#: commands/tablecmds.c:19611 commands/trigger.c:319 commands/trigger.c:1338 #: commands/trigger.c:1448 rewrite/rewriteDefine.c:268 -#: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 +#: rewrite/rewriteDefine.c:764 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "доступ запрещён: \"%s\" - это системный каталог" @@ -11206,7 +11239,7 @@ msgstr "" "для создания дополнительного процедурного языка нужно быть суперпользователем" #: commands/publicationcmds.c:135 libpq/auth-oauth.c:850 -#: postmaster/postmaster.c:1130 postmaster/postmaster.c:1232 +#: postmaster/postmaster.c:1131 postmaster/postmaster.c:1233 #: utils/init/miscinit.c:1871 #, c-format msgid "invalid list syntax in parameter \"%s\"" @@ -11377,7 +11410,7 @@ msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "В публикации всех таблиц нельзя добавлять или удалять таблицы." #: commands/publicationcmds.c:1497 commands/publicationcmds.c:1536 -#: commands/publicationcmds.c:2073 utils/cache/lsyscache.c:3774 +#: commands/publicationcmds.c:2073 utils/cache/lsyscache.c:3936 #, c-format msgid "publication \"%s\" does not exist" msgstr "публикация \"%s\" не существует" @@ -11621,8 +11654,8 @@ msgstr "" msgid "cannot change ownership of identity sequence" msgstr "сменить владельца последовательности идентификации нельзя" -#: commands/sequence.c:1671 commands/tablecmds.c:16136 -#: commands/tablecmds.c:18974 +#: commands/sequence.c:1671 commands/tablecmds.c:16147 +#: commands/tablecmds.c:18985 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Последовательность \"%s\" связана с таблицей \"%s\"." @@ -11710,12 +11743,12 @@ msgstr "повторяющееся имя столбца в определени msgid "duplicate expression in statistics definition" msgstr "повторяющееся выражение в определении статистики" -#: commands/statscmds.c:667 commands/tablecmds.c:8939 +#: commands/statscmds.c:667 commands/tablecmds.c:8940 #, c-format msgid "statistics target %d is too low" msgstr "ориентир статистики слишком мал (%d)" -#: commands/statscmds.c:675 commands/tablecmds.c:8947 +#: commands/statscmds.c:675 commands/tablecmds.c:8948 #, c-format msgid "lowering statistics target to %d" msgstr "ориентир статистики снижается до %d" @@ -11754,12 +11787,12 @@ msgstr "указания %s и %s являются взаимоисключаю msgid "subscription with %s must also set %s" msgstr "для подписки с параметром %s необходимо также задать %s" -#: commands/subscriptioncmds.c:466 +#: commands/subscriptioncmds.c:492 #, c-format msgid "could not receive list of publications from the publisher: %s" msgstr "не удалось получить список публикаций с публикующего сервера: %s" -#: commands/subscriptioncmds.c:498 +#: commands/subscriptioncmds.c:524 #, c-format msgid "publication %s does not exist on the publisher" msgid_plural "publications %s do not exist on the publisher" @@ -11767,33 +11800,33 @@ msgstr[0] "публикация %s не существует на публику msgstr[1] "публикации %s не существуют на публикующем сервере" msgstr[2] "публикации %s не существуют на публикующем сервере" -#: commands/subscriptioncmds.c:586 +#: commands/subscriptioncmds.c:612 #, c-format msgid "permission denied to create subscription" msgstr "нет прав для создания подписки" -#: commands/subscriptioncmds.c:587 +#: commands/subscriptioncmds.c:613 #, c-format msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "Создавать подписки могут только роли с правами роли \"%s\"." -#: commands/subscriptioncmds.c:718 commands/subscriptioncmds.c:852 -#: commands/subscriptioncmds.c:1594 +#: commands/subscriptioncmds.c:744 commands/subscriptioncmds.c:878 +#: commands/subscriptioncmds.c:1620 #, c-format msgid "subscription \"%s\" could not connect to the publisher: %s" msgstr "подключить подписку \"%s\" к серверу публикации не удалось: %s" -#: commands/subscriptioncmds.c:790 +#: commands/subscriptioncmds.c:816 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "на сервере публикации создан слот репликации \"%s\"" -#: commands/subscriptioncmds.c:802 +#: commands/subscriptioncmds.c:828 #, c-format msgid "subscription was created, but is not connected" msgstr "подписка создана, но не подключена" -#: commands/subscriptioncmds.c:803 +#: commands/subscriptioncmds.c:829 #, c-format msgid "" "To initiate replication, you must manually create the replication slot, " @@ -11802,35 +11835,35 @@ msgstr "" "Чтобы начать репликацию, вы должны вручную создать слот репликации, включить " "подписку, а затем обновить её." -#: commands/subscriptioncmds.c:1070 +#: commands/subscriptioncmds.c:1096 #, c-format msgid "cannot set option \"%s\" for enabled subscription" msgstr "для включённой подписки нельзя задать параметр \"%s\"" -#: commands/subscriptioncmds.c:1084 +#: commands/subscriptioncmds.c:1110 #, c-format msgid "" "cannot set option \"%s\" for a subscription that does not have a slot name" msgstr "" "задать параметр \"%s\" для подписки, для которой не задано имя слота, нельзя" -#: commands/subscriptioncmds.c:1127 commands/subscriptioncmds.c:1665 -#: commands/subscriptioncmds.c:2046 utils/cache/lsyscache.c:3824 +#: commands/subscriptioncmds.c:1153 commands/subscriptioncmds.c:1691 +#: commands/subscriptioncmds.c:2074 utils/cache/lsyscache.c:3986 #, c-format msgid "subscription \"%s\" does not exist" msgstr "подписка \"%s\" не существует" -#: commands/subscriptioncmds.c:1185 +#: commands/subscriptioncmds.c:1211 #, c-format msgid "cannot set %s for enabled subscription" msgstr "для включённой подписки нельзя задать %s" -#: commands/subscriptioncmds.c:1270 +#: commands/subscriptioncmds.c:1296 #, c-format msgid "\"slot_name\" and \"two_phase\" cannot be altered at the same time" msgstr "параметры \"slot_name\" и \"two_phase\" нельзя изменить одновременно" -#: commands/subscriptioncmds.c:1286 +#: commands/subscriptioncmds.c:1312 #, c-format msgid "" "cannot alter \"two_phase\" when logical replication worker is still running" @@ -11838,41 +11871,41 @@ msgstr "" "изменить параметр \"two_phase\", пока выполняется рабочий процесс логической " "репликации, нельзя" -#: commands/subscriptioncmds.c:1287 +#: commands/subscriptioncmds.c:1313 #, c-format msgid "Try again after some time." msgstr "Повторите попытку позже." -#: commands/subscriptioncmds.c:1300 +#: commands/subscriptioncmds.c:1326 #, c-format msgid "cannot disable \"two_phase\" when prepared transactions exist" msgstr "" "отключить \"two_phase\" нельзя, когда существуют подготовленные транзакции" -#: commands/subscriptioncmds.c:1301 +#: commands/subscriptioncmds.c:1327 #, c-format msgid "Resolve these transactions and try again." msgstr "Повторите попытку после завершения этих транзакций." -#: commands/subscriptioncmds.c:1348 +#: commands/subscriptioncmds.c:1374 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "включить подписку, для которой не задано имя слота, нельзя" -#: commands/subscriptioncmds.c:1392 commands/subscriptioncmds.c:1443 +#: commands/subscriptioncmds.c:1418 commands/subscriptioncmds.c:1469 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "" "ALTER SUBSCRIPTION с обновлением для отключённых подписок не допускается" -#: commands/subscriptioncmds.c:1393 +#: commands/subscriptioncmds.c:1419 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "" "Выполните ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1402 commands/subscriptioncmds.c:1457 +#: commands/subscriptioncmds.c:1428 commands/subscriptioncmds.c:1483 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase " @@ -11881,7 +11914,7 @@ msgstr "" "ALTER SUBSCRIPTION с параметром публикации refresh в режиме copy_data не " "допускается, когда включён параметр two_phase" -#: commands/subscriptioncmds.c:1403 +#: commands/subscriptioncmds.c:1429 #, c-format msgid "" "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with " @@ -11891,7 +11924,7 @@ msgstr "" "copy_data = false либо выполните DROP/CREATE SUBSCRIPTION." #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1459 +#: commands/subscriptioncmds.c:1485 #, c-format msgid "" "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE " @@ -11900,13 +11933,13 @@ msgstr "" "Выполните %s с refresh = false или с copy_data = false либо выполните DROP/" "CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1481 +#: commands/subscriptioncmds.c:1507 #, c-format msgid "" "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH для отключённых подписок не допускается" -#: commands/subscriptioncmds.c:1506 +#: commands/subscriptioncmds.c:1532 #, c-format msgid "" "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase " @@ -11915,7 +11948,7 @@ msgstr "" "ALTER SUBSCRIPTION ... REFRESH в режиме copy_data не допускается, когда " "включён параметр two_phase" -#: commands/subscriptioncmds.c:1507 +#: commands/subscriptioncmds.c:1533 #, c-format msgid "" "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/" @@ -11924,39 +11957,39 @@ msgstr "" "Выполните ALTER SUBSCRIPTION ... REFRESH с copy_data = false либо выполните " "DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1542 +#: commands/subscriptioncmds.c:1568 #, c-format msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" msgstr "" "позиция пропуска в WAL (LSN %X/%X) должна быть больше начального LSN %X/%X" -#: commands/subscriptioncmds.c:1669 +#: commands/subscriptioncmds.c:1695 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "подписка \"%s\" не существует, пропускается" -#: commands/subscriptioncmds.c:1936 +#: commands/subscriptioncmds.c:1964 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "слот репликации \"%s\" удалён на сервере репликации" -#: commands/subscriptioncmds.c:1945 commands/subscriptioncmds.c:1953 +#: commands/subscriptioncmds.c:1973 commands/subscriptioncmds.c:1981 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "слот репликации \"%s\" на сервере публикации не был удалён: %s" -#: commands/subscriptioncmds.c:2078 +#: commands/subscriptioncmds.c:2106 #, c-format msgid "subscription with OID %u does not exist" msgstr "подписка с OID %u не существует" -#: commands/subscriptioncmds.c:2152 commands/subscriptioncmds.c:2276 +#: commands/subscriptioncmds.c:2185 commands/subscriptioncmds.c:2309 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "" "не удалось получить список реплицируемых таблиц с сервера репликации: %s" -#: commands/subscriptioncmds.c:2188 +#: commands/subscriptioncmds.c:2221 #, c-format msgid "" "subscription \"%s\" requested copy_data with origin = NONE but might copy " @@ -11965,7 +11998,7 @@ msgstr "" "для подписки \"%s\" выбран режим copy_data с origin = NONE, но в неё могут " "попасть данные из другого источника" -#: commands/subscriptioncmds.c:2190 +#: commands/subscriptioncmds.c:2223 #, c-format msgid "" "The subscription being created subscribes to a publication (%s) that " @@ -11983,7 +12016,7 @@ msgstr[2] "" "Создаваемая подписка связана с публикациями (%s), содержащими таблицы, в " "которые записывают другие подписки." -#: commands/subscriptioncmds.c:2193 +#: commands/subscriptioncmds.c:2226 #, c-format msgid "" "Verify that initial data copied from the publisher tables did not come from " @@ -11992,7 +12025,7 @@ msgstr "" "Убедитесь, что начальные данные, скопированные из таблиц публикации, " "поступили не из других источников." -#: commands/subscriptioncmds.c:2298 replication/logical/tablesync.c:933 +#: commands/subscriptioncmds.c:2331 replication/logical/tablesync.c:933 #: replication/pgoutput/pgoutput.c:1189 #, c-format msgid "" @@ -12002,7 +12035,7 @@ msgstr "" "использовать различные списки столбцов таблицы \"%s.%s\" в разных " "публикациях нельзя" -#: commands/subscriptioncmds.c:2348 +#: commands/subscriptioncmds.c:2381 #, c-format msgid "" "could not connect to publisher when attempting to drop replication slot " @@ -12012,7 +12045,7 @@ msgstr "" "\"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2351 +#: commands/subscriptioncmds.c:2384 #, c-format msgid "" "Use %s to disable the subscription, and then use %s to disassociate it from " @@ -12021,27 +12054,27 @@ msgstr "" "Выполните %s, чтобы отключить подписку, а затем выполните %s, чтобы отвязать " "её от слота." -#: commands/subscriptioncmds.c:2382 +#: commands/subscriptioncmds.c:2415 #, c-format msgid "publication name \"%s\" used more than once" msgstr "имя публикации \"%s\" используется неоднократно" -#: commands/subscriptioncmds.c:2426 +#: commands/subscriptioncmds.c:2459 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "публикация \"%s\" уже имеется в подписке \"%s\"" -#: commands/subscriptioncmds.c:2440 +#: commands/subscriptioncmds.c:2473 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "публикация \"%s\" отсутствует в подписке \"%s\"" -#: commands/subscriptioncmds.c:2451 +#: commands/subscriptioncmds.c:2484 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "удалить все публикации из подписки нельзя" -#: commands/subscriptioncmds.c:2508 +#: commands/subscriptioncmds.c:2541 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s требует логическое значение или \"parallel\"" @@ -12104,8 +12137,8 @@ msgstr "" "Выполните DROP MATERIALIZED VIEW для удаления материализованного " "представления." -#: commands/tablecmds.c:282 commands/tablecmds.c:306 commands/tablecmds.c:21651 -#: parser/parse_utilcmd.c:2428 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 commands/tablecmds.c:21662 +#: parser/parse_utilcmd.c:2432 #, c-format msgid "index \"%s\" does not exist" msgstr "индекс \"%s\" не существует" @@ -12128,8 +12161,8 @@ msgstr "\"%s\" - это не тип" msgid "Use DROP TYPE to remove a type." msgstr "Выполните DROP TYPE для удаления типа." -#: commands/tablecmds.c:294 commands/tablecmds.c:15975 -#: commands/tablecmds.c:18676 +#: commands/tablecmds.c:294 commands/tablecmds.c:15986 +#: commands/tablecmds.c:18687 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "сторонняя таблица \"%s\" не существует" @@ -12143,80 +12176,80 @@ msgstr "сторонняя таблица \"%s\" не существует, пр msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Выполните DROP FOREIGN TABLE для удаления сторонней таблицы." -#: commands/tablecmds.c:802 +#: commands/tablecmds.c:803 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT можно использовать только для временных таблиц" -#: commands/tablecmds.c:819 +#: commands/tablecmds.c:820 #, c-format msgid "partitioned tables cannot be unlogged" msgstr "секционированные таблицы не могут быть нежурналируемыми" -#: commands/tablecmds.c:839 +#: commands/tablecmds.c:840 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "" "в рамках операции с ограничениями по безопасности нельзя создать временную " "таблицу" -#: commands/tablecmds.c:875 commands/tablecmds.c:17400 +#: commands/tablecmds.c:876 commands/tablecmds.c:17411 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "отношение \"%s\" наследуется неоднократно" -#: commands/tablecmds.c:1133 +#: commands/tablecmds.c:1134 #, c-format msgid "\"%s\" is not partitioned" msgstr "отношение \"%s\" не является секционированным" -#: commands/tablecmds.c:1227 +#: commands/tablecmds.c:1228 #, c-format msgid "cannot partition using more than %d columns" msgstr "число столбцов в ключе секционирования не может превышать %d" -#: commands/tablecmds.c:1283 +#: commands/tablecmds.c:1284 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "создать стороннюю секцию для секционированной таблицы \"%s\" нельзя" -#: commands/tablecmds.c:1285 +#: commands/tablecmds.c:1286 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Таблица \"%s\" содержит индексы, являющиеся уникальными." -#: commands/tablecmds.c:1415 commands/tablecmds.c:14952 +#: commands/tablecmds.c:1425 commands/tablecmds.c:14963 #, c-format msgid "too many array dimensions" msgstr "слишком много размерностей массива" -#: commands/tablecmds.c:1420 parser/parse_clause.c:772 -#: parser/parse_relation.c:1929 +#: commands/tablecmds.c:1430 parser/parse_clause.c:772 +#: parser/parse_relation.c:1961 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "столбец \"%s\" не может быть объявлен как SETOF" -#: commands/tablecmds.c:1549 +#: commands/tablecmds.c:1559 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY не поддерживает удаление нескольких объектов" -#: commands/tablecmds.c:1553 +#: commands/tablecmds.c:1563 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY не поддерживает режим CASCADE" -#: commands/tablecmds.c:1657 +#: commands/tablecmds.c:1667 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "удалить секционированный индекс \"%s\" параллельным способом нельзя" -#: commands/tablecmds.c:1945 +#: commands/tablecmds.c:1955 #, c-format msgid "cannot truncate only a partitioned table" msgstr "опустошить собственно секционированную таблицу нельзя" -#: commands/tablecmds.c:1946 +#: commands/tablecmds.c:1956 #, c-format msgid "" "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions " @@ -12225,39 +12258,39 @@ msgstr "" "Не указывайте ключевое слово ONLY или выполните TRUNCATE ONLY " "непосредственно для секций." -#: commands/tablecmds.c:2019 +#: commands/tablecmds.c:2029 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "опустошение распространяется на таблицу %s" -#: commands/tablecmds.c:2380 +#: commands/tablecmds.c:2390 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "опустошить стороннюю таблицу \"%s\" нельзя" -#: commands/tablecmds.c:2437 +#: commands/tablecmds.c:2447 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "временные таблицы других сеансов нельзя опустошить" -#: commands/tablecmds.c:2675 commands/tablecmds.c:17297 +#: commands/tablecmds.c:2685 commands/tablecmds.c:17308 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "наследование от секционированной таблицы \"%s\" не допускается" -#: commands/tablecmds.c:2680 +#: commands/tablecmds.c:2690 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "наследование от секции \"%s\" не допускается" -#: commands/tablecmds.c:2688 parser/parse_utilcmd.c:2699 -#: parser/parse_utilcmd.c:2887 +#: commands/tablecmds.c:2698 parser/parse_utilcmd.c:2703 +#: parser/parse_utilcmd.c:2896 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "" "наследуемое отношение \"%s\" не является таблицей или сторонней таблицей" -#: commands/tablecmds.c:2700 +#: commands/tablecmds.c:2710 #, c-format msgid "" "cannot create a temporary relation as partition of permanent relation \"%s\"" @@ -12265,25 +12298,25 @@ msgstr "" "создать временное отношение в качестве секции постоянного отношения \"%s\" " "нельзя" -#: commands/tablecmds.c:2709 commands/tablecmds.c:17276 +#: commands/tablecmds.c:2719 commands/tablecmds.c:17287 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "временное отношение \"%s\" не может наследоваться" -#: commands/tablecmds.c:2719 commands/tablecmds.c:17284 +#: commands/tablecmds.c:2729 commands/tablecmds.c:17295 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "наследование от временного отношения другого сеанса невозможно" -#: commands/tablecmds.c:2874 commands/tablecmds.c:2928 -#: commands/tablecmds.c:14635 parser/parse_utilcmd.c:1440 +#: commands/tablecmds.c:2884 commands/tablecmds.c:2938 +#: commands/tablecmds.c:14646 parser/parse_utilcmd.c:1440 #: parser/parse_utilcmd.c:1484 parser/parse_utilcmd.c:1916 #: parser/parse_utilcmd.c:2024 #, c-format msgid "cannot convert whole-row table reference" msgstr "преобразовать ссылку на тип всей строки таблицы нельзя" -#: commands/tablecmds.c:2875 parser/parse_utilcmd.c:1441 +#: commands/tablecmds.c:2885 parser/parse_utilcmd.c:1441 #, c-format msgid "" "Generation expression for column \"%s\" contains a whole-row reference to " @@ -12292,70 +12325,70 @@ msgstr "" "Генерирующее выражение столбца \"%s\" ссылается на тип всей строки в таблице " "\"%s\"." -#: commands/tablecmds.c:2929 parser/parse_utilcmd.c:1485 +#: commands/tablecmds.c:2939 parser/parse_utilcmd.c:1485 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Ограничение \"%s\" ссылается на тип всей строки в таблице \"%s\"." -#: commands/tablecmds.c:3051 commands/tablecmds.c:3345 +#: commands/tablecmds.c:3061 commands/tablecmds.c:3355 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "" "столбец \"%s\" наследуется от генерируемого столбца, но для него задано " "значение по умолчанию" -#: commands/tablecmds.c:3056 commands/tablecmds.c:3350 +#: commands/tablecmds.c:3066 commands/tablecmds.c:3360 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "" "столбец \"%s\" наследуется от генерируемого столбца, но для него задано " "свойство идентификации" -#: commands/tablecmds.c:3064 commands/tablecmds.c:3358 +#: commands/tablecmds.c:3074 commands/tablecmds.c:3368 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "для дочернего столбца \"%s\" указано генерирующее выражение" -#: commands/tablecmds.c:3066 commands/tablecmds.c:3360 +#: commands/tablecmds.c:3076 commands/tablecmds.c:3370 #, c-format msgid "A child table column cannot be generated unless its parent column is." msgstr "" "Дочерний столбец может быть генерируемым, только если родительский столбец " "является таковым." -#: commands/tablecmds.c:3072 commands/tablecmds.c:3366 -#: commands/tablecmds.c:17562 +#: commands/tablecmds.c:3082 commands/tablecmds.c:3376 +#: commands/tablecmds.c:17573 #, c-format msgid "column \"%s\" inherits from generated column of different kind" msgstr "столбец \"%s\" наследуется от генерируемого столбца другого вида" -#: commands/tablecmds.c:3074 commands/tablecmds.c:3368 -#: commands/tablecmds.c:17563 +#: commands/tablecmds.c:3084 commands/tablecmds.c:3378 +#: commands/tablecmds.c:17574 #, c-format msgid "Parent column is %s, child column is %s." msgstr "Родительский столбец: %s, дочерний столбец: %s." -#: commands/tablecmds.c:3121 +#: commands/tablecmds.c:3131 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "столбец \"%s\" наследует конфликтующие генерирующие выражения" -#: commands/tablecmds.c:3123 +#: commands/tablecmds.c:3133 #, c-format msgid "To resolve the conflict, specify a generation expression explicitly." msgstr "Для разрешения конфликта укажите генерирующее выражение явно." -#: commands/tablecmds.c:3127 +#: commands/tablecmds.c:3137 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "столбец \"%s\" наследует конфликтующие значения по умолчанию" -#: commands/tablecmds.c:3129 +#: commands/tablecmds.c:3139 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Для решения конфликта укажите желаемое значение по умолчанию." -#: commands/tablecmds.c:3196 +#: commands/tablecmds.c:3206 #, c-format msgid "" "check constraint name \"%s\" appears multiple times but with different " @@ -12364,132 +12397,132 @@ msgstr "" "имя ограничения-проверки \"%s\" фигурирует несколько раз, но с разными " "выражениями" -#: commands/tablecmds.c:3249 +#: commands/tablecmds.c:3259 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "слияние столбца \"%s\" с наследованным определением" -#: commands/tablecmds.c:3253 +#: commands/tablecmds.c:3263 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "перемещение и слияние столбца \"%s\" с наследуемым определением" -#: commands/tablecmds.c:3254 +#: commands/tablecmds.c:3264 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "" "Определённый пользователем столбец перемещён в позицию наследуемого столбца." -#: commands/tablecmds.c:3266 +#: commands/tablecmds.c:3276 #, c-format msgid "column \"%s\" has a type conflict" msgstr "конфликт типов в столбце \"%s\"" -#: commands/tablecmds.c:3268 commands/tablecmds.c:3302 -#: commands/tablecmds.c:3318 commands/tablecmds.c:3434 -#: commands/tablecmds.c:3462 commands/tablecmds.c:3478 -#: parser/parse_coerce.c:2190 parser/parse_coerce.c:2210 -#: parser/parse_coerce.c:2230 parser/parse_coerce.c:2251 -#: parser/parse_coerce.c:2306 parser/parse_coerce.c:2340 -#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 -#: parser/parse_coerce.c:2486 parser/parse_coerce.c:2553 +#: commands/tablecmds.c:3278 commands/tablecmds.c:3312 +#: commands/tablecmds.c:3328 commands/tablecmds.c:3444 +#: commands/tablecmds.c:3472 commands/tablecmds.c:3488 +#: parser/parse_coerce.c:2189 parser/parse_coerce.c:2209 +#: parser/parse_coerce.c:2229 parser/parse_coerce.c:2250 +#: parser/parse_coerce.c:2305 parser/parse_coerce.c:2339 +#: parser/parse_coerce.c:2415 parser/parse_coerce.c:2446 +#: parser/parse_coerce.c:2485 parser/parse_coerce.c:2552 #: parser/parse_param.c:224 #, c-format msgid "%s versus %s" msgstr "%s и %s" -#: commands/tablecmds.c:3280 +#: commands/tablecmds.c:3290 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "конфликт правил сортировки в столбце \"%s\"" -#: commands/tablecmds.c:3282 commands/tablecmds.c:3448 -#: commands/tablecmds.c:7277 parser/parse_expr.c:4792 +#: commands/tablecmds.c:3292 commands/tablecmds.c:3458 +#: commands/tablecmds.c:7287 parser/parse_expr.c:4802 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\" и \"%s\"" -#: commands/tablecmds.c:3300 +#: commands/tablecmds.c:3310 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "конфликт параметров хранения в столбце \"%s\"" -#: commands/tablecmds.c:3316 commands/tablecmds.c:3476 +#: commands/tablecmds.c:3326 commands/tablecmds.c:3486 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "в столбце \"%s\" возник конфликт методов сжатия" -#: commands/tablecmds.c:3420 +#: commands/tablecmds.c:3430 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "слияние нескольких наследованных определений столбца \"%s\"" -#: commands/tablecmds.c:3432 +#: commands/tablecmds.c:3442 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "конфликт типов в наследованном столбце \"%s\"" -#: commands/tablecmds.c:3446 +#: commands/tablecmds.c:3456 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "конфликт правил сортировки в наследованном столбце \"%s\"" -#: commands/tablecmds.c:3460 +#: commands/tablecmds.c:3470 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "конфликт параметров хранения в наследованном столбце \"%s\"" -#: commands/tablecmds.c:3488 +#: commands/tablecmds.c:3498 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "конфликт свойства генерирования в наследованном столбце \"%s\"" -#: commands/tablecmds.c:3719 +#: commands/tablecmds.c:3729 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "перемещать временные таблицы других сеансов нельзя" -#: commands/tablecmds.c:3792 +#: commands/tablecmds.c:3802 #, c-format msgid "cannot rename column of typed table" msgstr "переименовать столбец типизированной таблицы нельзя" -#: commands/tablecmds.c:3811 +#: commands/tablecmds.c:3821 #, c-format msgid "cannot rename columns of relation \"%s\"" msgstr "переименовывать столбцы отношения \"%s\" нельзя" -#: commands/tablecmds.c:3906 +#: commands/tablecmds.c:3916 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "" "наследованный столбец \"%s\" должен быть также переименован в дочерних " "таблицах" -#: commands/tablecmds.c:3938 +#: commands/tablecmds.c:3948 #, c-format msgid "cannot rename system column \"%s\"" msgstr "нельзя переименовать системный столбец \"%s\"" -#: commands/tablecmds.c:3953 +#: commands/tablecmds.c:3963 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "нельзя переименовать наследованный столбец \"%s\"" -#: commands/tablecmds.c:4108 +#: commands/tablecmds.c:4118 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "" "наследуемое ограничение \"%s\" должно быть также переименовано в дочерних " "таблицах" -#: commands/tablecmds.c:4115 +#: commands/tablecmds.c:4125 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "нельзя переименовать наследованное ограничение \"%s\"" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4415 +#: commands/tablecmds.c:4425 #, c-format msgid "" "cannot %s \"%s\" because it is being used by active queries in this session" @@ -12498,59 +12531,59 @@ msgstr "" "запросами в данном сеансе" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4424 +#: commands/tablecmds.c:4434 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "" "нельзя выполнить %s \"%s\", так как с этим объектом связаны отложенные " "события триггеров" -#: commands/tablecmds.c:4450 +#: commands/tablecmds.c:4460 #, c-format msgid "cannot alter temporary tables of other sessions" msgstr "модифицировать временные таблицы других сеансов нельзя" -#: commands/tablecmds.c:4914 +#: commands/tablecmds.c:4924 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "нельзя изменить секцию \"%s\", которая не полностью отсоединена" -#: commands/tablecmds.c:5143 +#: commands/tablecmds.c:5153 #, c-format msgid "cannot change persistence setting twice" msgstr "изменить характеристику хранения дважды нельзя" -#: commands/tablecmds.c:5160 +#: commands/tablecmds.c:5170 #, c-format msgid "cannot have multiple SET ACCESS METHOD subcommands" msgstr "множественные подкоманды SET ACCESS METHOD не допускаются" -#: commands/tablecmds.c:5894 +#: commands/tablecmds.c:5904 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "перезаписать системное отношение \"%s\" нельзя" -#: commands/tablecmds.c:5900 +#: commands/tablecmds.c:5910 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "перезаписать таблицу \"%s\", используемую как таблицу каталога, нельзя" -#: commands/tablecmds.c:5912 +#: commands/tablecmds.c:5922 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "перезаписывать временные таблицы других сеансов нельзя" -#: commands/tablecmds.c:6448 commands/tablecmds.c:6468 +#: commands/tablecmds.c:6458 commands/tablecmds.c:6478 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "столбец \"%s\" отношения \"%s\" содержит значения NULL" -#: commands/tablecmds.c:6485 +#: commands/tablecmds.c:6495 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "ограничение-проверку \"%s\" отношения \"%s\" нарушает некоторая строка" -#: commands/tablecmds.c:6505 partitioning/partbounds.c:3387 +#: commands/tablecmds.c:6515 partitioning/partbounds.c:3387 #, c-format msgid "" "updated partition constraint for default partition \"%s\" would be violated " @@ -12559,24 +12592,24 @@ msgstr "" "изменённое ограничение секции для секции по умолчанию \"%s\" будет нарушено " "некоторыми строками" -#: commands/tablecmds.c:6511 +#: commands/tablecmds.c:6521 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "ограничение секции отношения \"%s\" нарушает некоторая строка" #. translator: %s is a group of some SQL keywords -#: commands/tablecmds.c:6776 +#: commands/tablecmds.c:6786 #, c-format msgid "ALTER action %s cannot be performed on relation \"%s\"" msgstr "действие ALTER %s нельзя выполнить с отношением \"%s\"" -#: commands/tablecmds.c:7031 commands/tablecmds.c:7038 +#: commands/tablecmds.c:7041 commands/tablecmds.c:7048 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "" "изменить тип \"%s\" нельзя, так как он задействован в столбце \"%s.%s\"" -#: commands/tablecmds.c:7045 +#: commands/tablecmds.c:7055 #, c-format msgid "" "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" @@ -12584,30 +12617,30 @@ msgstr "" "изменить стороннюю таблицу \"%s\" нельзя, так как столбец \"%s.%s\" " "задействует тип её строки" -#: commands/tablecmds.c:7052 +#: commands/tablecmds.c:7062 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" "изменить таблицу \"%s\" нельзя, так как столбец \"%s.%s\" задействует тип её " "строки" -#: commands/tablecmds.c:7108 +#: commands/tablecmds.c:7118 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "изменить тип \"%s\", так как это тип типизированной таблицы" -#: commands/tablecmds.c:7110 +#: commands/tablecmds.c:7120 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "" "Чтобы изменить также типизированные таблицы, выполните ALTER ... CASCADE." -#: commands/tablecmds.c:7156 +#: commands/tablecmds.c:7166 #, c-format msgid "type %s is the row type of another table" msgstr "тип %s представляет тип строки другой таблицы" -#: commands/tablecmds.c:7158 +#: commands/tablecmds.c:7168 #, c-format msgid "" "A typed table must use a stand-alone composite type created with CREATE TYPE." @@ -12615,110 +12648,110 @@ msgstr "" "Для типизированной таблицы должен использоваться отдельный составной тип, " "созданный командой CREATE TYPE." -#: commands/tablecmds.c:7163 +#: commands/tablecmds.c:7173 #, c-format msgid "type %s is not a composite type" msgstr "тип %s не является составным" -#: commands/tablecmds.c:7190 +#: commands/tablecmds.c:7200 #, c-format msgid "cannot add column to typed table" msgstr "добавить столбец в типизированную таблицу нельзя" -#: commands/tablecmds.c:7240 +#: commands/tablecmds.c:7250 #, c-format msgid "cannot add column to a partition" msgstr "добавить столбец в секцию нельзя" -#: commands/tablecmds.c:7269 commands/tablecmds.c:17518 +#: commands/tablecmds.c:7279 commands/tablecmds.c:17529 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "дочерняя таблица \"%s\" имеет другой тип для столбца \"%s\"" -#: commands/tablecmds.c:7275 commands/tablecmds.c:17524 +#: commands/tablecmds.c:7285 commands/tablecmds.c:17535 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "" "дочерняя таблица \"%s\" имеет другое правило сортировки для столбца \"%s\"" -#: commands/tablecmds.c:7293 +#: commands/tablecmds.c:7303 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "объединение определений столбца \"%s\" для потомка \"%s\"" -#: commands/tablecmds.c:7346 +#: commands/tablecmds.c:7356 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "" "добавить столбец идентификации в таблицу, у которой есть дочерние, нельзя" -#: commands/tablecmds.c:7593 +#: commands/tablecmds.c:7603 #, c-format msgid "column must be added to child tables too" msgstr "столбец также должен быть добавлен к дочерним таблицам" -#: commands/tablecmds.c:7671 +#: commands/tablecmds.c:7681 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "столбец \"%s\" отношения \"%s\" уже существует, пропускается" -#: commands/tablecmds.c:7678 +#: commands/tablecmds.c:7688 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "столбец \"%s\" отношения \"%s\" уже существует" -#: commands/tablecmds.c:7769 commands/tablecmds.c:7936 -#: commands/tablecmds.c:8137 commands/tablecmds.c:8268 -#: commands/tablecmds.c:8422 commands/tablecmds.c:8516 -#: commands/tablecmds.c:8619 commands/tablecmds.c:8815 -#: commands/tablecmds.c:8981 commands/tablecmds.c:9072 -#: commands/tablecmds.c:9206 commands/tablecmds.c:14407 -#: commands/tablecmds.c:15998 commands/tablecmds.c:18765 +#: commands/tablecmds.c:7779 commands/tablecmds.c:7942 +#: commands/tablecmds.c:8143 commands/tablecmds.c:8274 +#: commands/tablecmds.c:8428 commands/tablecmds.c:8522 +#: commands/tablecmds.c:8625 commands/tablecmds.c:8816 +#: commands/tablecmds.c:8982 commands/tablecmds.c:9073 +#: commands/tablecmds.c:9207 commands/tablecmds.c:14418 +#: commands/tablecmds.c:16009 commands/tablecmds.c:18776 #, c-format msgid "cannot alter system column \"%s\"" msgstr "системный столбец \"%s\" нельзя изменить" -#: commands/tablecmds.c:7775 commands/tablecmds.c:8143 -#: commands/tablecmds.c:14168 +#: commands/tablecmds.c:7785 commands/tablecmds.c:8149 +#: commands/tablecmds.c:14179 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "столбец \"%s\" отношения \"%s\" является столбцом идентификации" -#: commands/tablecmds.c:7792 +#: commands/tablecmds.c:7802 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "столбец \"%s\" в родительской таблице помечен как NOT NULL" -#: commands/tablecmds.c:8014 commands/tablecmds.c:10013 +#: commands/tablecmds.c:8020 commands/tablecmds.c:10013 #, c-format msgid "constraint must be added to child tables too" msgstr "ограничение также должно быть добавлено к дочерним таблицам" -#: commands/tablecmds.c:8015 commands/tablecmds.c:8246 -#: commands/tablecmds.c:8378 commands/tablecmds.c:8495 -#: commands/tablecmds.c:9379 commands/tablecmds.c:12207 +#: commands/tablecmds.c:8021 commands/tablecmds.c:8252 +#: commands/tablecmds.c:8384 commands/tablecmds.c:8501 +#: commands/tablecmds.c:9380 commands/tablecmds.c:12207 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Не указывайте ключевое слово ONLY." -#: commands/tablecmds.c:8152 +#: commands/tablecmds.c:8158 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "столбец \"%s\" отношения \"%s\" является генерируемым" -#: commands/tablecmds.c:8245 +#: commands/tablecmds.c:8251 #, c-format msgid "cannot add identity to a column of only the partitioned table" msgstr "" "сделать столбцом идентификации столбец одной лишь секционированной таблицы " "нельзя" -#: commands/tablecmds.c:8251 +#: commands/tablecmds.c:8257 #, c-format msgid "cannot add identity to a column of a partition" msgstr "сделать столбцом идентификации столбец одной секции нельзя" -#: commands/tablecmds.c:8279 +#: commands/tablecmds.c:8285 #, c-format msgid "" "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity " @@ -12727,57 +12760,57 @@ msgstr "" "столбец \"%s\" отношения \"%s\" должен быть объявлен как NOT NULL, чтобы его " "можно было сделать столбцом идентификации" -#: commands/tablecmds.c:8310 +#: commands/tablecmds.c:8316 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "столбец \"%s\" отношения \"%s\" уже является столбцом идентификации" -#: commands/tablecmds.c:8316 +#: commands/tablecmds.c:8322 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "столбец \"%s\" отношения \"%s\" уже имеет значение по умолчанию" -#: commands/tablecmds.c:8377 +#: commands/tablecmds.c:8383 #, c-format msgid "cannot change identity column of only the partitioned table" msgstr "" "изменить столбец идентификации для одной лишь секционированной таблицы нельзя" -#: commands/tablecmds.c:8383 +#: commands/tablecmds.c:8389 #, c-format msgid "cannot change identity column of a partition" msgstr "изменить столбец идентификации для одной секции нельзя" -#: commands/tablecmds.c:8428 commands/tablecmds.c:8524 +#: commands/tablecmds.c:8434 commands/tablecmds.c:8530 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "столбец \"%s\" отношения \"%s\" не является столбцом идентификации" -#: commands/tablecmds.c:8494 +#: commands/tablecmds.c:8500 #, c-format msgid "cannot drop identity from a column of only the partitioned table" msgstr "" "лишить свойства идентификации столбец одной лишь секционированной таблицы " "нельзя" -#: commands/tablecmds.c:8500 +#: commands/tablecmds.c:8506 #, c-format msgid "cannot drop identity from a column of a partition" msgstr "лишить свойства идентификации столбец одной секции нельзя" -#: commands/tablecmds.c:8529 +#: commands/tablecmds.c:8535 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "" "столбец \"%s\" отношения \"%s\" не является столбцом идентификации, " "пропускается" -#: commands/tablecmds.c:8626 commands/tablecmds.c:8836 +#: commands/tablecmds.c:8632 commands/tablecmds.c:8837 #, c-format msgid "column \"%s\" of relation \"%s\" is not a generated column" msgstr "столбец \"%s\" отношения \"%s\" не является генерируемым столбцом" -#: commands/tablecmds.c:8637 +#: commands/tablecmds.c:8643 #, c-format msgid "" "ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns " @@ -12786,14 +12819,14 @@ msgstr "" "ALTER TABLE / SET EXPRESSION не поддерживается для виртуальных генерируемых " "столбцов в таблицах с ограничениями-проверками" -#: commands/tablecmds.c:8638 commands/tablecmds.c:8656 -#: commands/tablecmds.c:8828 +#: commands/tablecmds.c:8644 commands/tablecmds.c:8662 +#: commands/tablecmds.c:8829 #, c-format msgid "Column \"%s\" of relation \"%s\" is a virtual generated column." msgstr "" "Столбец \"%s\" отношения \"%s\" является виртуальным генерируемым столбцом." -#: commands/tablecmds.c:8655 +#: commands/tablecmds.c:8661 #, c-format msgid "" "ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns " @@ -12802,18 +12835,18 @@ msgstr "" "ALTER TABLE / SET EXPRESSION не поддерживается для виртуальных генерируемых " "столбцов в таблицах, включённых в публикацию" -#: commands/tablecmds.c:8762 +#: commands/tablecmds.c:8763 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "" "ALTER TABLE / DROP EXPRESSION нужно применять также к дочерним таблицам" -#: commands/tablecmds.c:8784 +#: commands/tablecmds.c:8785 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "нельзя удалить генерирующее выражение из наследуемого столбца" -#: commands/tablecmds.c:8827 +#: commands/tablecmds.c:8828 #, c-format msgid "" "ALTER TABLE / DROP EXPRESSION is not supported for virtual generated columns" @@ -12821,65 +12854,65 @@ msgstr "" "ALTER TABLE / DROP EXPRESSION не поддерживается для виртуальных генерируемых " "столбцов" -#: commands/tablecmds.c:8841 +#: commands/tablecmds.c:8842 #, c-format msgid "column \"%s\" of relation \"%s\" is not a generated column, skipping" msgstr "" "столбец \"%s\" отношения \"%s\" пропускается, так как не является " "генерируемым столбцом" -#: commands/tablecmds.c:8919 +#: commands/tablecmds.c:8920 #, c-format msgid "cannot refer to non-index column by number" msgstr "по номеру можно ссылаться только на столбец в индексе" -#: commands/tablecmds.c:8971 +#: commands/tablecmds.c:8972 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "столбец с номером %d отношения \"%s\" не существует" -#: commands/tablecmds.c:8991 +#: commands/tablecmds.c:8992 #, c-format msgid "cannot alter statistics on virtual generated column \"%s\"" msgstr "изменить статистику виртуального генерируемого столбца \"%s\" нельзя" -#: commands/tablecmds.c:9000 +#: commands/tablecmds.c:9001 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "изменить статистику включённого столбца \"%s\" индекса \"%s\" нельзя" -#: commands/tablecmds.c:9005 +#: commands/tablecmds.c:9006 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "" "изменить статистику столбца \"%s\" (не выражения) индекса \"%s\" нельзя" -#: commands/tablecmds.c:9007 +#: commands/tablecmds.c:9008 #, c-format msgid "Alter statistics on table column instead." msgstr "Вместо этого измените статистику для столбца в таблице." -#: commands/tablecmds.c:9253 +#: commands/tablecmds.c:9254 #, c-format msgid "cannot drop column from typed table" msgstr "нельзя удалить столбец в типизированной таблице" -#: commands/tablecmds.c:9317 +#: commands/tablecmds.c:9318 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "столбец \"%s\" в таблице\"%s\" не существует, пропускается" -#: commands/tablecmds.c:9330 +#: commands/tablecmds.c:9331 #, c-format msgid "cannot drop system column \"%s\"" msgstr "нельзя удалить системный столбец \"%s\"" -#: commands/tablecmds.c:9340 +#: commands/tablecmds.c:9341 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "нельзя удалить наследованный столбец \"%s\"" -#: commands/tablecmds.c:9353 +#: commands/tablecmds.c:9354 #, c-format msgid "" "cannot drop column \"%s\" because it is part of the partition key of " @@ -12888,7 +12921,7 @@ msgstr "" "удалить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:9378 +#: commands/tablecmds.c:9379 #, c-format msgid "" "cannot drop column from only the partitioned table when partitions exist" @@ -12896,18 +12929,18 @@ msgstr "" "удалить столбец только из секционированной таблицы, когда существуют секции, " "нельзя" -#: commands/tablecmds.c:9543 +#: commands/tablecmds.c:9544 #, c-format msgid "column \"%s\" of table \"%s\" is not marked NOT NULL" msgstr "столбец \"%s\" таблицы \"%s\" не помечен как NOT NULL" -#: commands/tablecmds.c:9579 commands/tablecmds.c:9591 +#: commands/tablecmds.c:9580 commands/tablecmds.c:9592 #, c-format msgid "cannot create primary key on column \"%s\"" msgstr "создать первичный ключ со столбцом \"%s\" нельзя" #. translator: fourth %s is a constraint characteristic such as NOT VALID -#: commands/tablecmds.c:9581 commands/tablecmds.c:9593 +#: commands/tablecmds.c:9582 commands/tablecmds.c:9594 #, c-format msgid "" "The constraint \"%s\" on column \"%s\" of table \"%s\", marked %s, is " @@ -12916,7 +12949,7 @@ msgstr "" "Ограничение \"%s\" для столбца \"%s\" таблицы \"%s\", помеченное %s, " "несовместимо с первичным ключом." -#: commands/tablecmds.c:9717 +#: commands/tablecmds.c:9718 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned " @@ -12925,7 +12958,7 @@ msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX не поддерживается с " "секционированными таблицами" -#: commands/tablecmds.c:9742 +#: commands/tablecmds.c:9743 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" @@ -13097,8 +13130,8 @@ msgstr "" msgid "constraint must be altered in child tables too" msgstr "ограничение должно быть изменено также и в дочерних таблицах" -#: commands/tablecmds.c:12235 commands/tablecmds.c:12932 -#: commands/tablecmds.c:14047 commands/tablecmds.c:14276 +#: commands/tablecmds.c:12235 commands/tablecmds.c:12940 +#: commands/tablecmds.c:14058 commands/tablecmds.c:14287 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "ограничение \"%s\" в таблице \"%s\" не существует" @@ -13119,87 +13152,95 @@ msgstr "" msgid "constraint \"%s\" of relation \"%s\" is not a not-null constraint" msgstr "ограничение \"%s\" в таблице \"%s\" не является ограничением NOT NULL" -#: commands/tablecmds.c:12261 +#: commands/tablecmds.c:12259 +#, c-format +msgid "" +"not-null constraint \"%s\" on partitioned table \"%s\" cannot be NO INHERIT" +msgstr "" +"ограничение NOT NULL \"%s\" для секционированной таблицы \"%s\" не может " +"иметь свойства NO INHERIT" + +#: commands/tablecmds.c:12267 #, c-format msgid "cannot alter inherited constraint \"%s\" on relation \"%s\"" msgstr "изменить наследуемое ограничение \"%s\" в отношении \"%s\" нельзя" -#: commands/tablecmds.c:12301 +#: commands/tablecmds.c:12307 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "изменить ограничение \"%s\" таблицы \"%s\" нельзя" -#: commands/tablecmds.c:12304 +#: commands/tablecmds.c:12310 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "" "Ограничение \"%s\" является производным от ограничения \"%s\" таблицы \"%s\"." -#: commands/tablecmds.c:12306 +#: commands/tablecmds.c:12312 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "Вместо этого вы можете изменить родительское ограничение." -#: commands/tablecmds.c:12941 +#: commands/tablecmds.c:12949 #, c-format msgid "cannot validate constraint \"%s\" of relation \"%s\"" msgstr "проверить ограничение \"%s\" отношения \"%s\" нельзя" -#: commands/tablecmds.c:12943 +#: commands/tablecmds.c:12951 #, c-format msgid "This operation is not supported for this type of constraint." msgstr "Эта операция не поддерживается для ограничений данного типа." -#: commands/tablecmds.c:12948 +#: commands/tablecmds.c:12956 #, c-format msgid "cannot validate NOT ENFORCED constraint" msgstr "проверить отношение NOT ENFORCED нельзя" -#: commands/tablecmds.c:13157 commands/tablecmds.c:13257 +#: commands/tablecmds.c:13168 commands/tablecmds.c:13268 #, c-format msgid "constraint must be validated on child tables too" msgstr "ограничение также должно соблюдаться в дочерних таблицах" -#: commands/tablecmds.c:13334 +#: commands/tablecmds.c:13345 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "столбец \"%s\", указанный в ограничении внешнего ключа, не существует" -#: commands/tablecmds.c:13340 +#: commands/tablecmds.c:13351 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "системные столбцы нельзя использовать во внешних ключах" -#: commands/tablecmds.c:13344 +#: commands/tablecmds.c:13355 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "во внешнем ключе не может быть больше %d столбцов" -#: commands/tablecmds.c:13412 +#: commands/tablecmds.c:13423 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "" "использовать откладываемый первичный ключ в целевой внешней таблице \"%s\" " "нельзя" -#: commands/tablecmds.c:13429 +#: commands/tablecmds.c:13440 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "в целевой внешней таблице \"%s\" нет первичного ключа" -#: commands/tablecmds.c:13502 +#: commands/tablecmds.c:13513 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "в списке столбцов внешнего ключа не должно быть повторений" -#: commands/tablecmds.c:13605 +#: commands/tablecmds.c:13616 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "" "использовать откладываемое ограничение уникальности в целевой внешней " "таблице \"%s\" нельзя" -#: commands/tablecmds.c:13610 +#: commands/tablecmds.c:13621 #, c-format msgid "" "there is no unique constraint matching given keys for referenced table \"%s\"" @@ -13207,42 +13248,42 @@ msgstr "" "в целевой внешней таблице \"%s\" нет ограничения уникальности, " "соответствующего данным ключам" -#: commands/tablecmds.c:14051 +#: commands/tablecmds.c:14062 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" в таблице \"%s\" не существует, пропускается" -#: commands/tablecmds.c:14096 +#: commands/tablecmds.c:14107 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "удалить наследованное ограничение \"%s\" таблицы \"%s\" нельзя" -#: commands/tablecmds.c:14148 +#: commands/tablecmds.c:14159 #, c-format msgid "column \"%s\" is in a primary key" msgstr "столбец \"%s\" входит в первичный ключ" -#: commands/tablecmds.c:14156 +#: commands/tablecmds.c:14167 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "столбец \"%s\" входит в индекс, используемый для идентификации реплики" -#: commands/tablecmds.c:14389 +#: commands/tablecmds.c:14400 #, c-format msgid "cannot alter column type of typed table" msgstr "изменить тип столбца в типизированной таблице нельзя" -#: commands/tablecmds.c:14417 +#: commands/tablecmds.c:14428 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "изменяя тип генерируемого столбца, нельзя указывать USING" -#: commands/tablecmds.c:14429 +#: commands/tablecmds.c:14440 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "изменить наследованный столбец \"%s\" нельзя" -#: commands/tablecmds.c:14438 +#: commands/tablecmds.c:14449 #, c-format msgid "" "cannot alter column \"%s\" because it is part of the partition key of " @@ -13251,7 +13292,7 @@ msgstr "" "изменить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:14493 +#: commands/tablecmds.c:14504 #, c-format msgid "" "result of USING clause for column \"%s\" cannot be cast automatically to " @@ -13259,45 +13300,45 @@ msgid "" msgstr "" "результат USING для столбца \"%s\" нельзя автоматически привести к типу %s" -#: commands/tablecmds.c:14496 +#: commands/tablecmds.c:14507 #, c-format msgid "You might need to add an explicit cast." msgstr "Возможно, необходимо добавить явное приведение." -#: commands/tablecmds.c:14500 +#: commands/tablecmds.c:14511 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "столбец \"%s\" нельзя автоматически привести к типу %s" # skip-rule: double-colons #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:14504 +#: commands/tablecmds.c:14515 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Возможно, необходимо указать \"USING %s::%s\"." -#: commands/tablecmds.c:14607 +#: commands/tablecmds.c:14618 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "изменить наследованный столбец \"%s\" отношения \"%s\" нельзя" -#: commands/tablecmds.c:14636 +#: commands/tablecmds.c:14647 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Выражение USING ссылается на тип всей строки таблицы." -#: commands/tablecmds.c:14647 +#: commands/tablecmds.c:14658 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "" "тип наследованного столбца \"%s\" должен быть изменён и в дочерних таблицах" -#: commands/tablecmds.c:14772 +#: commands/tablecmds.c:14783 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "нельзя изменить тип столбца \"%s\" дважды" -#: commands/tablecmds.c:14810 +#: commands/tablecmds.c:14821 #, c-format msgid "" "generation expression for column \"%s\" cannot be cast automatically to type " @@ -13306,160 +13347,160 @@ msgstr "" "генерирующее выражение для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:14815 +#: commands/tablecmds.c:14826 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "" "значение по умолчанию для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:15119 +#: commands/tablecmds.c:15130 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "изменить тип столбца, задействованного в функции или процедуре, нельзя" -#: commands/tablecmds.c:15120 commands/tablecmds.c:15135 -#: commands/tablecmds.c:15155 commands/tablecmds.c:15174 -#: commands/tablecmds.c:15233 +#: commands/tablecmds.c:15131 commands/tablecmds.c:15146 +#: commands/tablecmds.c:15166 commands/tablecmds.c:15185 +#: commands/tablecmds.c:15244 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s зависит от столбца \"%s\"" -#: commands/tablecmds.c:15134 +#: commands/tablecmds.c:15145 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "" "изменить тип столбца, задействованного в представлении или правиле, нельзя" -#: commands/tablecmds.c:15154 +#: commands/tablecmds.c:15165 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "изменить тип столбца, задействованного в определении триггера, нельзя" -#: commands/tablecmds.c:15173 +#: commands/tablecmds.c:15184 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "изменить тип столбца, задействованного в определении политики, нельзя" -#: commands/tablecmds.c:15204 +#: commands/tablecmds.c:15215 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "изменить тип столбца, задействованного в генерируемом столбце, нельзя" -#: commands/tablecmds.c:15205 +#: commands/tablecmds.c:15216 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Столбец \"%s\" используется генерируемым столбцом \"%s\"." -#: commands/tablecmds.c:15232 +#: commands/tablecmds.c:15243 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "" "изменить тип столбца, задействованного в заданном для публикации предложении " "WHERE, нельзя" -#: commands/tablecmds.c:16106 commands/tablecmds.c:16118 +#: commands/tablecmds.c:16117 commands/tablecmds.c:16129 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "сменить владельца индекса \"%s\" нельзя" -#: commands/tablecmds.c:16108 commands/tablecmds.c:16120 +#: commands/tablecmds.c:16119 commands/tablecmds.c:16131 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Однако возможно сменить владельца таблицы, содержащей этот индекс." -#: commands/tablecmds.c:16134 +#: commands/tablecmds.c:16145 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "сменить владельца последовательности \"%s\" нельзя" -#: commands/tablecmds.c:16159 +#: commands/tablecmds.c:16170 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "сменить владельца отношения \"%s\" нельзя" -#: commands/tablecmds.c:16626 +#: commands/tablecmds.c:16637 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одной инструкции не может быть несколько подкоманд SET TABLESPACE" -#: commands/tablecmds.c:16705 +#: commands/tablecmds.c:16716 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "задать параметры отношения \"%s\" нельзя" -#: commands/tablecmds.c:16739 commands/view.c:440 +#: commands/tablecmds.c:16750 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "" "WITH CHECK OPTION поддерживается только с автообновляемыми представлениями" -#: commands/tablecmds.c:16992 +#: commands/tablecmds.c:17003 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "" "в табличных пространствах есть только таблицы, индексы и материализованные " "представления" -#: commands/tablecmds.c:17004 +#: commands/tablecmds.c:17015 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "перемещать объекты в/из табличного пространства pg_global нельзя" -#: commands/tablecmds.c:17096 +#: commands/tablecmds.c:17107 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "" "обработка прерывается из-за невозможности заблокировать отношение \"%s.%s\"" -#: commands/tablecmds.c:17112 +#: commands/tablecmds.c:17123 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "в табличном пространстве \"%s\" не найдены подходящие отношения" -#: commands/tablecmds.c:17234 +#: commands/tablecmds.c:17245 #, c-format msgid "cannot change inheritance of typed table" msgstr "изменить наследование типизированной таблицы нельзя" -#: commands/tablecmds.c:17239 commands/tablecmds.c:17823 +#: commands/tablecmds.c:17250 commands/tablecmds.c:17834 #, c-format msgid "cannot change inheritance of a partition" msgstr "изменить наследование секции нельзя" -#: commands/tablecmds.c:17244 +#: commands/tablecmds.c:17255 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "изменить наследование секционированной таблицы нельзя" -#: commands/tablecmds.c:17291 +#: commands/tablecmds.c:17302 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "наследование для временного отношения другого сеанса невозможно" -#: commands/tablecmds.c:17304 +#: commands/tablecmds.c:17315 #, c-format msgid "cannot inherit from a partition" msgstr "наследование от секции невозможно" -#: commands/tablecmds.c:17326 commands/tablecmds.c:20347 +#: commands/tablecmds.c:17337 commands/tablecmds.c:20358 #, c-format msgid "circular inheritance not allowed" msgstr "циклическое наследование недопустимо" -#: commands/tablecmds.c:17327 commands/tablecmds.c:20348 +#: commands/tablecmds.c:17338 commands/tablecmds.c:20359 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" уже является потомком \"%s\"." -#: commands/tablecmds.c:17340 +#: commands/tablecmds.c:17351 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "" "триггер \"%s\" не позволяет таблице \"%s\" стать потомком в иерархии " "наследования" -#: commands/tablecmds.c:17342 +#: commands/tablecmds.c:17353 #, c-format msgid "" "ROW triggers with transition tables are not supported in inheritance " @@ -13468,35 +13509,35 @@ msgstr "" "Триггеры ROW с переходными таблицами не поддерживаются в иерархиях " "наследования." -#: commands/tablecmds.c:17543 commands/tablecmds.c:17792 +#: commands/tablecmds.c:17554 commands/tablecmds.c:17803 #, c-format msgid "column \"%s\" in child table \"%s\" must be marked NOT NULL" msgstr "" "столбец \"%s\" в дочерней таблице \"%s\" должен быть помечен как NOT NULL" -#: commands/tablecmds.c:17553 +#: commands/tablecmds.c:17564 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "столбец \"%s\" в дочерней таблице должен быть генерируемым" -#: commands/tablecmds.c:17557 +#: commands/tablecmds.c:17568 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "столбец \"%s\" в дочерней таблице должен быть не генерируемым" -#: commands/tablecmds.c:17603 +#: commands/tablecmds.c:17614 #, c-format msgid "child table is missing column \"%s\"" msgstr "в дочерней таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:17720 +#: commands/tablecmds.c:17731 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "" "дочерняя таблица \"%s\" содержит другое определение ограничения-проверки " "\"%s\"" -#: commands/tablecmds.c:17729 +#: commands/tablecmds.c:17740 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on child table " @@ -13505,7 +13546,7 @@ msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением дочерней таблицы " "\"%s\"" -#: commands/tablecmds.c:17740 +#: commands/tablecmds.c:17751 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" @@ -13513,7 +13554,7 @@ msgstr "" "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "дочерней таблицы \"%s\"" -#: commands/tablecmds.c:17751 +#: commands/tablecmds.c:17762 #, c-format msgid "" "constraint \"%s\" conflicts with NOT ENFORCED constraint on child table " @@ -13522,82 +13563,82 @@ msgstr "" "ограничение \"%s\" конфликтует с неконтролируемым (NOT ENFORCED) " "ограничением дочерней таблицы \"%s\"" -#: commands/tablecmds.c:17800 +#: commands/tablecmds.c:17811 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "в дочерней таблице не хватает ограничения \"%s\"" -#: commands/tablecmds.c:17887 +#: commands/tablecmds.c:17898 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "" "секция \"%s\" уже ожидает отсоединения от секционированной таблицы \"%s.%s\"" -#: commands/tablecmds.c:17916 commands/tablecmds.c:17964 +#: commands/tablecmds.c:17927 commands/tablecmds.c:17975 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "отношение \"%s\" не является секцией отношения \"%s\"" -#: commands/tablecmds.c:17970 +#: commands/tablecmds.c:17981 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "отношение \"%s\" не является предком отношения \"%s\"" -#: commands/tablecmds.c:18241 +#: commands/tablecmds.c:18252 #, c-format msgid "typed tables cannot inherit" msgstr "типизированные таблицы не могут наследоваться" -#: commands/tablecmds.c:18271 +#: commands/tablecmds.c:18282 #, c-format msgid "table is missing column \"%s\"" msgstr "в таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:18282 +#: commands/tablecmds.c:18293 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблица содержит столбец \"%s\", тогда как тип требует \"%s\"" -#: commands/tablecmds.c:18291 +#: commands/tablecmds.c:18302 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблица \"%s\" содержит столбец \"%s\" другого типа" -#: commands/tablecmds.c:18305 +#: commands/tablecmds.c:18316 #, c-format msgid "table has extra column \"%s\"" msgstr "таблица содержит лишний столбец \"%s\"" -#: commands/tablecmds.c:18357 +#: commands/tablecmds.c:18368 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - это не типизированная таблица" -#: commands/tablecmds.c:18537 +#: commands/tablecmds.c:18548 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать неуникальный индекс \"%s\"" -#: commands/tablecmds.c:18543 +#: commands/tablecmds.c:18554 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать не непосредственный индекс " "\"%s\"" -#: commands/tablecmds.c:18549 +#: commands/tablecmds.c:18560 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать индекс с выражением \"%s\"" -#: commands/tablecmds.c:18555 +#: commands/tablecmds.c:18566 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "для идентификации реплики нельзя использовать частичный индекс \"%s\"" -#: commands/tablecmds.c:18572 +#: commands/tablecmds.c:18583 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column %d is a " @@ -13606,7 +13647,7 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "%d - системный" -#: commands/tablecmds.c:18579 +#: commands/tablecmds.c:18590 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column \"%s\" is " @@ -13615,13 +13656,13 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "\"%s\" допускает NULL" -#: commands/tablecmds.c:18828 +#: commands/tablecmds.c:18839 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "" "изменить состояние журналирования таблицы %s нельзя, так как она временная" -#: commands/tablecmds.c:18852 +#: commands/tablecmds.c:18863 #, c-format msgid "" "cannot change table \"%s\" to unlogged because it is part of a publication" @@ -13629,12 +13670,12 @@ msgstr "" "таблицу \"%s\" нельзя сделать нежурналируемой, так как она включена в " "публикацию" -#: commands/tablecmds.c:18854 +#: commands/tablecmds.c:18865 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Нежурналируемые отношения не поддерживают репликацию." -#: commands/tablecmds.c:18899 +#: commands/tablecmds.c:18910 #, c-format msgid "" "could not change table \"%s\" to logged because it references unlogged table " @@ -13643,7 +13684,7 @@ msgstr "" "не удалось сделать таблицу \"%s\" журналируемой, так как она ссылается на " "нежурналируемую таблицу \"%s\"" -#: commands/tablecmds.c:18909 +#: commands/tablecmds.c:18920 #, c-format msgid "" "could not change table \"%s\" to unlogged because it references logged table " @@ -13652,91 +13693,91 @@ msgstr "" "не удалось сделать таблицу \"%s\" нежурналируемой, так как она ссылается на " "журналируемую таблицу \"%s\"" -#: commands/tablecmds.c:18973 +#: commands/tablecmds.c:18984 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "переместить последовательность с владельцем в другую схему нельзя" -#: commands/tablecmds.c:19081 +#: commands/tablecmds.c:19092 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "отношение \"%s\" уже существует в схеме \"%s\"" -#: commands/tablecmds.c:19506 +#: commands/tablecmds.c:19517 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" - это не таблица и не материализованное представление" -#: commands/tablecmds.c:19659 +#: commands/tablecmds.c:19670 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - это не составной тип" -#: commands/tablecmds.c:19689 +#: commands/tablecmds.c:19700 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "сменить схему индекса \"%s\" нельзя" -#: commands/tablecmds.c:19691 commands/tablecmds.c:19705 +#: commands/tablecmds.c:19702 commands/tablecmds.c:19716 #, c-format msgid "Change the schema of the table instead." msgstr "Однако возможно сменить владельца таблицы." -#: commands/tablecmds.c:19695 +#: commands/tablecmds.c:19706 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "сменить схему составного типа \"%s\" нельзя" -#: commands/tablecmds.c:19703 +#: commands/tablecmds.c:19714 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "сменить схему TOAST-таблицы \"%s\" нельзя" -#: commands/tablecmds.c:19735 +#: commands/tablecmds.c:19746 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "стратегия секционирования по списку не поддерживает несколько столбцов" -#: commands/tablecmds.c:19801 +#: commands/tablecmds.c:19812 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "столбец \"%s\", упомянутый в ключе секционирования, не существует" -#: commands/tablecmds.c:19809 +#: commands/tablecmds.c:19820 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "системный столбец \"%s\" нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:19823 commands/tablecmds.c:19905 +#: commands/tablecmds.c:19834 commands/tablecmds.c:19916 #, c-format msgid "cannot use generated column in partition key" msgstr "генерируемый столбец нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:19892 +#: commands/tablecmds.c:19903 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "" "выражения ключей секционирования не могут содержать ссылки на системный " "столбец" -#: commands/tablecmds.c:19956 +#: commands/tablecmds.c:19967 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "" "функции в выражении ключа секционирования должны быть помечены как IMMUTABLE" -#: commands/tablecmds.c:19965 +#: commands/tablecmds.c:19976 #, c-format msgid "cannot use constant expression as partition key" msgstr "" "в качестве ключа секционирования нельзя использовать константное выражение" -#: commands/tablecmds.c:19986 +#: commands/tablecmds.c:19997 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не удалось определить правило сортировки для выражения секционирования" -#: commands/tablecmds.c:20021 +#: commands/tablecmds.c:20032 #, c-format msgid "" "You must specify a hash operator class or define a default hash operator " @@ -13745,7 +13786,7 @@ msgstr "" "Вы должны указать класс операторов хеширования или определить класс " "операторов хеширования по умолчанию для этого типа данных." -#: commands/tablecmds.c:20027 +#: commands/tablecmds.c:20038 #, c-format msgid "" "You must specify a btree operator class or define a default btree operator " @@ -13754,27 +13795,27 @@ msgstr "" "Вы должны указать класс операторов B-дерева или определить класс операторов " "B-дерева по умолчанию для этого типа данных." -#: commands/tablecmds.c:20287 +#: commands/tablecmds.c:20298 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" уже является секцией" -#: commands/tablecmds.c:20293 +#: commands/tablecmds.c:20304 #, c-format msgid "cannot attach a typed table as partition" msgstr "подключить типизированную таблицу в качестве секции нельзя" -#: commands/tablecmds.c:20309 +#: commands/tablecmds.c:20320 #, c-format msgid "cannot attach inheritance child as partition" msgstr "подключить потомок в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:20323 +#: commands/tablecmds.c:20334 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "подключить родитель в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:20357 +#: commands/tablecmds.c:20368 #, c-format msgid "" "cannot attach a temporary relation as partition of permanent relation \"%s\"" @@ -13782,7 +13823,7 @@ msgstr "" "подключить временное отношение в качестве секции постоянного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:20365 +#: commands/tablecmds.c:20376 #, c-format msgid "" "cannot attach a permanent relation as partition of temporary relation \"%s\"" @@ -13790,102 +13831,102 @@ msgstr "" "подключить постоянное отношение в качестве секции временного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:20373 +#: commands/tablecmds.c:20384 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "подключить секцию к временному отношению в другом сеансе нельзя" -#: commands/tablecmds.c:20380 +#: commands/tablecmds.c:20391 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "" "подключить временное отношение из другого сеанса в качестве секции нельзя" -#: commands/tablecmds.c:20400 +#: commands/tablecmds.c:20411 #, c-format msgid "table \"%s\" being attached contains an identity column \"%s\"" msgstr "присоединяемая таблица \"%s\" содержит столбец идентификации \"%s\"" -#: commands/tablecmds.c:20402 +#: commands/tablecmds.c:20413 #, c-format msgid "The new partition may not contain an identity column." msgstr "Новая секция не может содержать столбец идентификации." -#: commands/tablecmds.c:20410 +#: commands/tablecmds.c:20421 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "" "таблица \"%s\" содержит столбец \"%s\", отсутствующий в родителе \"%s\"" -#: commands/tablecmds.c:20413 +#: commands/tablecmds.c:20424 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "" "Новая секция может содержать только столбцы, имеющиеся в родительской " "таблице." -#: commands/tablecmds.c:20425 +#: commands/tablecmds.c:20436 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "триггер \"%s\" не позволяет сделать таблицу \"%s\" секцией" -#: commands/tablecmds.c:20427 +#: commands/tablecmds.c:20438 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "Триггеры ROW с переходными таблицами для секций не поддерживаются." -#: commands/tablecmds.c:20609 +#: commands/tablecmds.c:20620 #, c-format msgid "" "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "" "нельзя присоединить стороннюю таблицу \"%s\" в качестве секции таблицы \"%s\"" -#: commands/tablecmds.c:20612 +#: commands/tablecmds.c:20623 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Секционированная таблица \"%s\" содержит уникальные индексы." -#: commands/tablecmds.c:20936 +#: commands/tablecmds.c:20947 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "" "секции нельзя отсоединять в режиме CONCURRENTLY, когда существует секция по " "умолчанию" -#: commands/tablecmds.c:21048 +#: commands/tablecmds.c:21059 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "секционированная таблица \"%s\" была параллельно удалена" -#: commands/tablecmds.c:21054 +#: commands/tablecmds.c:21065 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "секция \"%s\" была параллельно удалена" -#: commands/tablecmds.c:21685 commands/tablecmds.c:21705 -#: commands/tablecmds.c:21726 commands/tablecmds.c:21745 -#: commands/tablecmds.c:21794 +#: commands/tablecmds.c:21699 commands/tablecmds.c:21719 +#: commands/tablecmds.c:21740 commands/tablecmds.c:21759 +#: commands/tablecmds.c:21816 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "нельзя присоединить индекс \"%s\" в качестве секции индекса \"%s\"" -#: commands/tablecmds.c:21688 +#: commands/tablecmds.c:21702 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Индекс \"%s\" уже присоединён к другому индексу." -#: commands/tablecmds.c:21708 +#: commands/tablecmds.c:21722 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Индекс \"%s\" не является индексом какой-либо секции таблицы \"%s\"." -#: commands/tablecmds.c:21729 +#: commands/tablecmds.c:21743 #, c-format msgid "The index definitions do not match." msgstr "Определения индексов не совпадают." -#: commands/tablecmds.c:21748 +#: commands/tablecmds.c:21762 #, c-format msgid "" "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint " @@ -13894,37 +13935,37 @@ msgstr "" "Индекс \"%s\" принадлежит ограничению в таблице \"%s\", но для индекса " "\"%s\" ограничения нет." -#: commands/tablecmds.c:21797 +#: commands/tablecmds.c:21819 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "К секции \"%s\" уже присоединён другой индекс." -#: commands/tablecmds.c:21920 +#: commands/tablecmds.c:21942 #, c-format msgid "invalid primary key definition" msgstr "неверная определение первичного ключа" -#: commands/tablecmds.c:21921 +#: commands/tablecmds.c:21943 #, c-format msgid "Column \"%s\" of relation \"%s\" is not marked NOT NULL." msgstr "Столбец \"%s\" отношения \"%s\" не имеет свойства NOT NULL." -#: commands/tablecmds.c:22056 +#: commands/tablecmds.c:22078 #, c-format msgid "column data type %s does not support compression" msgstr "тим данных столбца %s не поддерживает сжатие" -#: commands/tablecmds.c:22063 +#: commands/tablecmds.c:22085 #, c-format msgid "invalid compression method \"%s\"" msgstr "неверный метод сжатия \"%s\"" -#: commands/tablecmds.c:22089 +#: commands/tablecmds.c:22111 #, c-format msgid "invalid storage type \"%s\"" msgstr "неверный тип хранилища \"%s\"" -#: commands/tablecmds.c:22099 +#: commands/tablecmds.c:22121 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип данных столбца %s совместим только с хранилищем PLAIN" @@ -14326,9 +14367,9 @@ msgid "cannot collect transition tuples from child foreign tables" msgstr "собрать переходные кортежи из дочерних сторонних таблиц нельзя" #: commands/trigger.c:3402 executor/nodeModifyTable.c:1687 -#: executor/nodeModifyTable.c:1761 executor/nodeModifyTable.c:2569 -#: executor/nodeModifyTable.c:2659 executor/nodeModifyTable.c:3322 -#: executor/nodeModifyTable.c:3514 +#: executor/nodeModifyTable.c:1761 executor/nodeModifyTable.c:2588 +#: executor/nodeModifyTable.c:2678 executor/nodeModifyTable.c:3341 +#: executor/nodeModifyTable.c:3538 #, c-format msgid "" "Consider using an AFTER trigger instead of a BEFORE trigger to propagate " @@ -14339,15 +14380,15 @@ msgstr "" #: commands/trigger.c:3444 executor/nodeLockRows.c:228 #: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:389 -#: executor/nodeModifyTable.c:1703 executor/nodeModifyTable.c:2585 -#: executor/nodeModifyTable.c:2810 +#: executor/nodeModifyTable.c:1703 executor/nodeModifyTable.c:2604 +#: executor/nodeModifyTable.c:2829 executor/nodeModifyTable.c:3379 #, c-format msgid "could not serialize access due to concurrent update" msgstr "не удалось сериализовать доступ из-за параллельного изменения" #: commands/trigger.c:3452 executor/nodeModifyTable.c:1793 -#: executor/nodeModifyTable.c:2676 executor/nodeModifyTable.c:2826 -#: executor/nodeModifyTable.c:3340 +#: executor/nodeModifyTable.c:2695 executor/nodeModifyTable.c:2845 +#: executor/nodeModifyTable.c:3359 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "не удалось сериализовать доступ из-за параллельного удаления" @@ -14479,7 +14520,7 @@ msgstr "" "Создайте тип в виде оболочки, затем определите для него функции ввода-вывода " "и в завершение выполните полноценную команду CREATE TYPE." -#: commands/typecmds.c:331 commands/typecmds.c:1494 commands/typecmds.c:4479 +#: commands/typecmds.c:331 commands/typecmds.c:1501 commands/typecmds.c:4486 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "атрибут типа \"%s\" не распознан" @@ -14499,7 +14540,7 @@ msgstr "типом элемента массива не может быть %s" msgid "alignment \"%s\" not recognized" msgstr "тип выравнивания \"%s\" не распознан" -#: commands/typecmds.c:454 commands/typecmds.c:4353 +#: commands/typecmds.c:454 commands/typecmds.c:4360 #, c-format msgid "storage \"%s\" not recognized" msgstr "неизвестная стратегия хранения \"%s\"" @@ -14598,36 +14639,36 @@ msgstr "" "возможность определения контролируемости ограничения для доменов не " "поддерживается" -#: commands/typecmds.c:1361 utils/cache/typcache.c:2757 +#: commands/typecmds.c:1361 utils/cache/typcache.c:2750 #, c-format msgid "%s is not an enum" msgstr "\"%s\" не является перечислением" -#: commands/typecmds.c:1502 +#: commands/typecmds.c:1509 #, c-format msgid "type attribute \"subtype\" is required" msgstr "требуется атрибут типа \"subtype\"" -#: commands/typecmds.c:1507 +#: commands/typecmds.c:1514 #, c-format msgid "range subtype cannot be %s" msgstr "%s не может быть подтипом диапазона" -#: commands/typecmds.c:1526 +#: commands/typecmds.c:1533 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "" "указано правило сортировки для диапазона, но подтип не поддерживает " "сортировку" -#: commands/typecmds.c:1536 +#: commands/typecmds.c:1543 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "" "функцию получения канонического диапазона нельзя задать без предварительно " "созданного типа-пустышки" -#: commands/typecmds.c:1537 +#: commands/typecmds.c:1544 #, c-format msgid "" "Create the type as a shell type, then create its canonicalization function, " @@ -14636,96 +14677,96 @@ msgstr "" "Создайте тип в виде оболочки, затем определите для него функции приведения к " "каноническому виду и в завершение выполните полноценную команду CREATE TYPE." -#: commands/typecmds.c:2013 +#: commands/typecmds.c:2020 #, c-format msgid "type input function %s has multiple matches" msgstr "функция ввода типа %s присутствует в нескольких экземплярах" -#: commands/typecmds.c:2031 +#: commands/typecmds.c:2038 #, c-format msgid "type input function %s must return type %s" msgstr "функция ввода типа %s должна возвращать тип %s" -#: commands/typecmds.c:2047 +#: commands/typecmds.c:2054 #, c-format msgid "type input function %s should not be volatile" msgstr "функция ввода типа %s не должна быть изменчивой" -#: commands/typecmds.c:2075 +#: commands/typecmds.c:2082 #, c-format msgid "type output function %s must return type %s" msgstr "функция вывода типа %s должна возвращать тип %s" -#: commands/typecmds.c:2082 +#: commands/typecmds.c:2089 #, c-format msgid "type output function %s should not be volatile" msgstr "функция вывода типа %s не должна быть изменчивой" -#: commands/typecmds.c:2111 +#: commands/typecmds.c:2118 #, c-format msgid "type receive function %s has multiple matches" msgstr "функция получения типа %s присутствует в нескольких экземплярах" -#: commands/typecmds.c:2129 +#: commands/typecmds.c:2136 #, c-format msgid "type receive function %s must return type %s" msgstr "функция получения типа %s должна возвращать тип %s" -#: commands/typecmds.c:2136 +#: commands/typecmds.c:2143 #, c-format msgid "type receive function %s should not be volatile" msgstr "функция получения типа %s не должна быть изменчивой" -#: commands/typecmds.c:2164 +#: commands/typecmds.c:2171 #, c-format msgid "type send function %s must return type %s" msgstr "функция отправки типа %s должна возвращать тип %s" -#: commands/typecmds.c:2171 +#: commands/typecmds.c:2178 #, c-format msgid "type send function %s should not be volatile" msgstr "функция отправки типа %s не должна быть изменчивой" -#: commands/typecmds.c:2198 +#: commands/typecmds.c:2205 #, c-format msgid "typmod_in function %s must return type %s" msgstr "функция TYPMOD_IN %s должна возвращать тип %s" -#: commands/typecmds.c:2205 +#: commands/typecmds.c:2212 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "функция ввода модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:2232 +#: commands/typecmds.c:2239 #, c-format msgid "typmod_out function %s must return type %s" msgstr "функция TYPMOD_OUT %s должна возвращать тип %s" -#: commands/typecmds.c:2239 +#: commands/typecmds.c:2246 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "функция вывода модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:2266 +#: commands/typecmds.c:2273 #, c-format msgid "type analyze function %s must return type %s" msgstr "функция анализа типа %s должна возвращать тип %s" -#: commands/typecmds.c:2295 +#: commands/typecmds.c:2302 #, c-format msgid "type subscripting function %s must return type %s" msgstr "" "функция %s, реализующая для типа обращение по индексу, должна возвращать тип " "%s" -#: commands/typecmds.c:2305 +#: commands/typecmds.c:2312 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "" "для пользовательских типов нельзя использовать функцию-обработчик обращения " "по индексу %s" -#: commands/typecmds.c:2351 +#: commands/typecmds.c:2358 #, c-format msgid "" "You must specify an operator class for the range type or define a default " @@ -14734,141 +14775,141 @@ msgstr "" "Вы должны указать класс операторов для типа диапазона или определить класс " "операторов по умолчанию для этого подтипа." -#: commands/typecmds.c:2382 +#: commands/typecmds.c:2389 #, c-format msgid "range canonical function %s must return range type" msgstr "" "функция получения канонического диапазона %s должна возвращать диапазон" -#: commands/typecmds.c:2388 +#: commands/typecmds.c:2395 #, c-format msgid "range canonical function %s must be immutable" msgstr "" "функция получения канонического диапазона %s должна быть постоянной " "(IMMUTABLE)" -#: commands/typecmds.c:2424 +#: commands/typecmds.c:2431 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "функция различий для подтипа диапазона (%s) должна возвращать тип %s" -#: commands/typecmds.c:2431 +#: commands/typecmds.c:2438 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "" "функция различий для подтипа диапазона (%s) должна быть постоянной " "(IMMUTABLE)" -#: commands/typecmds.c:2458 +#: commands/typecmds.c:2465 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "значение OID массива в pg_type не задано в режиме двоичного обновления" -#: commands/typecmds.c:2491 +#: commands/typecmds.c:2498 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "" "значение OID мультидиапазона в pg_type не задано в режиме двоичного " "обновления" -#: commands/typecmds.c:2524 +#: commands/typecmds.c:2531 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "" "значение OID массива мультидиапазонов в pg_type не задано в режиме двоичного " "обновления" -#: commands/typecmds.c:2906 commands/typecmds.c:3088 +#: commands/typecmds.c:2913 commands/typecmds.c:3095 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "ограничение \"%s\" для домена \"%s\" не существует" -#: commands/typecmds.c:2910 +#: commands/typecmds.c:2917 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" для домена \"%s\" не существует, пропускается" -#: commands/typecmds.c:3095 +#: commands/typecmds.c:3102 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "" "ограничение \"%s\" для домена \"%s\" не является ограничением-проверкой" -#: commands/typecmds.c:3175 +#: commands/typecmds.c:3182 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "столбец \"%s\" таблицы \"%s\" содержит значения NULL" -#: commands/typecmds.c:3264 +#: commands/typecmds.c:3271 #, c-format msgid "" "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "" "столбец \"%s\" таблицы \"%s\" содержит значения, нарушающие новое ограничение" -#: commands/typecmds.c:3493 commands/typecmds.c:3771 commands/typecmds.c:3856 -#: commands/typecmds.c:4072 +#: commands/typecmds.c:3500 commands/typecmds.c:3778 commands/typecmds.c:3863 +#: commands/typecmds.c:4079 #, c-format msgid "%s is not a domain" msgstr "\"%s\" - это не домен" -#: commands/typecmds.c:3527 commands/typecmds.c:3683 +#: commands/typecmds.c:3534 commands/typecmds.c:3690 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ограничение \"%s\" для домена \"%s\" уже существует" -#: commands/typecmds.c:3578 +#: commands/typecmds.c:3585 #, c-format msgid "cannot use table references in domain check constraint" msgstr "в ограничении-проверке для домена нельзя ссылаться на таблицы" -#: commands/typecmds.c:3783 commands/typecmds.c:3868 commands/typecmds.c:4222 +#: commands/typecmds.c:3790 commands/typecmds.c:3875 commands/typecmds.c:4229 #, c-format msgid "%s is a table's row type" msgstr "%s - это тип строк таблицы" -#: commands/typecmds.c:3793 commands/typecmds.c:3878 commands/typecmds.c:4120 +#: commands/typecmds.c:3800 commands/typecmds.c:3885 commands/typecmds.c:4127 #, c-format msgid "cannot alter array type %s" msgstr "изменить тип массива \"%s\" нельзя" -#: commands/typecmds.c:3795 commands/typecmds.c:3880 commands/typecmds.c:4122 +#: commands/typecmds.c:3802 commands/typecmds.c:3887 commands/typecmds.c:4129 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Однако можно изменить тип %s, что повлечёт изменение типа массива." -#: commands/typecmds.c:3891 +#: commands/typecmds.c:3898 #, c-format msgid "cannot alter multirange type %s" msgstr "изменить мультидиапазонный тип %s нельзя" -#: commands/typecmds.c:3894 +#: commands/typecmds.c:3901 #, c-format msgid "You can alter type %s, which will alter the multirange type as well." msgstr "" "Однако можно изменить тип %s, что повлечёт изменение мультидиапазонного типа." -#: commands/typecmds.c:4201 +#: commands/typecmds.c:4208 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "тип \"%s\" уже существует в схеме \"%s\"" -#: commands/typecmds.c:4381 +#: commands/typecmds.c:4388 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "сменить вариант хранения типа на PLAIN нельзя" -#: commands/typecmds.c:4474 +#: commands/typecmds.c:4481 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "у типа нельзя изменить атрибут \"%s\"" -#: commands/typecmds.c:4492 +#: commands/typecmds.c:4499 #, c-format msgid "must be superuser to alter a type" msgstr "для модификации типа нужно быть суперпользователем" -#: commands/typecmds.c:4513 commands/typecmds.c:4522 +#: commands/typecmds.c:4520 commands/typecmds.c:4529 #, c-format msgid "%s is not a base type" msgstr "%s — не базовый тип" @@ -15338,7 +15379,7 @@ msgstr "VACUUM ONLY для секционированной таблицы \"%s\ msgid "cutoff for removing and freezing tuples is far in the past" msgstr "момент отсечки для удаления и замораживания кортежей далеко в прошлом" -#: commands/vacuum.c:1184 commands/vacuum.c:1189 +#: commands/vacuum.c:1184 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -15355,6 +15396,17 @@ msgstr "" msgid "cutoff for freezing multixacts is far in the past" msgstr "момент отсечки для замораживания мультитранзакций далеко в прошлом" +#: commands/vacuum.c:1189 +#, c-format +msgid "" +"Close open transactions soon to avoid wraparound problems.\n" +"You might also need to commit or roll back old prepared transactions." +msgstr "" +"Завершите открытые транзакции как можно быстрее во избежание проблемы " +"зацикливания.\n" +"Возможно, вам также придётся зафиксировать или откатить старые " +"подготовленные транзакции." + #: commands/vacuum.c:1950 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" @@ -15654,7 +15706,7 @@ msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "" "для курсора \"%s\" не выполняется обновляемое сканирование таблицы \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:3093 +#: executor/execCurrent.c:280 executor/execExprInterp.c:3101 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -15662,14 +15714,14 @@ msgstr "" "тип параметра %d (%s) не соответствует тому, с которым подготавливался план " "(%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:3105 +#: executor/execCurrent.c:292 executor/execExprInterp.c:3113 #, c-format msgid "no value found for parameter %d" msgstr "не найдено значение параметра %d" #: executor/execExpr.c:667 executor/execExpr.c:674 executor/execExpr.c:680 -#: executor/execExprInterp.c:5439 executor/execExprInterp.c:5456 -#: executor/execExprInterp.c:5555 executor/nodeModifyTable.c:211 +#: executor/execExprInterp.c:5510 executor/execExprInterp.c:5527 +#: executor/execExprInterp.c:5626 executor/nodeModifyTable.c:211 #: executor/nodeModifyTable.c:230 executor/nodeModifyTable.c:247 #: executor/nodeModifyTable.c:257 executor/nodeModifyTable.c:267 #, c-format @@ -15687,7 +15739,7 @@ msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "" "Запрос выдаёт значение для удалённого столбца (с порядковым номером %d)." -#: executor/execExpr.c:681 executor/execExprInterp.c:5457 +#: executor/execExpr.c:681 executor/execExprInterp.c:5528 #: executor/nodeModifyTable.c:258 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." @@ -15738,41 +15790,41 @@ msgstr "" msgid "type %s does not support subscripted assignment" msgstr "тип %s не поддерживает изменение элемента по индексу" -#: executor/execExprInterp.c:2415 +#: executor/execExprInterp.c:2423 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "атрибут %d типа %s был удалён" -#: executor/execExprInterp.c:2421 +#: executor/execExprInterp.c:2429 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "атрибут %d типа %s имеет неправильный тип" -#: executor/execExprInterp.c:2423 executor/execExprInterp.c:3782 -#: executor/execExprInterp.c:3828 +#: executor/execExprInterp.c:2431 executor/execExprInterp.c:3790 +#: executor/execExprInterp.c:3836 #, c-format msgid "Table has type %s, but query expects %s." msgstr "В таблице задан тип %s, а в запросе ожидается %s." -#: executor/execExprInterp.c:2503 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1841 -#: utils/cache/typcache.c:2000 utils/cache/typcache.c:2147 +#: executor/execExprInterp.c:2511 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1834 +#: utils/cache/typcache.c:1993 utils/cache/typcache.c:2140 #: utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" msgstr "тип %s не является составным" -#: executor/execExprInterp.c:3266 +#: executor/execExprInterp.c:3274 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF для таблиц такого типа не поддерживается" -#: executor/execExprInterp.c:3479 +#: executor/execExprInterp.c:3487 #, c-format msgid "cannot merge incompatible arrays" msgstr "не удалось объединить несовместимые массивы" -#: executor/execExprInterp.c:3480 +#: executor/execExprInterp.c:3488 #, c-format msgid "" "Array with element type %s cannot be included in ARRAY construct with " @@ -15781,15 +15833,15 @@ msgstr "" "Массив с типом элементов %s нельзя включить в конструкцию ARRAY с типом " "элементов %s." -#: executor/execExprInterp.c:3501 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3515 utils/adt/arrayfuncs.c:5611 -#: utils/adt/arrayfuncs.c:6130 utils/adt/arraysubs.c:151 +#: executor/execExprInterp.c:3509 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3515 utils/adt/arrayfuncs.c:5620 +#: utils/adt/arrayfuncs.c:6137 utils/adt/arraysubs.c:151 #: utils/adt/arraysubs.c:489 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "число размерностей массива (%d) превышает предел (%d)" -#: executor/execExprInterp.c:3521 executor/execExprInterp.c:3556 +#: executor/execExprInterp.c:3529 executor/execExprInterp.c:3564 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -15797,7 +15849,7 @@ msgstr "" "для многомерных массивов должны задаваться выражения с соответствующими " "размерностями" -#: executor/execExprInterp.c:3533 utils/adt/array_expanded.c:274 +#: executor/execExprInterp.c:3541 utils/adt/array_expanded.c:274 #: utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 #: utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 #: utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 @@ -15805,45 +15857,45 @@ msgstr "" #: utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 #: utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 #: utils/adt/arrayfuncs.c:3545 utils/adt/arrayfuncs.c:5383 -#: utils/adt/arrayfuncs.c:6222 utils/adt/arrayfuncs.c:6566 +#: utils/adt/arrayfuncs.c:6229 utils/adt/arrayfuncs.c:6573 #: utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 #: utils/adt/arrayutils.c:99 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "размер массива превышает предел (%d)" -#: executor/execExprInterp.c:3781 executor/execExprInterp.c:3827 +#: executor/execExprInterp.c:3789 executor/execExprInterp.c:3835 #, c-format msgid "attribute %d has wrong type" msgstr "атрибут %d имеет неверный тип" -#: executor/execExprInterp.c:4413 utils/adt/domains.c:158 +#: executor/execExprInterp.c:4484 utils/adt/domains.c:158 #, c-format msgid "domain %s does not allow null values" msgstr "домен %s не допускает значения null" -#: executor/execExprInterp.c:4428 utils/adt/domains.c:196 +#: executor/execExprInterp.c:4499 utils/adt/domains.c:196 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "значение домена %s нарушает ограничение-проверку \"%s\"" -#: executor/execExprInterp.c:5003 +#: executor/execExprInterp.c:5074 #, c-format msgid "no SQL/JSON item found for specified path of column \"%s\"" msgstr "по заданному для столбца \"%s\" пути не найден элемент SQL/JSON" -#: executor/execExprInterp.c:5008 +#: executor/execExprInterp.c:5079 #, c-format msgid "no SQL/JSON item found for specified path" msgstr "по заданному пути не найден элемент SQL/JSON" #. translator: first %s is a SQL/JSON clause (e.g. ON ERROR) -#: executor/execExprInterp.c:5208 executor/execExprInterp.c:5216 +#: executor/execExprInterp.c:5279 executor/execExprInterp.c:5287 #, c-format msgid "could not coerce %s expression (%s) to the RETURNING type" msgstr "привести выражение %s (%s) к типу RETURNING не удалось" -#: executor/execExprInterp.c:5440 +#: executor/execExprInterp.c:5511 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." @@ -15851,14 +15903,14 @@ msgstr[0] "Строка таблицы содержит %d атрибут, а в msgstr[1] "Строка таблицы содержит %d атрибута, а в запросе ожидается %d." msgstr[2] "Строка таблицы содержит %d атрибутов, а в запросе ожидается %d." -#: executor/execExprInterp.c:5556 executor/execSRF.c:977 +#: executor/execExprInterp.c:5627 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "" "Несоответствие параметров физического хранения удалённого атрибута (под " "номером %d)." -#: executor/execIndexing.c:608 +#: executor/execIndexing.c:609 #, c-format msgid "" "ON CONFLICT does not support deferrable unique constraints/exclusion " @@ -15867,37 +15919,37 @@ msgstr "" "ON CONFLICT не поддерживает откладываемые ограничения уникальности/" "ограничения-исключения в качестве определяющего индекса" -#: executor/execIndexing.c:911 +#: executor/execIndexing.c:919 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "не удалось создать ограничение-исключение \"%s\"" -#: executor/execIndexing.c:914 +#: executor/execIndexing.c:922 #, c-format msgid "Key %s conflicts with key %s." msgstr "Ключ %s конфликтует с ключом %s." -#: executor/execIndexing.c:916 +#: executor/execIndexing.c:924 #, c-format msgid "Key conflicts exist." msgstr "Обнаружен конфликт ключей." -#: executor/execIndexing.c:922 +#: executor/execIndexing.c:930 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "конфликтующее значение ключа нарушает ограничение-исключение \"%s\"" -#: executor/execIndexing.c:925 +#: executor/execIndexing.c:933 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "Ключ %s конфликтует с существующим ключом %s." -#: executor/execIndexing.c:927 +#: executor/execIndexing.c:935 #, c-format msgid "Key conflicts with existing key." msgstr "Ключ конфликтует с уже существующим." -#: executor/execIndexing.c:1172 +#: executor/execIndexing.c:1180 #, c-format msgid "empty WITHOUT OVERLAPS value found in column \"%s\" in relation \"%s\"" msgstr "" @@ -16327,7 +16379,7 @@ msgstr "Последний оператор возвращает слишком msgid "return type %s is not supported for SQL functions" msgstr "для SQL-функций тип возврата %s не поддерживается" -#: executor/nodeAgg.c:4039 executor/nodeWindowAgg.c:3041 +#: executor/nodeAgg.c:4039 executor/nodeWindowAgg.c:3089 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "" @@ -16348,7 +16400,7 @@ msgstr "нестандартное сканирование \"%s\" не подд msgid "could not rewind hash-join temporary file" msgstr "не удалось переместиться во временном файле хеш-соединения" -#: executor/nodeIndexonlyscan.c:240 +#: executor/nodeIndexonlyscan.c:222 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "" @@ -16434,13 +16486,13 @@ msgid "Consider defining the foreign key on table \"%s\"." msgstr "Возможно, имеет смысл перенацелить внешний ключ на таблицу \"%s\"." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2788 executor/nodeModifyTable.c:3328 -#: executor/nodeModifyTable.c:3520 +#: executor/nodeModifyTable.c:2807 executor/nodeModifyTable.c:3347 +#: executor/nodeModifyTable.c:3544 #, c-format msgid "%s command cannot affect row a second time" msgstr "команда %s не может подействовать на строку дважды" -#: executor/nodeModifyTable.c:2790 +#: executor/nodeModifyTable.c:2809 #, c-format msgid "" "Ensure that no rows proposed for insertion within the same command have " @@ -16449,7 +16501,7 @@ msgstr "" "Проверьте, не содержат ли строки, которые должна добавить команда, " "дублирующиеся значения, подпадающие под ограничения." -#: executor/nodeModifyTable.c:3321 executor/nodeModifyTable.c:3513 +#: executor/nodeModifyTable.c:3340 executor/nodeModifyTable.c:3537 #, c-format msgid "" "tuple to be updated or deleted was already modified by an operation " @@ -16458,14 +16510,14 @@ msgstr "" "кортеж, который должен быть изменён или удалён, уже модифицирован в " "операции, вызванной текущей командой" -#: executor/nodeModifyTable.c:3330 executor/nodeModifyTable.c:3522 +#: executor/nodeModifyTable.c:3349 executor/nodeModifyTable.c:3546 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "" "Проверьте, не может ли какой-либо целевой строке соответствовать более одной " "исходной строки." -#: executor/nodeModifyTable.c:3399 +#: executor/nodeModifyTable.c:3423 #, c-format msgid "" "tuple to be merged was already moved to another partition due to concurrent " @@ -16515,32 +16567,32 @@ msgstr "Для столбца \"%s\" задано выражение NULL." msgid "null is not allowed in column \"%s\"" msgstr "в столбце \"%s\" не допускается NULL" -#: executor/nodeWindowAgg.c:356 +#: executor/nodeWindowAgg.c:357 #, c-format msgid "moving-aggregate transition function must not return null" msgstr "функция перехода движимого агрегата не должна возвращать NULL" -#: executor/nodeWindowAgg.c:2106 +#: executor/nodeWindowAgg.c:2154 #, c-format msgid "frame starting offset must not be null" msgstr "смещение начала рамки не может быть NULL" -#: executor/nodeWindowAgg.c:2120 +#: executor/nodeWindowAgg.c:2168 #, c-format msgid "frame starting offset must not be negative" msgstr "смещение начала рамки не может быть отрицательным" -#: executor/nodeWindowAgg.c:2133 +#: executor/nodeWindowAgg.c:2181 #, c-format msgid "frame ending offset must not be null" msgstr "смещение конца рамки не может быть NULL" -#: executor/nodeWindowAgg.c:2147 +#: executor/nodeWindowAgg.c:2195 #, c-format msgid "frame ending offset must not be negative" msgstr "смещение конца рамки не может быть отрицательным" -#: executor/nodeWindowAgg.c:2957 +#: executor/nodeWindowAgg.c:3005 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "" @@ -16593,7 +16645,7 @@ msgstr "не удалось открыть запрос %s как курсор" msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE не поддерживается" -#: executor/spi.c:1719 parser/analyze.c:3077 +#: executor/spi.c:1719 parser/analyze.c:3093 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Прокручиваемые курсоры должны быть READ ONLY." @@ -18072,12 +18124,12 @@ msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "" "Пользователь \"%s\" имеет пароль, неподходящий для аутентификации по MD5." -#: libpq/crypt.c:237 libpq/crypt.c:279 libpq/crypt.c:299 +#: libpq/crypt.c:238 libpq/crypt.c:280 libpq/crypt.c:301 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Пароль не подходит для пользователя \"%s\"." -#: libpq/crypt.c:318 +#: libpq/crypt.c:320 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Пароль пользователя \"%s\" представлен в неизвестном формате." @@ -18602,7 +18654,7 @@ msgstr "нет клиентского подключения" msgid "could not receive data from client: %m" msgstr "не удалось получить данные от клиента: %m" -#: libpq/pqcomm.c:1151 tcop/postgres.c:4500 +#: libpq/pqcomm.c:1151 tcop/postgres.c:4504 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "закрытие подключения из-за потери синхронизации протокола" @@ -18648,7 +18700,7 @@ msgid "no data left in message" msgstr "в сообщении не осталось данных" #: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 -#: utils/adt/array_userfuncs.c:873 utils/adt/arrayfuncs.c:1481 +#: utils/adt/array_userfuncs.c:874 utils/adt/arrayfuncs.c:1481 #: utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" @@ -18977,15 +19029,15 @@ msgstr "расширенный тип узла \"%s\" уже существуе msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "методы расширенного узла \"%s\" не зарегистрированы" -#: nodes/makefuncs.c:154 nodes/makefuncs.c:180 statistics/extended_stats.c:2286 +#: nodes/makefuncs.c:154 nodes/makefuncs.c:180 statistics/extended_stats.c:2296 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "отношение \"%s\" не имеет составного типа" -#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2602 -#: parser/parse_coerce.c:2740 parser/parse_coerce.c:2787 +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2601 +#: parser/parse_coerce.c:2739 parser/parse_coerce.c:2786 #: parser/parse_expr.c:2130 parser/parse_func.c:710 parser/parse_oper.c:869 -#: utils/adt/array_userfuncs.c:1950 utils/fmgr/funcapi.c:669 +#: utils/adt/array_userfuncs.c:1959 utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "тип массива для типа данных %s не найден" @@ -19010,31 +19062,31 @@ msgstr "" "слиянием или хеш-соединение" #: optimizer/plan/createplan.c:7321 parser/parse_merge.c:203 -#: rewrite/rewriteHandler.c:1692 +#: rewrite/rewriteHandler.c:1725 #, c-format msgid "cannot execute MERGE on relation \"%s\"" msgstr "выполнить MERGE для отношения \"%s\" нельзя" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1755 +#: optimizer/plan/initsplan.c:1806 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s не может применяться к NULL-содержащей стороне внешнего соединения" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1512 parser/analyze.c:1815 parser/analyze.c:2074 -#: parser/analyze.c:3396 +#: optimizer/plan/planner.c:1645 parser/analyze.c:1823 parser/analyze.c:2082 +#: parser/analyze.c:3412 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s несовместимо с UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2258 optimizer/plan/planner.c:4144 +#: optimizer/plan/planner.c:2391 optimizer/plan/planner.c:4277 #, c-format msgid "could not implement GROUP BY" msgstr "не удалось реализовать GROUP BY" -#: optimizer/plan/planner.c:2259 optimizer/plan/planner.c:4145 -#: optimizer/plan/planner.c:4826 optimizer/prep/prepunion.c:1073 +#: optimizer/plan/planner.c:2392 optimizer/plan/planner.c:4278 +#: optimizer/plan/planner.c:4959 optimizer/prep/prepunion.c:1073 #, c-format msgid "" "Some of the datatypes only support hashing, while others only support " @@ -19043,27 +19095,27 @@ msgstr "" "Одни типы данных поддерживают только хеширование, а другие - только " "сортировку." -#: optimizer/plan/planner.c:4825 +#: optimizer/plan/planner.c:4958 #, c-format msgid "could not implement DISTINCT" msgstr "не удалось реализовать DISTINCT" -#: optimizer/plan/planner.c:6322 +#: optimizer/plan/planner.c:6455 #, c-format msgid "could not implement window PARTITION BY" msgstr "не удалось реализовать PARTITION BY для окна" -#: optimizer/plan/planner.c:6323 +#: optimizer/plan/planner.c:6456 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Столбцы, разбивающие окна, должны иметь сортируемые типы данных." -#: optimizer/plan/planner.c:6327 +#: optimizer/plan/planner.c:6460 #, c-format msgid "could not implement window ORDER BY" msgstr "не удалось реализовать ORDER BY для окна" -#: optimizer/plan/planner.c:6328 +#: optimizer/plan/planner.c:6461 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Столбцы, сортирующие окна, должны иметь сортируемые типы данных." @@ -19096,7 +19148,7 @@ msgstr "" "атрибут \"%s\" отношения \"%s\" не соответствует родительскому правилу " "сортировки" -#: optimizer/util/clauses.c:4965 +#: optimizer/util/clauses.c:4992 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "внедрённая в код SQL-функция \"%s\"" @@ -19134,22 +19186,27 @@ msgstr "" "нет уникального ограничения или ограничения-исключения, соответствующего " "указанию ON CONFLICT" -#: parser/analyze.c:869 parser/analyze.c:1594 +#: parser/analyze.c:582 parser/analyze.c:2501 +#, c-format +msgid "WHERE CURRENT OF on a view is not implemented" +msgstr "условие WHERE CURRENT OF для представлений не реализовано" + +#: parser/analyze.c:877 parser/analyze.c:1602 #, c-format msgid "VALUES lists must all be the same length" msgstr "списки VALUES должны иметь одинаковую длину" -#: parser/analyze.c:1071 +#: parser/analyze.c:1079 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT содержит больше выражений, чем целевых столбцов" -#: parser/analyze.c:1089 +#: parser/analyze.c:1097 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT содержит больше целевых столбцов, чем выражений" -#: parser/analyze.c:1093 +#: parser/analyze.c:1101 #, c-format msgid "" "The insertion source is a row expression containing the same number of " @@ -19158,29 +19215,29 @@ msgstr "" "Источником данных является строка, включающая столько же столбцов, сколько " "требуется для INSERT. Вы намеренно использовали скобки?" -#: parser/analyze.c:1401 parser/analyze.c:1788 +#: parser/analyze.c:1409 parser/analyze.c:1796 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO здесь не допускается" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1717 parser/analyze.c:3628 +#: parser/analyze.c:1725 parser/analyze.c:3644 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s нельзя применять к VALUES" -#: parser/analyze.c:1955 +#: parser/analyze.c:1963 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "неверное предложение UNION/INTERSECT/EXCEPT ORDER BY" -#: parser/analyze.c:1956 +#: parser/analyze.c:1964 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "" "Допустимо использование только имён столбцов, но не выражений или функций." -#: parser/analyze.c:1957 +#: parser/analyze.c:1965 #, c-format msgid "" "Add the expression/function to every SELECT, or move the UNION into a FROM " @@ -19189,12 +19246,12 @@ msgstr "" "Добавьте выражение/функцию в каждый SELECT или перенесите UNION в " "предложение FROM." -#: parser/analyze.c:2064 +#: parser/analyze.c:2072 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO можно добавить только в первый SELECT в UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:2136 +#: parser/analyze.c:2144 #, c-format msgid "" "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of " @@ -19203,33 +19260,33 @@ msgstr "" "оператор, составляющий UNION/INTERSECT/EXCEPT, не может ссылаться на другие " "отношения на том же уровне запроса" -#: parser/analyze.c:2223 +#: parser/analyze.c:2231 #, c-format msgid "each %s query must have the same number of columns" msgstr "все запросы в %s должны возвращать одинаковое число столбцов" -#: parser/analyze.c:2580 +#: parser/analyze.c:2596 #, c-format msgid "SET target columns cannot be qualified with the relation name." msgstr "К именам целевых столбцов в SET нельзя добавлять имя отношения." #. translator: %s is OLD or NEW -#: parser/analyze.c:2668 parser/analyze.c:2678 +#: parser/analyze.c:2684 parser/analyze.c:2694 #, c-format msgid "%s cannot be specified multiple times" msgstr "%s нельзя указывать несколько раз" -#: parser/analyze.c:2690 parser/parse_relation.c:473 +#: parser/analyze.c:2706 parser/parse_relation.c:473 #, c-format msgid "table name \"%s\" specified more than once" msgstr "имя таблицы \"%s\" указано больше одного раза" -#: parser/analyze.c:2738 +#: parser/analyze.c:2754 #, c-format msgid "RETURNING must have at least one column" msgstr "в RETURNING должен быть минимум один столбец" -#: parser/analyze.c:2840 +#: parser/analyze.c:2856 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" @@ -19237,150 +19294,150 @@ msgstr[0] "источник присваиваемого значения выд msgstr[1] "источник присваиваемого значения выдал %d столбца" msgstr[2] "источник присваиваемого значения выдал %d столбцов" -#: parser/analyze.c:2901 +#: parser/analyze.c:2917 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "переменная \"%s\" имеет тип %s, а выражение - тип %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:3027 parser/analyze.c:3035 +#: parser/analyze.c:3043 parser/analyze.c:3051 #, c-format msgid "cannot specify both %s and %s" msgstr "указать %s и %s одновременно нельзя" -#: parser/analyze.c:3055 +#: parser/analyze.c:3071 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR не может содержать операторы, изменяющие данные, в WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3063 +#: parser/analyze.c:3079 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s не поддерживается" -#: parser/analyze.c:3066 +#: parser/analyze.c:3082 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Сохраняемые курсоры должны быть READ ONLY." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3074 +#: parser/analyze.c:3090 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s не поддерживается" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3085 +#: parser/analyze.c:3101 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s не допускается" -#: parser/analyze.c:3088 +#: parser/analyze.c:3104 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Независимые курсоры должны быть READ ONLY." -#: parser/analyze.c:3182 +#: parser/analyze.c:3198 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "" "в материализованных представлениях не должны использоваться операторы, " "изменяющие данные в WITH" -#: parser/analyze.c:3192 +#: parser/analyze.c:3208 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "" "в материализованных представлениях не должны использоваться временные " "таблицы и представления" -#: parser/analyze.c:3202 +#: parser/analyze.c:3218 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "" "определять материализованные представления со связанными параметрами нельзя" -#: parser/analyze.c:3214 +#: parser/analyze.c:3230 #, c-format msgid "materialized views cannot be unlogged" msgstr "материализованные представления не могут быть нежурналируемыми" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3403 +#: parser/analyze.c:3419 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s несовместимо с предложением DISTINCT" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3410 +#: parser/analyze.c:3426 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s несовместимо с предложением GROUP BY" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3417 +#: parser/analyze.c:3433 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s несовместимо с предложением HAVING" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3424 +#: parser/analyze.c:3440 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s несовместимо с агрегатными функциями" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3431 +#: parser/analyze.c:3447 #, c-format msgid "%s is not allowed with window functions" msgstr "%s несовместимо с оконными функциями" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3438 +#: parser/analyze.c:3454 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "" "%s не допускается с функциями, возвращающие множества, в списке результатов" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3537 +#: parser/analyze.c:3553 #, c-format msgid "%s must specify unqualified relation names" msgstr "для %s нужно указывать неполные имена отношений" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3601 +#: parser/analyze.c:3617 #, c-format msgid "%s cannot be applied to a join" msgstr "%s нельзя применить к соединению" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3610 +#: parser/analyze.c:3626 #, c-format msgid "%s cannot be applied to a function" msgstr "%s нельзя применить к функции" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3619 +#: parser/analyze.c:3635 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s нельзя применить к табличной функции" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3637 +#: parser/analyze.c:3653 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s нельзя применить к запросу WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3646 +#: parser/analyze.c:3662 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s нельзя применить к именованному хранилищу кортежей" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3666 +#: parser/analyze.c:3682 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "отношение \"%s\" в определении %s отсутствует в предложении FROM" @@ -19715,14 +19772,14 @@ msgstr "окно \"%s\" не существует" msgid "too many grouping sets present (maximum 4096)" msgstr "слишком много наборов группирования (при максимуме 4096)" -#: parser/parse_agg.c:1329 +#: parser/parse_agg.c:1331 #, c-format msgid "" "aggregate functions are not allowed in a recursive query's recursive term" msgstr "" "в рекурсивной части рекурсивного запроса агрегатные функции недопустимы" -#: parser/parse_agg.c:1552 +#: parser/parse_agg.c:1554 #, c-format msgid "" "column \"%s.%s\" must appear in the GROUP BY clause or be used in an " @@ -19731,7 +19788,7 @@ msgstr "" "столбец \"%s.%s\" должен фигурировать в предложении GROUP BY или " "использоваться в агрегатной функции" -#: parser/parse_agg.c:1555 +#: parser/parse_agg.c:1557 #, c-format msgid "" "Direct arguments of an ordered-set aggregate must use only grouped columns." @@ -19739,13 +19796,13 @@ msgstr "" "Прямые аргументы сортирующей агрегатной функции могут включать только " "группируемые столбцы." -#: parser/parse_agg.c:1560 +#: parser/parse_agg.c:1562 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "" "подзапрос использует негруппированный столбец \"%s.%s\" из внешнего запроса" -#: parser/parse_agg.c:1725 +#: parser/parse_agg.c:1727 #, c-format msgid "" "arguments to GROUPING must be grouping expressions of the associated query " @@ -19759,7 +19816,7 @@ msgstr "" msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "отношение \"%s\" не может быть целевым в операторе, изменяющем данные" -#: parser/parse_clause.c:567 parser/parse_clause.c:595 parser/parse_func.c:2553 +#: parser/parse_clause.c:567 parser/parse_clause.c:595 parser/parse_func.c:2551 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "" @@ -20071,150 +20128,150 @@ msgstr "" msgid "Cast the offset value to the exact intended type." msgstr "Приведите значение смещения в точности к желаемому типу." -#: parser/parse_coerce.c:1048 parser/parse_coerce.c:1086 -#: parser/parse_coerce.c:1104 parser/parse_coerce.c:1119 +#: parser/parse_coerce.c:1047 parser/parse_coerce.c:1085 +#: parser/parse_coerce.c:1103 parser/parse_coerce.c:1118 #: parser/parse_expr.c:2164 parser/parse_expr.c:2784 parser/parse_expr.c:3435 -#: parser/parse_expr.c:3664 parser/parse_target.c:1001 +#: parser/parse_expr.c:3664 parser/parse_expr.c:4100 parser/parse_target.c:1001 #, c-format msgid "cannot cast type %s to %s" msgstr "привести тип %s к %s нельзя" -#: parser/parse_coerce.c:1089 +#: parser/parse_coerce.c:1088 #, c-format msgid "Input has too few columns." msgstr "Во входных данных недостаточно столбцов." -#: parser/parse_coerce.c:1107 +#: parser/parse_coerce.c:1106 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "Не удалось привести тип %s к %s в столбце %d." -#: parser/parse_coerce.c:1122 +#: parser/parse_coerce.c:1121 #, c-format msgid "Input has too many columns." msgstr "Во входных данных больше столбцов." #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1177 parser/parse_coerce.c:1225 +#: parser/parse_coerce.c:1176 parser/parse_coerce.c:1224 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "аргумент конструкции %s должен иметь тип %s, а не %s" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1188 parser/parse_coerce.c:1237 +#: parser/parse_coerce.c:1187 parser/parse_coerce.c:1236 #, c-format 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:1418 +#: parser/parse_coerce.c:1417 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "в конструкции %s типы %s и %s не имеют общего" -#: parser/parse_coerce.c:1534 +#: parser/parse_coerce.c:1533 #, 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:1586 +#: parser/parse_coerce.c:1585 #, c-format msgid "%s could not convert type %s to %s" msgstr "в конструкции %s нельзя преобразовать тип %s в %s" -#: parser/parse_coerce.c:2189 parser/parse_coerce.c:2209 -#: parser/parse_coerce.c:2229 parser/parse_coerce.c:2250 -#: parser/parse_coerce.c:2305 parser/parse_coerce.c:2339 +#: parser/parse_coerce.c:2188 parser/parse_coerce.c:2208 +#: parser/parse_coerce.c:2228 parser/parse_coerce.c:2249 +#: parser/parse_coerce.c:2304 parser/parse_coerce.c:2338 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "аргументы, объявленные как \"%s\", должны быть однотипными" -#: parser/parse_coerce.c:2284 parser/parse_coerce.c:2397 +#: parser/parse_coerce.c:2283 parser/parse_coerce.c:2396 #: 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:2317 parser/parse_coerce.c:2467 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2466 #: 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:2351 parser/parse_coerce.c:2431 -#: parser/parse_coerce.c:2564 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 +#: parser/parse_coerce.c:2350 parser/parse_coerce.c:2430 +#: parser/parse_coerce.c:2563 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:2388 +#: parser/parse_coerce.c:2387 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "тип элемента аргумента \"anyarray\" определить нельзя" -#: parser/parse_coerce.c:2414 parser/parse_coerce.c:2445 -#: parser/parse_coerce.c:2484 parser/parse_coerce.c:2550 +#: parser/parse_coerce.c:2413 parser/parse_coerce.c:2444 +#: parser/parse_coerce.c:2483 parser/parse_coerce.c:2549 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "аргумент, объявленный как \"%s\", не согласуется с аргументом %s" -#: parser/parse_coerce.c:2509 +#: parser/parse_coerce.c:2508 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "" "не удалось определить полиморфный тип, так как входные аргументы имеют тип %s" -#: parser/parse_coerce.c:2523 +#: parser/parse_coerce.c:2522 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "" "в нарушение объявления \"anynonarray\" соответствующий аргумент оказался " "массивом: %s" -#: parser/parse_coerce.c:2533 +#: parser/parse_coerce.c:2532 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "" "в нарушение объявления \"anyenum\" соответствующий аргумент оказался не " "перечислением: %s" -#: parser/parse_coerce.c:2594 +#: parser/parse_coerce.c:2593 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "" "аргументы семейства anycompatible не могут быть приведены к общему типу" -#: parser/parse_coerce.c:2612 parser/parse_coerce.c:2633 -#: parser/parse_coerce.c:2683 parser/parse_coerce.c:2688 -#: parser/parse_coerce.c:2752 parser/parse_coerce.c:2764 +#: parser/parse_coerce.c:2611 parser/parse_coerce.c:2632 +#: parser/parse_coerce.c:2682 parser/parse_coerce.c:2687 +#: parser/parse_coerce.c:2751 parser/parse_coerce.c:2763 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "" "не удалось определить полиморфный тип %s, так как входные аргументы имеют " "тип %s" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2621 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "тип %s (anycompatiblerange) не соответствует типу %s (anycompatible)" -#: parser/parse_coerce.c:2643 +#: parser/parse_coerce.c:2642 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "" "тип %s (anycompatiblemultirange) не соответствует типу %s (anycompatible)" -#: parser/parse_coerce.c:2657 +#: parser/parse_coerce.c:2656 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "" "в нарушение объявления \"anycompatiblenonarray\" соответствующий аргумент " "оказался массивом: %s" -#: parser/parse_coerce.c:2892 +#: parser/parse_coerce.c:2891 #, c-format msgid "" "A result of type %s requires at least one input of type anyrange or " @@ -20223,7 +20280,7 @@ msgstr "" "Для результата типа %s требуется минимум один аргумент типа anyrange или " "anymultirange." -#: parser/parse_coerce.c:2909 +#: parser/parse_coerce.c:2908 #, c-format msgid "" "A result of type %s requires at least one input of type anycompatiblerange " @@ -20232,7 +20289,7 @@ msgstr "" "Для результата типа %s требуется минимум один аргумент типа " "anycompatiblerange или anycompatiblemultirange." -#: parser/parse_coerce.c:2921 +#: parser/parse_coerce.c:2920 #, c-format msgid "" "A result of type %s requires at least one input of type anyelement, " @@ -20241,7 +20298,7 @@ msgstr "" "Для результата типа %s требуется минимум один аргумент типа anyelement, " "anyarray, anynonarray, anyenum, anyrange или anymultirange." -#: parser/parse_coerce.c:2933 +#: parser/parse_coerce.c:2932 #, c-format msgid "" "A result of type %s requires at least one input of type anycompatible, " @@ -20252,7 +20309,7 @@ msgstr "" "anycompatiblearray, anycompatiblenonarray, anycompatiblerange или " "anycompatiblemultirange." -#: parser/parse_coerce.c:2963 +#: parser/parse_coerce.c:2962 msgid "A result of type internal requires at least one input of type internal." msgstr "" "Для результата типа internal требуется минимум один аргумент типа internal." @@ -20492,9 +20549,9 @@ msgstr "рекурсивная ссылка на запрос \"%s\" указа msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT не допускается в данном контексте" -#: parser/parse_expr.c:405 parser/parse_relation.c:3797 -#: parser/parse_relation.c:3807 parser/parse_relation.c:3825 -#: parser/parse_relation.c:3832 parser/parse_relation.c:3846 +#: parser/parse_expr.c:405 parser/parse_relation.c:3829 +#: parser/parse_relation.c:3839 parser/parse_relation.c:3857 +#: parser/parse_relation.c:3864 parser/parse_relation.c:3878 #, c-format msgid "column %s.%s does not exist" msgstr "столбец %s.%s не существует" @@ -20529,8 +20586,8 @@ msgstr "в выражении DEFAULT (по умолчанию) нельзя с msgid "cannot use column reference in partition bound expression" msgstr "в выражении границы секции нельзя ссылаться на столбцы" -#: parser/parse_expr.c:845 parser/parse_relation.c:848 -#: parser/parse_relation.c:930 parser/parse_target.c:1241 +#: parser/parse_expr.c:845 parser/parse_relation.c:880 +#: parser/parse_relation.c:962 parser/parse_target.c:1241 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "неоднозначная ссылка на столбец \"%s\"" @@ -20575,7 +20632,7 @@ msgstr "" "SELECT или выражение ROW()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1770 parser/parse_expr.c:2263 parser/parse_func.c:2679 +#: parser/parse_expr.c:1770 parser/parse_expr.c:2263 parser/parse_func.c:2677 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "функции, возвращающие множества, нельзя применять в конструкции %s" @@ -20780,45 +20837,45 @@ msgstr "функции SQL/JSON не могут возвращать псевд msgid "aggregate ORDER BY is not implemented for window functions" msgstr "агрегатное предложение ORDER BY для оконных функций не реализовано" -#: parser/parse_expr.c:4102 +#: parser/parse_expr.c:4112 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" msgstr "" "предложение JSON FORMAT ENCODING можно использовать только с типом bytea" -#: parser/parse_expr.c:4122 +#: parser/parse_expr.c:4132 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "в предикате IS JSON нельзя использовать тип %s" -#: parser/parse_expr.c:4148 parser/parse_expr.c:4269 +#: parser/parse_expr.c:4158 parser/parse_expr.c:4279 #, c-format msgid "cannot use type %s in RETURNING clause of %s" msgstr "тип %s нельзя использовать в предложении RETURNING функции %s" -#: parser/parse_expr.c:4150 +#: parser/parse_expr.c:4160 #, c-format msgid "Try returning json or jsonb." msgstr "Попробуйте возвратить тип json или jsonb." -#: parser/parse_expr.c:4198 +#: parser/parse_expr.c:4208 #, c-format msgid "cannot use non-string types with WITH UNIQUE KEYS clause" msgstr "" "с предложением WITH UNIQUE KEYS можно использовать только строковые типы " "данных" -#: parser/parse_expr.c:4272 +#: parser/parse_expr.c:4282 #, c-format msgid "Try returning a string type or bytea." msgstr "Попробуйте возвратить строковый тип или bytea." -#: parser/parse_expr.c:4340 +#: parser/parse_expr.c:4350 #, c-format msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" msgstr "FORMAT JSON не может указываться в предложении RETURNING %s()" -#: parser/parse_expr.c:4353 +#: parser/parse_expr.c:4363 #, c-format msgid "" "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" @@ -20826,8 +20883,8 @@ msgstr "" "когда используется WITH WRAPPER, поведение QUOTES в SQL/JSON задать нельзя" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4367 parser/parse_expr.c:4396 parser/parse_expr.c:4427 -#: parser/parse_expr.c:4453 parser/parse_expr.c:4479 +#: parser/parse_expr.c:4377 parser/parse_expr.c:4406 parser/parse_expr.c:4437 +#: parser/parse_expr.c:4463 parser/parse_expr.c:4489 #: parser/parse_jsontable.c:92 #, c-format msgid "invalid %s behavior" @@ -20835,7 +20892,7 @@ msgstr "неверное поведение %s" #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), #. second %s is a SQL/JSON function name (e.g. JSON_QUERY) -#: parser/parse_expr.c:4370 parser/parse_expr.c:4399 +#: parser/parse_expr.c:4380 parser/parse_expr.c:4409 #, c-format msgid "" "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " @@ -20847,14 +20904,14 @@ msgstr "" #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) #. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4377 parser/parse_expr.c:4406 parser/parse_expr.c:4435 -#: parser/parse_expr.c:4463 parser/parse_expr.c:4489 +#: parser/parse_expr.c:4387 parser/parse_expr.c:4416 parser/parse_expr.c:4445 +#: parser/parse_expr.c:4473 parser/parse_expr.c:4499 #, c-format msgid "invalid %s behavior for column \"%s\"" msgstr "неверное поведение %s для столбца \"%s\"" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4380 parser/parse_expr.c:4409 +#: parser/parse_expr.c:4390 parser/parse_expr.c:4419 #, c-format msgid "" "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " @@ -20863,13 +20920,13 @@ msgstr "" "В %s для форматируемых столбцов допускается только ERROR, NULL, EMPTY ARRAY, " "EMPTY OBJECT или выражение DEFAULT." -#: parser/parse_expr.c:4428 +#: parser/parse_expr.c:4438 #, c-format msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." msgstr "В %s для %s допускается только ERROR, TRUE, FALSE или UNKNOWN." #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4438 +#: parser/parse_expr.c:4448 #, c-format msgid "" "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." @@ -20878,13 +20935,13 @@ msgstr "" #. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), #. second %s is a SQL/JSON function name (e.g. JSON_QUERY) -#: parser/parse_expr.c:4456 parser/parse_expr.c:4482 +#: parser/parse_expr.c:4466 parser/parse_expr.c:4492 #, c-format msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." msgstr "В %s для %s допускается только ERROR, NULL или выражение DEFAULT." #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4466 parser/parse_expr.c:4492 +#: parser/parse_expr.c:4476 parser/parse_expr.c:4502 #, c-format msgid "" "Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." @@ -20892,12 +20949,12 @@ msgstr "" "В %s для скалярных столбцов допускается только ERROR, NULL или выражение " "DEFAULT." -#: parser/parse_expr.c:4526 +#: parser/parse_expr.c:4536 #, c-format msgid "JSON path expression must be of type %s, not of type %s" msgstr "выражение пути JSON должно быть типа %s, а не типа %s" -#: parser/parse_expr.c:4766 +#: parser/parse_expr.c:4776 #, c-format msgid "" "can only specify a constant, non-aggregate function, or operator expression " @@ -20906,28 +20963,28 @@ msgstr "" "в DEFAULT может задаваться только константа, вызов не агрегатной функции или " "выражение с оператором" -#: parser/parse_expr.c:4771 +#: parser/parse_expr.c:4781 #, c-format msgid "DEFAULT expression must not contain column references" msgstr "выражения в DEFAULT не могут содержать ссылки на столбцы" -#: parser/parse_expr.c:4776 +#: parser/parse_expr.c:4786 #, c-format msgid "DEFAULT expression must not return a set" msgstr "выражение в DEFAULT не может возвращать множество" -#: parser/parse_expr.c:4791 +#: parser/parse_expr.c:4801 #, c-format msgid "collation of DEFAULT expression conflicts with RETURNING clause" msgstr "" "правило сортировки выражения DEFAULT конфликтует с предложением RETURNING" -#: parser/parse_expr.c:4870 parser/parse_expr.c:4879 +#: parser/parse_expr.c:4889 parser/parse_expr.c:4898 #, c-format msgid "cannot cast behavior expression of type %s to %s" msgstr "привести выражение поведения, имеющее тип %s, к типу %s нельзя" -#: parser/parse_expr.c:4873 +#: parser/parse_expr.c:4892 #, c-format msgid "You will need to explicitly cast the expression to type %s." msgstr "Приведите выражение к типу %s явно." @@ -20942,7 +20999,7 @@ msgstr "имя аргумента \"%s\" используется неоднок msgid "positional argument cannot follow named argument" msgstr "нумерованный аргумент не может следовать за именованным аргументом" -#: parser/parse_func.c:287 parser/parse_func.c:2368 +#: parser/parse_func.c:287 parser/parse_func.c:2366 #, c-format msgid "%s is not a procedure" msgstr "\"%s\" — не процедура" @@ -21104,7 +21161,7 @@ msgstr "" "Возможно, неверно расположено предложение ORDER BY - оно должно следовать за " "всеми обычными аргументами функции." -#: parser/parse_func.c:622 parser/parse_func.c:2411 +#: parser/parse_func.c:622 parser/parse_func.c:2409 #, c-format msgid "procedure %s does not exist" msgstr "процедура %s не существует" @@ -21169,22 +21226,22 @@ msgstr "" msgid "window functions cannot return sets" msgstr "оконные функции не могут возвращать множества" -#: parser/parse_func.c:2167 parser/parse_func.c:2440 +#: parser/parse_func.c:2165 parser/parse_func.c:2438 #, c-format msgid "could not find a function named \"%s\"" msgstr "не удалось найти функцию с именем \"%s\"" -#: parser/parse_func.c:2181 parser/parse_func.c:2458 +#: parser/parse_func.c:2179 parser/parse_func.c:2456 #, c-format msgid "function name \"%s\" is not unique" msgstr "имя функции \"%s\" не уникально" -#: parser/parse_func.c:2183 parser/parse_func.c:2461 +#: parser/parse_func.c:2181 parser/parse_func.c:2459 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Задайте список аргументов для однозначного выбора функции." -#: parser/parse_func.c:2227 +#: parser/parse_func.c:2225 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" @@ -21192,143 +21249,143 @@ msgstr[0] "процедуры допускают не более %d аргуме msgstr[1] "процедуры допускают не более %d аргументов" msgstr[2] "процедуры допускают не более %d аргументов" -#: parser/parse_func.c:2358 +#: parser/parse_func.c:2356 #, c-format msgid "%s is not a function" msgstr "%s — не функция" -#: parser/parse_func.c:2378 +#: parser/parse_func.c:2376 #, c-format msgid "function %s is not an aggregate" msgstr "функция \"%s\" не является агрегатной" -#: parser/parse_func.c:2406 +#: parser/parse_func.c:2404 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "не удалось найти процедуру с именем \"%s\"" -#: parser/parse_func.c:2420 +#: parser/parse_func.c:2418 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "не удалось найти агрегат с именем \"%s\"" -#: parser/parse_func.c:2425 +#: parser/parse_func.c:2423 #, c-format msgid "aggregate %s(*) does not exist" msgstr "агрегатная функция %s(*) не существует" -#: parser/parse_func.c:2430 +#: parser/parse_func.c:2428 #, c-format msgid "aggregate %s does not exist" msgstr "агрегатная функция %s не существует" -#: parser/parse_func.c:2466 +#: parser/parse_func.c:2464 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "имя процедуры \"%s\" не уникально" -#: parser/parse_func.c:2469 +#: parser/parse_func.c:2467 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Задайте список аргументов для однозначного выбора процедуры." -#: parser/parse_func.c:2474 +#: parser/parse_func.c:2472 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "имя агрегатной функции \"%s\" не уникально" -#: parser/parse_func.c:2477 +#: parser/parse_func.c:2475 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Задайте список аргументов для однозначного выбора агрегатной функции." -#: parser/parse_func.c:2482 +#: parser/parse_func.c:2480 #, c-format msgid "routine name \"%s\" is not unique" msgstr "имя подпрограммы \"%s\" не уникально" -#: parser/parse_func.c:2485 +#: parser/parse_func.c:2483 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Задайте список аргументов для однозначного выбора подпрограммы." -#: parser/parse_func.c:2540 +#: parser/parse_func.c:2538 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "функции, возвращающие множества, нельзя применять в условиях JOIN" -#: parser/parse_func.c:2561 +#: parser/parse_func.c:2559 msgid "set-returning functions are not allowed in policy expressions" msgstr "функции, возвращающие множества, нельзя применять в выражениях политик" -#: parser/parse_func.c:2577 +#: parser/parse_func.c:2575 msgid "set-returning functions are not allowed in window definitions" msgstr "функции, возвращающие множества, нельзя применять в определении окна" -#: parser/parse_func.c:2615 +#: parser/parse_func.c:2613 msgid "set-returning functions are not allowed in MERGE WHEN conditions" msgstr "" "функции, возвращающие множества, нельзя применять в условиях MERGE WHEN" -#: parser/parse_func.c:2619 +#: parser/parse_func.c:2617 msgid "set-returning functions are not allowed in check constraints" msgstr "" "функции, возвращающие множества, нельзя применять в ограничениях-проверках" -#: parser/parse_func.c:2623 +#: parser/parse_func.c:2621 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "функции, возвращающие множества, нельзя применять в выражениях DEFAULT" -#: parser/parse_func.c:2626 +#: parser/parse_func.c:2624 msgid "set-returning functions are not allowed in index expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях индексов" -#: parser/parse_func.c:2629 +#: parser/parse_func.c:2627 msgid "set-returning functions are not allowed in index predicates" msgstr "" "функции, возвращающие множества, нельзя применять в предикатах индексов" -#: parser/parse_func.c:2632 +#: parser/parse_func.c:2630 msgid "set-returning functions are not allowed in statistics expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях статистики" -#: parser/parse_func.c:2635 +#: parser/parse_func.c:2633 msgid "set-returning functions are not allowed in transform expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях преобразований" -#: parser/parse_func.c:2638 +#: parser/parse_func.c:2636 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "функции, возвращающие множества, нельзя применять в параметрах EXECUTE" -#: parser/parse_func.c:2641 +#: parser/parse_func.c:2639 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "" "функции, возвращающие множества, нельзя применять в условиях WHEN для " "триггеров" -#: parser/parse_func.c:2644 +#: parser/parse_func.c:2642 msgid "set-returning functions are not allowed in partition bound" msgstr "" "функции, возвращающие множества, нельзя применять в выражении границы секции" -#: parser/parse_func.c:2647 +#: parser/parse_func.c:2645 msgid "set-returning functions are not allowed in partition key expressions" msgstr "" "функции, возвращающие множества, нельзя применять в выражениях ключа " "секционирования" -#: parser/parse_func.c:2650 +#: parser/parse_func.c:2648 msgid "set-returning functions are not allowed in CALL arguments" msgstr "функции, возвращающие множества, нельзя применять в аргументах CALL" -#: parser/parse_func.c:2653 +#: parser/parse_func.c:2651 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "" "функции, возвращающие множества, нельзя применять в условиях COPY FROM WHERE" -#: parser/parse_func.c:2656 +#: parser/parse_func.c:2654 msgid "" "set-returning functions are not allowed in column generation expressions" msgstr "" @@ -21445,7 +21502,7 @@ msgstr "" msgid "inconsistent types deduced for parameter $%d" msgstr "для параметра $%d выведены несогласованные типы" -#: parser/parse_param.c:310 tcop/postgres.c:734 +#: parser/parse_param.c:310 tcop/postgres.c:735 #, c-format msgid "could not determine data type of parameter $%d" msgstr "не удалось определить тип данных параметра $%d" @@ -21460,13 +21517,13 @@ msgstr "ссылка на таблицу \"%s\" неоднозначна" msgid "table reference %u is ambiguous" msgstr "ссылка на таблицу %u неоднозначна" -#: parser/parse_relation.c:502 parser/parse_relation.c:3739 -#: parser/parse_relation.c:3748 +#: parser/parse_relation.c:502 parser/parse_relation.c:3771 +#: parser/parse_relation.c:3780 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "в элементе предложения FROM неверная ссылка на таблицу \"%s\"" -#: parser/parse_relation.c:506 parser/parse_relation.c:3750 +#: parser/parse_relation.c:506 parser/parse_relation.c:3782 #, c-format msgid "" "There is an entry for table \"%s\", but it cannot be referenced from this " @@ -21480,30 +21537,30 @@ msgstr "" msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "Для ссылки LATERAL тип JOIN должен быть INNER или LEFT." -#: parser/parse_relation.c:711 +#: parser/parse_relation.c:743 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "в ограничении-проверке указан недопустимый системный столбец \"%s\"" -#: parser/parse_relation.c:724 +#: parser/parse_relation.c:756 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "" "системный столбец \"%s\" нельзя использовать в выражении генерируемого " "столбца" -#: parser/parse_relation.c:735 +#: parser/parse_relation.c:767 #, c-format msgid "cannot use system column \"%s\" in MERGE WHEN condition" msgstr "системный столбец \"%s\" нельзя использовать в условии MERGE WHEN" -#: parser/parse_relation.c:1251 parser/parse_relation.c:1708 -#: parser/parse_relation.c:2402 +#: parser/parse_relation.c:1283 parser/parse_relation.c:1740 +#: parser/parse_relation.c:2434 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "в таблице \"%s\" содержится столбцов: %d, но указано: %d" -#: parser/parse_relation.c:1462 +#: parser/parse_relation.c:1494 #, c-format msgid "" "There is a WITH item named \"%s\", but it cannot be referenced from this " @@ -21512,7 +21569,7 @@ msgstr "" "В WITH есть элемент \"%s\", но на него нельзя ссылаться из этой части " "запроса." -#: parser/parse_relation.c:1464 +#: parser/parse_relation.c:1496 #, c-format msgid "" "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." @@ -21520,13 +21577,13 @@ msgstr "" "Используйте WITH RECURSIVE или исключите ссылки вперёд, переупорядочив " "элементы WITH." -#: parser/parse_relation.c:1850 +#: parser/parse_relation.c:1882 #, c-format msgid "" "a column definition list is redundant for a function with OUT parameters" msgstr "список определений столбцов не нужен для функции с параметрами OUT" -#: parser/parse_relation.c:1856 +#: parser/parse_relation.c:1888 #, c-format msgid "" "a column definition list is redundant for a function returning a named " @@ -21535,79 +21592,79 @@ msgstr "" "список определений столбцов не нужен для функции, возвращающий именованный " "составной тип" -#: parser/parse_relation.c:1863 +#: parser/parse_relation.c:1895 #, c-format msgid "" "a column definition list is only allowed for functions returning \"record\"" msgstr "" "список определений столбцов может быть только у функций, возвращающих запись" -#: parser/parse_relation.c:1874 +#: parser/parse_relation.c:1906 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "" "у функций, возвращающих запись, должен быть список определений столбцов" -#: parser/parse_relation.c:1911 +#: parser/parse_relation.c:1943 #, c-format msgid "column definition lists can have at most %d entries" msgstr "число элементов в списках определения столбцов ограничено %d" -#: parser/parse_relation.c:1971 +#: parser/parse_relation.c:2003 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "" "функция \"%s\", используемая во FROM, возвращает неподдерживаемый тип %s" -#: parser/parse_relation.c:1998 parser/parse_relation.c:2083 +#: parser/parse_relation.c:2030 parser/parse_relation.c:2115 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "число столбцов, возвращаемых функциями во FROM, ограничено %d" -#: parser/parse_relation.c:2113 +#: parser/parse_relation.c:2145 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "функция %s выдаёт столбцов: %d, но указано: %d" -#: parser/parse_relation.c:2194 +#: parser/parse_relation.c:2226 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "в списках VALUES \"%s\" содержится столбцов: %d, но указано: %d" -#: parser/parse_relation.c:2259 +#: parser/parse_relation.c:2291 #, c-format msgid "joins can have at most %d columns" msgstr "число столбцов в соединениях ограничено %d" -#: parser/parse_relation.c:2284 +#: parser/parse_relation.c:2316 #, c-format msgid "" "join expression \"%s\" has %d columns available but %d columns specified" msgstr "в выражении соединения \"%s\" имеется столбцов: %d, но указано: %d" -#: parser/parse_relation.c:2375 +#: parser/parse_relation.c:2407 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "в запросе \"%s\" в WITH нет предложения RETURNING" -#: parser/parse_relation.c:3741 +#: parser/parse_relation.c:3773 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Возможно, предполагалась ссылка на псевдоним таблицы \"%s\"." -#: parser/parse_relation.c:3753 +#: parser/parse_relation.c:3785 #, c-format msgid "To reference that table, you must mark this subquery with LATERAL." msgstr "" "Чтобы обратиться к этой таблице, нужно добавить для данного подзапроса " "пометку LATERAL." -#: parser/parse_relation.c:3759 +#: parser/parse_relation.c:3791 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "таблица \"%s\" отсутствует в предложении FROM" -#: parser/parse_relation.c:3799 +#: parser/parse_relation.c:3831 #, c-format msgid "" "There are columns named \"%s\", but they are in tables that cannot be " @@ -21616,12 +21673,12 @@ msgstr "" "Имеются столбцы с именем \"%s\", но они относятся к таблицам, к которым " "нельзя обратиться из этой части запроса." -#: parser/parse_relation.c:3801 +#: parser/parse_relation.c:3833 #, c-format msgid "Try using a table-qualified name." msgstr "Попробуйте использовать имя с указанием таблицы." -#: parser/parse_relation.c:3809 +#: parser/parse_relation.c:3841 #, c-format msgid "" "There is a column named \"%s\" in table \"%s\", but it cannot be referenced " @@ -21630,25 +21687,25 @@ msgstr "" "Столбец \"%s\" есть в таблице \"%s\", но на него нельзя ссылаться из этой " "части запроса." -#: parser/parse_relation.c:3812 +#: parser/parse_relation.c:3844 #, c-format msgid "To reference that column, you must mark this subquery with LATERAL." msgstr "" "Чтобы обратиться к этому столбцу, нужно добавить для данного подзапроса " "пометку LATERAL." -#: parser/parse_relation.c:3814 +#: parser/parse_relation.c:3846 #, c-format msgid "To reference that column, you must use a table-qualified name." msgstr "" "Чтобы обратиться к этому столбцу, нужно использовать имя с указанием таблицы." -#: parser/parse_relation.c:3834 +#: parser/parse_relation.c:3866 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Возможно, предполагалась ссылка на столбец \"%s.%s\"." -#: parser/parse_relation.c:3848 +#: parser/parse_relation.c:3880 #, c-format msgid "" "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." @@ -21867,81 +21924,81 @@ msgstr "отношение \"%s\" не подходит для предложе msgid "Index \"%s\" contains a whole-row table reference." msgstr "Индекс \"%s\" ссылается на тип всей строки таблицы." -#: parser/parse_utilcmd.c:2419 +#: parser/parse_utilcmd.c:2423 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "в CREATE TABLE нельзя использовать существующий индекс" -#: parser/parse_utilcmd.c:2439 +#: parser/parse_utilcmd.c:2443 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "индекс \"%s\" уже связан с ограничением" -#: parser/parse_utilcmd.c:2465 +#: parser/parse_utilcmd.c:2469 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" не является уникальным индексом" -#: parser/parse_utilcmd.c:2466 parser/parse_utilcmd.c:2473 -#: parser/parse_utilcmd.c:2480 parser/parse_utilcmd.c:2556 +#: parser/parse_utilcmd.c:2470 parser/parse_utilcmd.c:2477 +#: parser/parse_utilcmd.c:2484 parser/parse_utilcmd.c:2560 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "" "Создать первичный ключ или ограничение уникальности для такого индекса " "нельзя." -#: parser/parse_utilcmd.c:2472 +#: parser/parse_utilcmd.c:2476 #, c-format msgid "index \"%s\" contains expressions" msgstr "индекс \"%s\" содержит выражения" -#: parser/parse_utilcmd.c:2479 +#: parser/parse_utilcmd.c:2483 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" - частичный индекс" -#: parser/parse_utilcmd.c:2491 +#: parser/parse_utilcmd.c:2495 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" - откладываемый индекс" -#: parser/parse_utilcmd.c:2492 +#: parser/parse_utilcmd.c:2496 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "" "Создать не откладываемое ограничение на базе откладываемого индекса нельзя." -#: parser/parse_utilcmd.c:2555 +#: parser/parse_utilcmd.c:2559 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "" "в индексе \"%s\" для столбца номер %d не определено поведение сортировки по " "умолчанию" -#: parser/parse_utilcmd.c:2747 +#: parser/parse_utilcmd.c:2751 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "столбец \"%s\" фигурирует в первичном ключе дважды" -#: parser/parse_utilcmd.c:2753 +#: parser/parse_utilcmd.c:2757 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "столбец \"%s\" фигурирует в ограничении уникальности дважды" -#: parser/parse_utilcmd.c:2798 +#: parser/parse_utilcmd.c:2807 #, c-format msgid "column \"%s\" in WITHOUT OVERLAPS is not a range or multirange type" msgstr "" "столбец \"%s\" в WITHOUT OVERLAPS не диапазонного или мультидиапазонного типа" -#: parser/parse_utilcmd.c:2826 +#: parser/parse_utilcmd.c:2835 #, c-format msgid "constraint using WITHOUT OVERLAPS needs at least two columns" msgstr "" "для ограничения, использующего WITHOUT OVERLAPS, требуются минимум два " "столбца" -#: parser/parse_utilcmd.c:3123 +#: parser/parse_utilcmd.c:3132 #, c-format msgid "" "index expressions and predicates can refer only to the table being indexed" @@ -21949,22 +22006,22 @@ msgstr "" "индексные выражения и предикаты могут ссылаться только на индексируемую " "таблицу" -#: parser/parse_utilcmd.c:3195 +#: parser/parse_utilcmd.c:3204 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "выражения статистики могут ссылаться только на целевую таблицу" -#: parser/parse_utilcmd.c:3238 +#: parser/parse_utilcmd.c:3247 #, c-format msgid "rules on materialized views are not supported" msgstr "правила для материализованных представлений не поддерживаются" -#: parser/parse_utilcmd.c:3298 +#: parser/parse_utilcmd.c:3307 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "в условиях WHERE для правил нельзя ссылаться на другие отношения" -#: parser/parse_utilcmd.c:3370 +#: parser/parse_utilcmd.c:3379 #, c-format msgid "" "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE " @@ -21973,173 +22030,173 @@ msgstr "" "правила с условиями WHERE могут содержать только действия SELECT, INSERT, " "UPDATE или DELETE" -#: parser/parse_utilcmd.c:3388 parser/parse_utilcmd.c:3489 -#: rewrite/rewriteHandler.c:546 rewrite/rewriteManip.c:1187 +#: parser/parse_utilcmd.c:3397 parser/parse_utilcmd.c:3498 +#: rewrite/rewriteHandler.c:545 rewrite/rewriteManip.c:1198 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "условные операторы UNION/INTERSECT/EXCEPT не реализованы" -#: parser/parse_utilcmd.c:3406 +#: parser/parse_utilcmd.c:3415 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "в правиле ON SELECT нельзя использовать OLD" -#: parser/parse_utilcmd.c:3410 +#: parser/parse_utilcmd.c:3419 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "в правиле ON SELECT нельзя использовать NEW" -#: parser/parse_utilcmd.c:3419 +#: parser/parse_utilcmd.c:3428 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "в правиле ON INSERT нельзя использовать OLD" -#: parser/parse_utilcmd.c:3425 +#: parser/parse_utilcmd.c:3434 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "в правиле ON DELETE нельзя использовать NEW" -#: parser/parse_utilcmd.c:3453 +#: parser/parse_utilcmd.c:3462 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "в запросе WITH нельзя ссылаться на OLD" -#: parser/parse_utilcmd.c:3460 +#: parser/parse_utilcmd.c:3469 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "в запросе WITH нельзя ссылаться на NEW" -#: parser/parse_utilcmd.c:3918 +#: parser/parse_utilcmd.c:3927 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "предложение DEFERRABLE расположено неправильно" -#: parser/parse_utilcmd.c:3923 parser/parse_utilcmd.c:3938 +#: parser/parse_utilcmd.c:3932 parser/parse_utilcmd.c:3947 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "DEFERRABLE/NOT DEFERRABLE можно указать только один раз" -#: parser/parse_utilcmd.c:3933 +#: parser/parse_utilcmd.c:3942 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "предложение NOT DEFERRABLE расположено неправильно" -#: parser/parse_utilcmd.c:3946 parser/parse_utilcmd.c:3972 gram.y:6229 +#: parser/parse_utilcmd.c:3955 parser/parse_utilcmd.c:3981 gram.y:6229 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "" "ограничение со свойством INITIALLY DEFERRED должно быть объявлено как " "DEFERRABLE" -#: parser/parse_utilcmd.c:3954 +#: parser/parse_utilcmd.c:3963 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "предложение INITIALLY DEFERRED расположено неправильно" -#: parser/parse_utilcmd.c:3959 parser/parse_utilcmd.c:3985 +#: parser/parse_utilcmd.c:3968 parser/parse_utilcmd.c:3994 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "INITIALLY IMMEDIATE/DEFERRED можно указать только один раз" -#: parser/parse_utilcmd.c:3980 +#: parser/parse_utilcmd.c:3989 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "предложение INITIALLY IMMEDIATE расположено неправильно" -#: parser/parse_utilcmd.c:3997 +#: parser/parse_utilcmd.c:4006 #, c-format msgid "misplaced ENFORCED clause" msgstr "предложение ENFORCED расположено неправильно" -#: parser/parse_utilcmd.c:4002 parser/parse_utilcmd.c:4019 +#: parser/parse_utilcmd.c:4011 parser/parse_utilcmd.c:4028 #, c-format msgid "multiple ENFORCED/NOT ENFORCED clauses not allowed" msgstr "ENFORCED/NOT ENFORCED можно указать только один раз" -#: parser/parse_utilcmd.c:4014 +#: parser/parse_utilcmd.c:4023 #, c-format msgid "misplaced NOT ENFORCED clause" msgstr "предложение NOT ENFORCED расположено неправильно" -#: parser/parse_utilcmd.c:4212 +#: parser/parse_utilcmd.c:4221 #, c-format msgid "" "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "в CREATE указана схема (%s), отличная от создаваемой (%s)" -#: parser/parse_utilcmd.c:4247 +#: parser/parse_utilcmd.c:4256 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" — не секционированная таблица" -#: parser/parse_utilcmd.c:4254 +#: parser/parse_utilcmd.c:4263 #, c-format msgid "table \"%s\" is not partitioned" msgstr "таблица \"%s\" не является секционированной" -#: parser/parse_utilcmd.c:4261 +#: parser/parse_utilcmd.c:4270 #, c-format msgid "index \"%s\" is not partitioned" msgstr "индекс \"%s\" не секционирован" -#: parser/parse_utilcmd.c:4301 +#: parser/parse_utilcmd.c:4310 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "у секционированной по хешу таблицы не может быть секции по умолчанию" -#: parser/parse_utilcmd.c:4318 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "invalid bound specification for a hash partition" msgstr "неправильное указание ограничения для хеш-секции" -#: parser/parse_utilcmd.c:4324 partitioning/partbounds.c:4802 +#: parser/parse_utilcmd.c:4333 partitioning/partbounds.c:4802 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "модуль для хеш-секции должен быть положительным целым" -#: parser/parse_utilcmd.c:4331 partitioning/partbounds.c:4810 +#: parser/parse_utilcmd.c:4340 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "остаток для хеш-секции должен быть меньше модуля" -#: parser/parse_utilcmd.c:4344 +#: parser/parse_utilcmd.c:4353 #, c-format msgid "invalid bound specification for a list partition" msgstr "неправильное указание ограничения для секции по списку" -#: parser/parse_utilcmd.c:4397 +#: parser/parse_utilcmd.c:4406 #, c-format msgid "invalid bound specification for a range partition" msgstr "неправильное указание ограничения для секции по диапазону" -#: parser/parse_utilcmd.c:4403 +#: parser/parse_utilcmd.c:4412 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "" "во FROM должно указываться ровно одно значение для секционирующего столбца" -#: parser/parse_utilcmd.c:4407 +#: parser/parse_utilcmd.c:4416 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "" "в TO должно указываться ровно одно значение для секционирующего столбца" -#: parser/parse_utilcmd.c:4523 +#: parser/parse_utilcmd.c:4532 #, c-format msgid "cannot specify NULL in range bound" msgstr "указать NULL в диапазонном ограничении нельзя" -#: parser/parse_utilcmd.c:4571 +#: parser/parse_utilcmd.c:4580 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "за границей MAXVALUE могут следовать только границы MAXVALUE" -#: parser/parse_utilcmd.c:4578 +#: parser/parse_utilcmd.c:4587 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "за границей MINVALUE могут следовать только границы MINVALUE" -#: parser/parse_utilcmd.c:4621 +#: parser/parse_utilcmd.c:4630 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "указанное значение нельзя привести к типу %s столбца \"%s\"" @@ -22242,7 +22299,7 @@ msgstr "значение остатка для хеш-секции должно msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" не является таблицей, секционированной по хешу" -#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4958 +#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4970 #, c-format msgid "" "number of partitioning columns (%d) does not match number of partition keys " @@ -22259,7 +22316,7 @@ msgstr "" "столбец %d ключа секционирования имеет тип %s, но для него передано значение " "типа %s" -#: partitioning/partbounds.c:4895 +#: partitioning/partbounds.c:4901 #, c-format msgid "" "column %d of the partition key has type \"%s\", but supplied value is of " @@ -22648,7 +22705,7 @@ msgstr "" "фоновый процесс \"%s\": параллельные исполнители не могут быть настроены для " "перезапуска" -#: postmaster/bgworker.c:710 tcop/postgres.c:3343 +#: postmaster/bgworker.c:710 tcop/postgres.c:3344 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "завершение фонового процесса \"%s\" по команде администратора" @@ -22881,22 +22938,22 @@ msgstr "в модулях архивирования должен объявля msgid "archive modules must register an archive callback" msgstr "модули архивирования должны регистрировать обработчик вызова архивации" -#: postmaster/postmaster.c:678 +#: postmaster/postmaster.c:679 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: неверный аргумент для параметра -f: \"%s\"\n" -#: postmaster/postmaster.c:751 +#: postmaster/postmaster.c:752 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: неверный аргумент для параметра -t: \"%s\"\n" -#: postmaster/postmaster.c:774 +#: postmaster/postmaster.c:775 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: неверный аргумент: \"%s\"\n" -#: postmaster/postmaster.c:842 +#: postmaster/postmaster.c:843 #, c-format msgid "" "%s: \"superuser_reserved_connections\" (%d) plus " @@ -22905,12 +22962,12 @@ msgstr "" "%s: значение \"superuser_reserved_connections\" (%d) плюс " "\"reserved_connections\" (%d) должно быть меньше \"max_connections\" (%d)\n" -#: postmaster/postmaster.c:850 +#: postmaster/postmaster.c:851 #, c-format msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" msgstr "архивацию WAL нельзя включить, если \"wal_level\" = \"minimal\"" -#: postmaster/postmaster.c:853 +#: postmaster/postmaster.c:854 #, c-format msgid "" "WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be " @@ -22919,103 +22976,103 @@ msgstr "" "для потоковой трансляции WAL (\"max_wal_senders\" > 0) \"wal_level\" должен " "быть \"replica\" или \"logical\"" -#: postmaster/postmaster.c:856 +#: postmaster/postmaster.c:857 #, c-format msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" msgstr "обобщение WAL нельзя включить, если выбран \"wal_level\" \"minimal\"" -#: postmaster/postmaster.c:864 +#: postmaster/postmaster.c:865 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: ошибка в таблицах маркеров времени, требуется исправление\n" -#: postmaster/postmaster.c:1025 +#: postmaster/postmaster.c:1026 #, c-format msgid "could not create I/O completion port for child queue" msgstr "не удалось создать порт завершения ввода/вывода для очереди потомков" -#: postmaster/postmaster.c:1091 +#: postmaster/postmaster.c:1092 #, c-format msgid "ending log output to stderr" msgstr "завершение вывода в stderr" -#: postmaster/postmaster.c:1092 +#: postmaster/postmaster.c:1093 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "В дальнейшем протокол будет выводиться в \"%s\"." -#: postmaster/postmaster.c:1103 +#: postmaster/postmaster.c:1104 #, c-format msgid "starting %s" msgstr "запускается %s" -#: postmaster/postmaster.c:1165 +#: postmaster/postmaster.c:1166 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "не удалось создать принимающий сокет для \"%s\"" -#: postmaster/postmaster.c:1171 +#: postmaster/postmaster.c:1172 #, c-format msgid "could not create any TCP/IP sockets" msgstr "не удалось создать сокеты TCP/IP" -#: postmaster/postmaster.c:1203 +#: postmaster/postmaster.c:1204 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "функция DNSServiceRegister() выдала ошибку с кодом %ld" -#: postmaster/postmaster.c:1256 +#: postmaster/postmaster.c:1257 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "не удалось создать Unix-сокет в каталоге \"%s\"" -#: postmaster/postmaster.c:1262 +#: postmaster/postmaster.c:1263 #, c-format msgid "could not create any Unix-domain sockets" msgstr "ни один Unix-сокет создать не удалось" -#: postmaster/postmaster.c:1273 +#: postmaster/postmaster.c:1274 #, c-format msgid "no socket created for listening" msgstr "отсутствуют принимающие сокеты" -#: postmaster/postmaster.c:1304 +#: postmaster/postmaster.c:1305 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %m\n" msgstr "%s: не удалось поменять права для внешнего файла PID \"%s\": %m\n" -#: postmaster/postmaster.c:1308 +#: postmaster/postmaster.c:1309 #, c-format msgid "%s: could not write external PID file \"%s\": %m\n" msgstr "%s: не удалось записать внешний файл PID \"%s\": %m\n" #. translator: %s is a configuration file -#: postmaster/postmaster.c:1336 utils/init/postinit.c:225 +#: postmaster/postmaster.c:1337 utils/init/postinit.c:225 #, c-format msgid "could not load %s" msgstr "не удалось загрузить %s" -#: postmaster/postmaster.c:1364 +#: postmaster/postmaster.c:1365 #, c-format msgid "postmaster became multithreaded during startup" msgstr "процесс postmaster стал многопоточным при запуске" -#: postmaster/postmaster.c:1365 postmaster/postmaster.c:3668 +#: postmaster/postmaster.c:1366 postmaster/postmaster.c:3650 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Установите в переменной окружения LC_ALL правильную локаль." -#: postmaster/postmaster.c:1468 +#: postmaster/postmaster.c:1469 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: не удалось найти путь к собственному исполняемому файлу" -#: postmaster/postmaster.c:1475 +#: postmaster/postmaster.c:1476 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: подходящий исполняемый файл postgres не найден" -#: postmaster/postmaster.c:1498 utils/misc/tzparser.c:342 +#: postmaster/postmaster.c:1499 utils/misc/tzparser.c:342 #, c-format msgid "" "This may indicate an incomplete PostgreSQL installation, or that the file " @@ -23024,7 +23081,7 @@ msgstr "" "Возможно, PostgreSQL установлен не полностью или файла \"%s\" нет в " "положенном месте." -#: postmaster/postmaster.c:1525 +#: postmaster/postmaster.c:1526 #, c-format msgid "" "%s: could not find the database system\n" @@ -23037,232 +23094,227 @@ msgstr "" # well-spelled: неподчиняющимся #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1762 +#: postmaster/postmaster.c:1763 #, c-format msgid "issuing %s to recalcitrant children" msgstr "неподчиняющимся потомкам посылается %s" -#: postmaster/postmaster.c:1784 +#: postmaster/postmaster.c:1785 #, c-format msgid "" "performing immediate shutdown because data directory lock file is invalid" msgstr "" "немедленное отключение из-за ошибочного файла блокировки каталога данных" -#: postmaster/postmaster.c:2004 +#: postmaster/postmaster.c:2005 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "получен SIGHUP, файлы конфигурации перезагружаются" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2012 postmaster/postmaster.c:2016 +#: postmaster/postmaster.c:2013 postmaster/postmaster.c:2017 #, c-format msgid "%s was not reloaded" msgstr "%s не был перезагружен" -#: postmaster/postmaster.c:2026 +#: postmaster/postmaster.c:2027 #, c-format msgid "SSL configuration was not reloaded" msgstr "конфигурация SSL не была перезагружена" -#: postmaster/postmaster.c:2112 +#: postmaster/postmaster.c:2113 #, c-format msgid "received smart shutdown request" msgstr "получен запрос на \"вежливое\" выключение" -#: postmaster/postmaster.c:2153 +#: postmaster/postmaster.c:2154 #, c-format msgid "received fast shutdown request" msgstr "получен запрос на быстрое выключение" -#: postmaster/postmaster.c:2171 +#: postmaster/postmaster.c:2172 #, c-format msgid "aborting any active transactions" msgstr "прерывание всех активных транзакций" -#: postmaster/postmaster.c:2195 +#: postmaster/postmaster.c:2196 #, c-format msgid "received immediate shutdown request" msgstr "получен запрос на немедленное выключение" -#: postmaster/postmaster.c:2270 +#: postmaster/postmaster.c:2271 #, c-format msgid "shutdown at recovery target" msgstr "выключение при достижении цели восстановления" -#: postmaster/postmaster.c:2288 postmaster/postmaster.c:2324 +#: postmaster/postmaster.c:2309 msgid "startup process" msgstr "стартовый процесс" -#: postmaster/postmaster.c:2291 -#, c-format -msgid "aborting startup due to startup process failure" -msgstr "прерывание запуска из-за ошибки в стартовом процессе" - -#: postmaster/postmaster.c:2347 +#: postmaster/postmaster.c:2332 #, c-format msgid "database system is ready to accept connections" msgstr "система БД готова принимать подключения" -#: postmaster/postmaster.c:2369 +#: postmaster/postmaster.c:2354 msgid "background writer process" msgstr "процесс фоновой записи" -#: postmaster/postmaster.c:2402 +#: postmaster/postmaster.c:2387 msgid "checkpointer process" msgstr "процесс контрольных точек" -#: postmaster/postmaster.c:2419 +#: postmaster/postmaster.c:2404 msgid "WAL writer process" msgstr "процесс записи WAL" -#: postmaster/postmaster.c:2435 +#: postmaster/postmaster.c:2420 msgid "WAL receiver process" msgstr "процесс считывания WAL" -#: postmaster/postmaster.c:2450 +#: postmaster/postmaster.c:2435 msgid "WAL summarizer process" msgstr "процесс обобщения WAL" -#: postmaster/postmaster.c:2466 +#: postmaster/postmaster.c:2451 msgid "autovacuum launcher process" msgstr "процесс запуска автоочистки" -#: postmaster/postmaster.c:2482 +#: postmaster/postmaster.c:2467 msgid "archiver process" msgstr "процесс архивации" -#: postmaster/postmaster.c:2497 +#: postmaster/postmaster.c:2482 msgid "system logger process" msgstr "процесс системного протоколирования" -#: postmaster/postmaster.c:2515 +#: postmaster/postmaster.c:2500 msgid "slot sync worker process" msgstr "рабочий процесс синхронизации слотов" -#: postmaster/postmaster.c:2523 utils/init/miscinit.c:297 +#: postmaster/postmaster.c:2508 utils/init/miscinit.c:297 msgid "io worker" msgstr "рабочий процесс ввода/вывода" # well-spelled: неотслеживаемый -#: postmaster/postmaster.c:2545 postmaster/postmaster.c:2547 +#: postmaster/postmaster.c:2530 postmaster/postmaster.c:2532 msgid "untracked child process" msgstr "неотслеживаемый дочерний процесс" -#: postmaster/postmaster.c:2580 +#: postmaster/postmaster.c:2565 #, c-format msgid "background worker \"%s\"" msgstr "фоновый процесс \"%s\"" -#: postmaster/postmaster.c:2804 +#: postmaster/postmaster.c:2786 #, 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:2837 +#: postmaster/postmaster.c:2819 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) завершился с кодом выхода %d" -#: postmaster/postmaster.c:2839 postmaster/postmaster.c:2851 -#: postmaster/postmaster.c:2861 postmaster/postmaster.c:2872 +#: postmaster/postmaster.c:2821 postmaster/postmaster.c:2833 +#: postmaster/postmaster.c:2843 postmaster/postmaster.c:2854 #, 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:2848 +#: postmaster/postmaster.c:2830 #, 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:2858 +#: postmaster/postmaster.c:2840 #, 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:2870 +#: postmaster/postmaster.c:2852 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) завершился с нераспознанным кодом состояния %d" -#: postmaster/postmaster.c:3161 +#: postmaster/postmaster.c:3143 #, c-format msgid "abnormal database system shutdown" msgstr "аварийное выключение системы БД" -#: postmaster/postmaster.c:3187 +#: postmaster/postmaster.c:3169 #, c-format msgid "shutting down due to startup process failure" msgstr "сервер останавливается из-за ошибки в стартовом процессе" -#: postmaster/postmaster.c:3193 +#: postmaster/postmaster.c:3175 #, c-format msgid "shutting down because \"restart_after_crash\" is off" msgstr "сервер останавливается, так как \"restart_after_crash\" = \"off\"" -#: postmaster/postmaster.c:3205 +#: postmaster/postmaster.c:3187 #, c-format msgid "all server processes terminated; reinitializing" msgstr "все серверные процессы завершены... переинициализация" -#: postmaster/postmaster.c:3598 +#: postmaster/postmaster.c:3580 #, c-format msgid "could not fork new process for connection: %m" msgstr "породить новый процесс для соединения не удалось: %m" -#: postmaster/postmaster.c:3633 +#: postmaster/postmaster.c:3615 msgid "could not fork new process for connection: " msgstr "породить новый процесс для соединения не удалось: " -#: postmaster/postmaster.c:3667 +#: postmaster/postmaster.c:3649 #, c-format msgid "postmaster became multithreaded" msgstr "процесс postmaster стал многопоточным" -#: postmaster/postmaster.c:3745 +#: postmaster/postmaster.c:3727 #, c-format msgid "database system is ready to accept read-only connections" msgstr "система БД готова принимать подключения в режиме \"только чтение\"" -#: postmaster/postmaster.c:3846 +#: postmaster/postmaster.c:3828 #, c-format msgid "WAL was shut down unexpectedly" msgstr "WAL был неожиданно остановлен" -#: postmaster/postmaster.c:3971 +#: postmaster/postmaster.c:3953 #, c-format msgid "no slot available for new autovacuum worker process" msgstr "для нового рабочего процесса автоочистки не нашлось слота" -#: postmaster/postmaster.c:3986 +#: postmaster/postmaster.c:3968 #, c-format msgid "could not fork \"%s\" process: %m" msgstr "породить процесс \"%s\" не удалось: %m" -#: postmaster/postmaster.c:4145 +#: postmaster/postmaster.c:4127 #, c-format msgid "no slot available for new background worker process" msgstr "для нового фонового рабочего процесса нет свободного слота" -#: postmaster/postmaster.c:4163 +#: postmaster/postmaster.c:4145 #, c-format msgid "could not fork background worker process: %m" msgstr "породить фоновый рабочий процесс не удалось: %m" -#: postmaster/postmaster.c:4496 +#: postmaster/postmaster.c:4478 #, c-format msgid "could not read exit code for process\n" msgstr "прочитать код завершения процесса не удалось\n" -#: postmaster/postmaster.c:4538 +#: postmaster/postmaster.c:4520 #, c-format msgid "could not post child completion status\n" msgstr "отправить состояние завершения потомка не удалось\n" @@ -23317,12 +23369,12 @@ msgstr "не удалось открыть файл протокола \"%s\": % msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "отключение автопрокрутки (чтобы включить, передайте SIGHUP)" -#: postmaster/walsummarizer.c:743 +#: postmaster/walsummarizer.c:784 #, c-format msgid "WAL summarization is not progressing" msgstr "процесс обобщения WAL не продвигается" -#: postmaster/walsummarizer.c:744 +#: postmaster/walsummarizer.c:785 #, c-format msgid "" "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/" @@ -23331,7 +23383,7 @@ msgstr "" "Обобщение должно охватить %X/%X, но оно остановилось на позиции %X/%X на " "диске и %X/%X в памяти." -#: postmaster/walsummarizer.c:758 +#: postmaster/walsummarizer.c:799 #, c-format msgid "still waiting for WAL summarization through %X/%X after %ld second" msgid_plural "" @@ -23340,22 +23392,22 @@ msgstr[0] "ожидание обобщения позиции %X/%X продол msgstr[1] "ожидание обобщения позиции %X/%X продолжается %ld сек." msgstr[2] "ожидание обобщения позиции %X/%X продолжается %ld сек." -#: postmaster/walsummarizer.c:763 +#: postmaster/walsummarizer.c:804 #, c-format msgid "Summarization has reached %X/%X on disk and %X/%X in memory." msgstr "Процесс обобщения достиг позиции %X/%X на диске и %X/%X в памяти." -#: postmaster/walsummarizer.c:1003 +#: postmaster/walsummarizer.c:1103 #, c-format msgid "could not find a valid record after %X/%X" msgstr "не удалось найти корректную запись после %X/%X" -#: postmaster/walsummarizer.c:1048 +#: postmaster/walsummarizer.c:1148 #, c-format msgid "could not read WAL from timeline %u at %X/%X: %s" msgstr "не удалось прочитать WAL с линии времени %u в позиции %X/%X: %s" -#: postmaster/walsummarizer.c:1054 +#: postmaster/walsummarizer.c:1154 #, c-format msgid "could not read WAL from timeline %u at %X/%X" msgstr "не удалось прочитать WAL с линии времени %u в позиции %X/%X" @@ -23401,7 +23453,7 @@ msgid "could not clear search path: %s" msgstr "не удалось очистить путь поиска: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:308 -#: replication/libpqwalreceiver/libpqwalreceiver.c:508 +#: replication/libpqwalreceiver/libpqwalreceiver.c:522 #, c-format msgid "invalid connection string syntax: %s" msgstr "ошибочный синтаксис строки подключения: %s" @@ -23428,7 +23480,8 @@ msgstr "" "сервера: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:455 -#: replication/libpqwalreceiver/libpqwalreceiver.c:762 +#: replication/libpqwalreceiver/libpqwalreceiver.c:795 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1045 #, c-format msgid "invalid response from primary server" msgstr "неверный ответ главного сервера" @@ -23442,91 +23495,103 @@ msgstr "" "Не удалось идентифицировать систему, получено строк: %d, полей: %d " "(ожидалось: %d и %d (или более))." -#: replication/libpqwalreceiver/libpqwalreceiver.c:597 -#: replication/libpqwalreceiver/libpqwalreceiver.c:604 -#: replication/libpqwalreceiver/libpqwalreceiver.c:636 +#: replication/libpqwalreceiver/libpqwalreceiver.c:470 +#, c-format +msgid "could not parse WAL location \"%s\"" +msgstr "не удалось разобрать позицию в WAL \"%s\"" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:669 #, c-format msgid "could not start WAL streaming: %s" msgstr "не удалось начать трансляцию WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:660 +#: replication/libpqwalreceiver/libpqwalreceiver.c:693 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "не удалось отправить главному серверу сообщение о конце передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:684 +#: replication/libpqwalreceiver/libpqwalreceiver.c:717 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "неожиданный набор данных после конца передачи" -#: replication/libpqwalreceiver/libpqwalreceiver.c:700 +#: replication/libpqwalreceiver/libpqwalreceiver.c:733 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ошибка при остановке потоковой операции COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:711 +#: replication/libpqwalreceiver/libpqwalreceiver.c:744 #, c-format msgid "error reading result of streaming command: %s" msgstr "ошибка при чтении результата команды передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:721 -#: replication/libpqwalreceiver/libpqwalreceiver.c:857 +#: replication/libpqwalreceiver/libpqwalreceiver.c:754 +#: replication/libpqwalreceiver/libpqwalreceiver.c:890 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "неожиданный результат после CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:750 +#: replication/libpqwalreceiver/libpqwalreceiver.c:783 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "не удалось получить файл истории линии времени с главного сервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:763 +#: replication/libpqwalreceiver/libpqwalreceiver.c:796 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Ожидался 1 кортеж с 2 полями, однако получено кортежей: %d, полей: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:818 -#: replication/libpqwalreceiver/libpqwalreceiver.c:873 -#: replication/libpqwalreceiver/libpqwalreceiver.c:880 +#: replication/libpqwalreceiver/libpqwalreceiver.c:851 +#: replication/libpqwalreceiver/libpqwalreceiver.c:906 +#: replication/libpqwalreceiver/libpqwalreceiver.c:913 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не удалось получить данные из потока WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:900 +#: replication/libpqwalreceiver/libpqwalreceiver.c:933 #, c-format msgid "could not send data to WAL stream: %s" msgstr "не удалось отправить данные в поток WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1037 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "не удалось создать слот репликации \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1055 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1046 +#, c-format +msgid "" +"Could not create replication slot \"%s\": got %d rows and %d fields, " +"expected %d rows and %d fields." +msgstr "" +"Создать слот репликации \"%s\" не удалось; получено строк: %d, полей: %d " +"(ожидалось: %d и %d)." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1098 #, c-format msgid "could not alter replication slot \"%s\": %s" msgstr "не удалось изменить свойства слота репликации \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1089 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1132 #, c-format msgid "invalid query response" msgstr "неверный ответ на запрос" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1090 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1133 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Ожидалось полей: %d, получено: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1160 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1203 #, c-format msgid "the query interface requires a database connection" msgstr "для интерфейса запросов требуется подключение к БД" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1194 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1237 msgid "empty query" msgstr "пустой запрос" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1200 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1243 msgid "unexpected pipeline mode" msgstr "неожиданный режим канала" @@ -23539,35 +23604,35 @@ msgstr "" "параллельный применяющий процесс логической репликации для подписки \"%s\" " "завершён" -#: replication/logical/applyparallelworker.c:822 +#: replication/logical/applyparallelworker.c:831 #, c-format msgid "lost connection to the logical replication apply worker" msgstr "потеряна связь с применяющим процессом логической репликации" -#: replication/logical/applyparallelworker.c:1031 -#: replication/logical/applyparallelworker.c:1033 +#: replication/logical/applyparallelworker.c:1040 +#: replication/logical/applyparallelworker.c:1042 msgid "logical replication parallel apply worker" msgstr "параллельный применяющий процесс логической репликации" -#: replication/logical/applyparallelworker.c:1047 +#: replication/logical/applyparallelworker.c:1056 #, c-format msgid "logical replication parallel apply worker exited due to error" msgstr "" "параллельный применяющий процесс логической репликации завершён из-за ошибки" -#: replication/logical/applyparallelworker.c:1134 -#: replication/logical/applyparallelworker.c:1307 +#: replication/logical/applyparallelworker.c:1143 +#: replication/logical/applyparallelworker.c:1316 #, c-format msgid "lost connection to the logical replication parallel apply worker" msgstr "" "потеряна связь с параллельным применяющим процессом логическим репликации" -#: replication/logical/applyparallelworker.c:1187 +#: replication/logical/applyparallelworker.c:1196 #, c-format msgid "could not send data to shared-memory queue" msgstr "не удалось передать данные в очередь в разделяемой памяти" -#: replication/logical/applyparallelworker.c:1222 +#: replication/logical/applyparallelworker.c:1231 #, c-format msgid "" "logical replication apply worker will serialize the remaining changes of " @@ -23739,7 +23804,7 @@ msgstr "недостаточно слотов для процессов логи #. translator: %s is a GUC variable name #: replication/logical/launcher.c:438 replication/logical/launcher.c:524 -#: replication/slot.c:1670 replication/slot.c:1690 storage/lmgr/lock.c:1042 +#: replication/slot.c:1672 replication/slot.c:1692 storage/lmgr/lock.c:1042 #: storage/lmgr/lock.c:1080 storage/lmgr/lock.c:2969 storage/lmgr/lock.c:4374 #: storage/lmgr/lock.c:4439 storage/lmgr/lock.c:4789 #: storage/lmgr/predicate.c:2479 storage/lmgr/predicate.c:2494 @@ -23803,8 +23868,8 @@ msgid "cannot use replication slot \"%s\" for logical decoding" msgstr "" "слот репликации \"%s\" нельзя использовать для логического декодирования" -#: replication/logical/logical.c:546 replication/slot.c:858 -#: replication/slot.c:903 +#: replication/logical/logical.c:546 replication/slot.c:860 +#: replication/slot.c:905 #, c-format msgid "This replication slot is being synchronized from the primary server." msgstr "Этот слот репликации синхронизируется с ведущего сервера." @@ -24066,19 +24131,19 @@ msgstr "" msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "целевое отношение логической репликации \"%s.%s\" не существует" -#: replication/logical/reorderbuffer.c:4252 +#: replication/logical/reorderbuffer.c:4276 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не удалось записать в файл данных для XID %u: %m" -#: replication/logical/reorderbuffer.c:4598 -#: replication/logical/reorderbuffer.c:4623 +#: replication/logical/reorderbuffer.c:4622 +#: replication/logical/reorderbuffer.c:4647 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "не удалось прочитать файл подкачки буфера пересортировки: %m" -#: replication/logical/reorderbuffer.c:4602 -#: replication/logical/reorderbuffer.c:4627 +#: replication/logical/reorderbuffer.c:4626 +#: replication/logical/reorderbuffer.c:4651 #, c-format msgid "" "could not read from reorderbuffer spill file: read %d instead of %u bytes" @@ -24086,22 +24151,22 @@ msgstr "" "не удалось прочитать файл подкачки буфера пересортировки (прочитано байт: " "%d, требовалось: %u)" -#: replication/logical/reorderbuffer.c:4876 +#: replication/logical/reorderbuffer.c:4900 #, c-format msgid "could not remove file \"%s\" during removal of %s/%s/xid*: %m" msgstr "ошибка при удалении файла \"%s\" в процессе удаления %s/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:5373 +#: replication/logical/reorderbuffer.c:5397 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d, требовалось: %d)" -#: replication/logical/slotsync.c:214 replication/logical/slotsync.c:596 +#: replication/logical/slotsync.c:225 replication/logical/slotsync.c:623 #, c-format msgid "could not synchronize replication slot \"%s\"" msgstr "не удалось синхронизировать слот репликации \"%s\"" -#: replication/logical/slotsync.c:216 +#: replication/logical/slotsync.c:227 #, c-format msgid "" "Synchronization could lead to data loss, because the remote slot needs WAL " @@ -24112,12 +24177,12 @@ msgstr "" "WAL в позиции LSN %X/%X и xmin каталога %u, но на резервном сервере текущий " "LSN %X/%X и xmin каталога %u." -#: replication/logical/slotsync.c:475 +#: replication/logical/slotsync.c:498 #, c-format msgid "dropped replication slot \"%s\" of database with OID %u" msgstr "слот репликации \"%s\" базы данных с OID %u удалён" -#: replication/logical/slotsync.c:597 +#: replication/logical/slotsync.c:624 #, c-format msgid "" "Synchronization could lead to data loss, because the standby could not build " @@ -24126,12 +24191,12 @@ msgstr "" "Синхронизация могла привести к потере данных, так как резервный сервер не " "смог получить согласованный снимок для декодирования WAL в позиции LSN %X/%X." -#: replication/logical/slotsync.c:606 +#: replication/logical/slotsync.c:633 #, c-format msgid "newly created replication slot \"%s\" is sync-ready now" msgstr "созданный слот репликации \"%s\" сейчас готов к синхронизации" -#: replication/logical/slotsync.c:645 +#: replication/logical/slotsync.c:672 #, c-format msgid "" "skipping slot synchronization because the received slot sync LSN %X/%X for " @@ -24140,7 +24205,7 @@ msgstr "" "синхронизация слота пропускается, потому что полученная позиция LSN %X/%X " "для слота \"%s\" предшествует позиции %X/%X на резервном сервере" -#: replication/logical/slotsync.c:667 +#: replication/logical/slotsync.c:694 #, c-format msgid "" "exiting from slot synchronization because same name slot \"%s\" already " @@ -24149,32 +24214,32 @@ msgstr "" "синхронизация слота отменяется, потому что слот с таким же именем \"%s\" уже " "существует на резервном сервере" -#: replication/logical/slotsync.c:838 +#: replication/logical/slotsync.c:865 #, c-format msgid "could not fetch failover logical slots info from the primary server: %s" msgstr "" "не удалось получить информацию о переносимых логических слотах с главного " "сервера: %s" -#: replication/logical/slotsync.c:987 +#: replication/logical/slotsync.c:1014 #, c-format msgid "" "could not fetch primary slot name \"%s\" info from the primary server: %s" msgstr "не удалось получить информацию о слоте \"%s\" с главного сервера: %s" # skip-rule: nastroy1 -#: replication/logical/slotsync.c:989 +#: replication/logical/slotsync.c:1016 #, c-format msgid "Check if \"primary_slot_name\" is configured correctly." msgstr "Проверьте правильность настройки \"primary_slot_name\"." -#: replication/logical/slotsync.c:1009 +#: replication/logical/slotsync.c:1036 #, c-format msgid "cannot synchronize replication slots from a standby server" msgstr "синхронизировать слоты репликации с резервного сервера нельзя" #. translator: second %s is a GUC variable name -#: replication/logical/slotsync.c:1018 +#: replication/logical/slotsync.c:1045 #, c-format msgid "" "replication slot \"%s\" specified by \"%s\" does not exist on primary server" @@ -24184,41 +24249,40 @@ msgstr "" #. translator: first %s is a connection option; second %s is a GUC #. variable name #. -#: replication/logical/slotsync.c:1051 +#: replication/logical/slotsync.c:1078 #, c-format msgid "" "replication slot synchronization requires \"%s\" to be specified in \"%s\"" msgstr "для синхронизации слотов репликации требуется указание \"%s\" в \"%s\"" -#: replication/logical/slotsync.c:1070 +#: replication/logical/slotsync.c:1097 #, c-format msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" msgstr "" "для синхронизации слотов репликации требуется \"wal_level\" >= \"logical\"" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1085 replication/logical/slotsync.c:1113 +#: replication/logical/slotsync.c:1112 replication/logical/slotsync.c:1140 #, c-format msgid "replication slot synchronization requires \"%s\" to be set" msgstr "для синхронизации слотов репликации требуется установить \"%s\"" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1099 +#: replication/logical/slotsync.c:1126 #, c-format msgid "replication slot synchronization requires \"%s\" to be enabled" msgstr "для синхронизации слотов репликации требуется включить \"%s\"" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1151 +#: replication/logical/slotsync.c:1183 #, c-format msgid "" -"replication slot synchronization worker will shut down because \"%s\" is " -"disabled" +"replication slot synchronization worker will stop because \"%s\" is disabled" msgstr "" "процесс синхронизации слотов репликации будет остановлен, так как \"%s\" " "отключён" -#: replication/logical/slotsync.c:1160 +#: replication/logical/slotsync.c:1201 #, c-format msgid "" "replication slot synchronization worker will restart because of a parameter " @@ -24227,33 +24291,60 @@ msgstr "" "процесс синхронизации слотов репликации будет перезапущен вследствие " "изменения параметров" -#: replication/logical/slotsync.c:1184 +#: replication/logical/slotsync.c:1226 #, c-format msgid "" -"replication slot synchronization worker is shutting down because promotion " -"is triggered" +"replication slot synchronization will stop because of a parameter change" msgstr "" -"процесс синхронизации слотов репликации останавливается, так как вызвана " +"процесс синхронизации слотов репликации будет остановлен вследствие " +"изменения параметров" + +#: replication/logical/slotsync.c:1262 +#, c-format +msgid "" +"replication slot synchronization worker will stop because promotion is " +"triggered" +msgstr "" +"процесс синхронизации слотов репликации будет остановлен, так как вызвана " "процедура повышения сервера" -#: replication/logical/slotsync.c:1309 +#: replication/logical/slotsync.c:1276 #, c-format -msgid "cannot synchronize replication slots when standby promotion is ongoing" +msgid "" +"replication slot synchronization will stop because promotion is triggered" msgstr "" -"синхронизировать слоты репликации, когда выполняется повышение резервного " -"сервера, нельзя" +"синхронизация слотов репликации будет остановлена, так как вызвана процедура " +"повышения сервера" -#: replication/logical/slotsync.c:1317 +#: replication/logical/slotsync.c:1396 +#, c-format +msgid "" +"replication slot synchronization worker will not start because promotion was " +"triggered" +msgstr "" +"процесс синхронизации слотов репликации не будет запущен, так как вызвана " +"процедура повышения сервера" + +#: replication/logical/slotsync.c:1408 +#, c-format +msgid "" +"replication slot synchronization will not start because promotion was " +"triggered" +msgstr "" +"синхронизация слотов репликации не будет запущена, так как вызвана процедура " +"повышения сервера" + +#: replication/logical/slotsync.c:1417 #, c-format msgid "cannot synchronize replication slots concurrently" msgstr "многопоточная синхронизация слотов репликации не поддерживается" -#: replication/logical/slotsync.c:1425 +#: replication/logical/slotsync.c:1529 #, c-format msgid "slot sync worker started" msgstr "рабочий процесс синхронизации слотов запущен" -#: replication/logical/slotsync.c:1487 replication/slotfuncs.c:928 +#: replication/logical/slotsync.c:1591 replication/slotfuncs.c:928 #, c-format msgid "" "synchronization worker \"%s\" could not connect to the primary server: %s" @@ -24391,7 +24482,7 @@ msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "" "не удалось начать копирование начального содержимого таблицы \"%s.%s\": %s" -#: replication/logical/tablesync.c:1380 +#: replication/logical/tablesync.c:1381 #, c-format msgid "" "table synchronization worker for subscription \"%s\" could not connect to " @@ -24400,14 +24491,14 @@ msgstr "" "процесс синхронизации таблицы для подписки \"%s\" не смог подключиться к " "серверу публикации: %s" -#: replication/logical/tablesync.c:1480 +#: replication/logical/tablesync.c:1481 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "" "при копировании таблицы не удалось начать транзакцию на сервере публикации: " "%s" -#: replication/logical/tablesync.c:1540 replication/logical/worker.c:2378 +#: replication/logical/tablesync.c:1541 replication/logical/worker.c:2388 #, c-format msgid "" "user \"%s\" cannot replicate into relation with row-level security enabled: " @@ -24416,7 +24507,7 @@ msgstr "" "пользователь \"%s\" не может реплицировать данные в отношение с включённой " "защитой на уровне строк: \"%s\"" -#: replication/logical/tablesync.c:1553 +#: replication/logical/tablesync.c:1554 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "" @@ -24441,13 +24532,22 @@ msgstr "" "транзакций репликации, передаваемых в потоке, пока все таблицы не " "синхронизированы." -#: replication/logical/worker.c:846 replication/logical/worker.c:961 +#: replication/logical/worker.c:813 replication/logical/worker.c:930 +#: replication/logical/worker.c:2634 +#, c-format +msgid "" +"logical replication column %d not found in tuple: only %d column(s) received" +msgstr "" +"столбец %d для логической репликации не найден в кортеже; всего получено " +"столбцов: %d" + +#: replication/logical/worker.c:852 replication/logical/worker.c:971 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "" "неправильный формат двоичных данных для столбца логической репликации %d" -#: replication/logical/worker.c:2525 +#: replication/logical/worker.c:2535 #, c-format msgid "" "publisher did not send replica identity column expected by the logical " @@ -24456,7 +24556,7 @@ msgstr "" "сервер публикации не передал столбец идентификации реплики, ожидаемый для " "целевого отношения логической репликации \"%s.%s\"" -#: replication/logical/worker.c:2532 +#: replication/logical/worker.c:2542 #, c-format msgid "" "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY " @@ -24467,22 +24567,22 @@ msgstr "" "IDENTITY, ни ключа PRIMARY KEY, и публикуемое отношение не имеет " "характеристики REPLICA IDENTITY FULL" -#: replication/logical/worker.c:3467 +#: replication/logical/worker.c:3482 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "неверный тип сообщения логической репликации \"??? (%d)\"" -#: replication/logical/worker.c:3639 +#: replication/logical/worker.c:3654 #, c-format msgid "data stream from publisher has ended" msgstr "поток данных с сервера публикации закончился" -#: replication/logical/worker.c:3793 +#: replication/logical/worker.c:3808 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "завершение обработчика логической репликации из-за тайм-аута" -#: replication/logical/worker.c:3990 +#: replication/logical/worker.c:4005 #, c-format msgid "" "logical replication worker for subscription \"%s\" will stop because the " @@ -24491,7 +24591,7 @@ msgstr "" "процесс логической репликации для подписки \"%s\" будет остановлен, так как " "подписка была удалена" -#: replication/logical/worker.c:4004 +#: replication/logical/worker.c:4019 #, c-format msgid "" "logical replication worker for subscription \"%s\" will stop because the " @@ -24500,7 +24600,7 @@ msgstr "" "процесс логической репликации для подписки \"%s\" будет остановлен, так как " "подписка была отключена" -#: replication/logical/worker.c:4035 +#: replication/logical/worker.c:4050 #, c-format msgid "" "logical replication parallel apply worker for subscription \"%s\" will stop " @@ -24509,7 +24609,7 @@ msgstr "" "параллельный применяющий процесс логической репликации для подписки \"%s\" " "будет остановлен вследствие изменения параметров" -#: replication/logical/worker.c:4039 +#: replication/logical/worker.c:4054 #, c-format msgid "" "logical replication worker for subscription \"%s\" will restart because of a " @@ -24518,7 +24618,7 @@ msgstr "" "процесс логической репликации для подписки \"%s\" будет перезапущен " "вследствие изменения параметров" -#: replication/logical/worker.c:4053 +#: replication/logical/worker.c:4068 #, c-format msgid "" "logical replication parallel apply worker for subscription \"%s\" will stop " @@ -24528,7 +24628,7 @@ msgstr "" "подписки \"%s\" будет остановлен, потому что владелец подписки был лишён " "прав суперпользователя" -#: replication/logical/worker.c:4057 +#: replication/logical/worker.c:4072 #, c-format msgid "" "logical replication worker for subscription \"%s\" will restart because the " @@ -24537,12 +24637,12 @@ msgstr "" "процесс логической репликации для подписки \"%s\" будет перезапущен, потому " "что владелец подписки был лишён прав суперпользователя" -#: replication/logical/worker.c:4567 +#: replication/logical/worker.c:4582 #, c-format msgid "subscription has no replication slot set" msgstr "для подписки не задан слот репликации" -#: replication/logical/worker.c:4592 +#: replication/logical/worker.c:4607 #, c-format msgid "" "apply worker for subscription \"%s\" could not connect to the publisher: %s" @@ -24550,7 +24650,7 @@ msgstr "" "процесс применения изменений для подписки \"%s\" не смог подключиться к " "серверу публикации: %s" -#: replication/logical/worker.c:4696 +#: replication/logical/worker.c:4711 #, c-format msgid "" "logical replication worker for subscription %u will not start because the " @@ -24559,7 +24659,7 @@ msgstr "" "процесс логической репликации для подписки %u не будет запущен, так как " "подписка была удалена при старте" -#: replication/logical/worker.c:4712 +#: replication/logical/worker.c:4727 #, c-format msgid "" "logical replication worker for subscription \"%s\" will not start because " @@ -24568,7 +24668,7 @@ msgstr "" "процесс логической репликации для подписки \"%s\" не будет запущен, так как " "подписка была отключена при старте" -#: replication/logical/worker.c:4736 +#: replication/logical/worker.c:4751 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " @@ -24577,35 +24677,35 @@ msgstr "" "процесс синхронизации таблицы при логической репликации для подписки \"%s\", " "таблицы \"%s\" запущен" -#: replication/logical/worker.c:4741 +#: replication/logical/worker.c:4756 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "" "запускается применяющий процесс логической репликации для подписки \"%s\"" -#: replication/logical/worker.c:4875 +#: replication/logical/worker.c:4886 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "подписка \"%s\" была отключена из-за ошибки" -#: replication/logical/worker.c:4923 +#: replication/logical/worker.c:4934 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "" "обработчик логической репликации начинает пропускать транзакцию с LSN %X/%X" -#: replication/logical/worker.c:4937 +#: replication/logical/worker.c:4948 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "" "обработчик логической репликации завершил пропуск транзакции с LSN %X/%X" -#: replication/logical/worker.c:5025 +#: replication/logical/worker.c:5036 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "значение skip-LSN для подписки \"%s\" очищено" -#: replication/logical/worker.c:5026 +#: replication/logical/worker.c:5037 #, c-format msgid "" "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN " @@ -24614,7 +24714,7 @@ msgstr "" "Позиция завершения удалённой транзакции в WAL (LSN) %X/%X не совпала со " "значением skip-LSN %X/%X." -#: replication/logical/worker.c:5054 +#: replication/logical/worker.c:5065 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -24623,7 +24723,7 @@ msgstr "" "обработка внешних данных для источника репликации \"%s\" в контексте " "сообщения типа \"%s\"" -#: replication/logical/worker.c:5058 +#: replication/logical/worker.c:5069 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -24632,7 +24732,7 @@ msgstr "" "обработка внешних данных из источника репликации \"%s\" в контексте " "сообщения типа \"%s\" в транзакции %u" -#: replication/logical/worker.c:5063 +#: replication/logical/worker.c:5074 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -24641,7 +24741,7 @@ msgstr "" "обработка внешних данных для источника репликации \"%s\" в контексте " "сообщения типа \"%s\" в транзакции %u, конечная позиция %X/%X" -#: replication/logical/worker.c:5074 +#: replication/logical/worker.c:5085 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -24651,7 +24751,7 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\" в " "транзакции %u" -#: replication/logical/worker.c:5081 +#: replication/logical/worker.c:5092 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -24662,7 +24762,7 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\" в " "транзакции %u, конечная позиция %X/%X" -#: replication/logical/worker.c:5092 +#: replication/logical/worker.c:5103 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -24673,7 +24773,7 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\", столбца " "\"%s\", в транзакции %u" -#: replication/logical/worker.c:5100 +#: replication/logical/worker.c:5111 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -24809,7 +24909,7 @@ msgid "cannot enable failover for a replication slot created on the standby" msgstr "" "слот репликации, созданный на ведомом сервере, не может быть переносимым" -#: replication/slot.c:389 replication/slot.c:925 +#: replication/slot.c:389 replication/slot.c:927 #, c-format msgid "cannot enable failover for a temporary replication slot" msgstr "временный слот репликации не может быть переносимым" @@ -24835,7 +24935,7 @@ msgstr "Освободите ненужный или увеличьте пара msgid "replication slot \"%s\" does not exist" msgstr "слот репликации \"%s\" не существует" -#: replication/slot.c:664 replication/slot.c:1499 +#: replication/slot.c:664 replication/slot.c:1501 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "слот репликации \"%s\" занят процессом с PID %d" @@ -24860,65 +24960,65 @@ msgstr "получен слот логической репликации \"%s\" msgid "acquired physical replication slot \"%s\"" msgstr "получен слот физической репликации \"%s\"" -#: replication/slot.c:789 +#: replication/slot.c:791 #, c-format msgid "released logical replication slot \"%s\"" msgstr "освобождён слот логической репликации \"%s\"" -#: replication/slot.c:791 +#: replication/slot.c:793 #, c-format msgid "released physical replication slot \"%s\"" msgstr "освобождён слот физической репликации \"%s\"" -#: replication/slot.c:857 +#: replication/slot.c:859 #, c-format msgid "cannot drop replication slot \"%s\"" msgstr "удалить слот репликации \"%s\" нельзя" -#: replication/slot.c:890 +#: replication/slot.c:892 #, c-format msgid "cannot use %s with a physical replication slot" msgstr "выполнить %s со слотом физической репликации нельзя" -#: replication/slot.c:902 +#: replication/slot.c:904 #, c-format msgid "cannot alter replication slot \"%s\"" msgstr "изменить слот репликации \"%s\" нельзя" -#: replication/slot.c:912 +#: replication/slot.c:914 #, c-format msgid "cannot enable failover for a replication slot on the standby" msgstr "сделать переносимым слот репликации на ведомом сервере нельзя" -#: replication/slot.c:1060 replication/slot.c:2228 replication/slot.c:2621 +#: replication/slot.c:1062 replication/slot.c:2230 replication/slot.c:2623 #, c-format msgid "could not remove directory \"%s\"" msgstr "ошибка при удалении каталога \"%s\"" -#: replication/slot.c:1534 +#: replication/slot.c:1536 #, c-format msgid "replication slots can only be used if \"max_replication_slots\" > 0" msgstr "" "слоты репликации можно использовать, только если \"max_replication_slots\" > " "0" -#: replication/slot.c:1539 +#: replication/slot.c:1541 #, c-format msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" msgstr "" "слоты репликации можно использовать, только если \"wal_level\" >= \"replica\"" -#: replication/slot.c:1551 +#: replication/slot.c:1553 #, c-format msgid "permission denied to use replication slots" msgstr "нет прав для использования слотов репликации" -#: replication/slot.c:1552 +#: replication/slot.c:1554 #, c-format msgid "Only roles with the %s attribute may use replication slots." msgstr "Использовать слоты репликации могут только роли с атрибутом %s." -#: replication/slot.c:1664 +#: replication/slot.c:1666 #, c-format msgid "The slot's restart_lsn %X/%X exceeds the limit by % byte." msgid_plural "" @@ -24927,12 +25027,12 @@ msgstr[0] "Позиция restart_lsn %X/%X слота превысила пре msgstr[1] "Позиция restart_lsn %X/%X слота превысила предел на % Б." msgstr[2] "Позиция restart_lsn %X/%X слота превысила предел на % Б." -#: replication/slot.c:1675 +#: replication/slot.c:1677 #, c-format msgid "The slot conflicted with xid horizon %u." msgstr "Слот конфликтует с горизонтом xid %u." -#: replication/slot.c:1680 +#: replication/slot.c:1682 msgid "" "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the " "primary server." @@ -24941,7 +25041,7 @@ msgstr "" "\"logical\" на ведущем." #. translator: %s is a GUC variable name -#: replication/slot.c:1686 +#: replication/slot.c:1688 #, c-format msgid "" "The slot's idle time of %lds exceeds the configured \"%s\" duration of %ds." @@ -24949,50 +25049,50 @@ msgstr "" "Время простоя слота %ld сек. превышает настроенную в \"%s\" длительность %d " "сек." -#: replication/slot.c:1700 +#: replication/slot.c:1702 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "завершение процесса %d для освобождения слота репликации \"%s\"" -#: replication/slot.c:1702 +#: replication/slot.c:1704 #, c-format msgid "invalidating obsolete replication slot \"%s\"" msgstr "аннулирование устаревшего слота репликации \"%s\"" -#: replication/slot.c:2559 +#: replication/slot.c:2561 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл слота репликации \"%s\" имеет неправильную сигнатуру (%u вместо %u)" -#: replication/slot.c:2566 +#: replication/slot.c:2568 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "файл состояния snapbuild \"%s\" имеет неподдерживаемую версию %u" -#: replication/slot.c:2573 +#: replication/slot.c:2575 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "у файла слота репликации \"%s\" неверная длина: %u" -#: replication/slot.c:2609 +#: replication/slot.c:2611 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "" "в файле слота репликации \"%s\" неверная контрольная сумма (%u вместо %u)" -#: replication/slot.c:2645 +#: replication/slot.c:2647 #, c-format msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" msgstr "" "существует слот логической репликации \"%s\", но \"wal_level\" < \"logical\"" -#: replication/slot.c:2647 +#: replication/slot.c:2649 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "Смените \"wal_level\" на \"logical\" или более высокий уровень." -#: replication/slot.c:2659 +#: replication/slot.c:2661 #, c-format msgid "" "logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = " @@ -25001,39 +25101,39 @@ msgstr "" "на ведомом сервере существует слот логической репликации \"%s\", но " "\"hot_standby\" = \"off\"" -#: replication/slot.c:2661 +#: replication/slot.c:2663 #, c-format msgid "Change \"hot_standby\" to be \"on\"." msgstr "Смените значение \"hot_standby\" на \"on\"." -#: replication/slot.c:2666 +#: replication/slot.c:2668 #, c-format msgid "" "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "" "существует слот физической репликации \"%s\", но \"wal_level\" < \"replica\"" -#: replication/slot.c:2668 +#: replication/slot.c:2670 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "Смените \"wal_level\" на \"replica\" или более высокий уровень." -#: replication/slot.c:2715 +#: replication/slot.c:2717 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершением активно слишком много слотов репликации" -#: replication/slot.c:2716 +#: replication/slot.c:2718 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "Увеличьте параметр \"max_replication_slots\" и повторите попытку." -#: replication/slot.c:2953 +#: replication/slot.c:2955 #, c-format msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" msgstr "слот репликации \"%s\", указанный в параметре \"%s\", не существует" -#: replication/slot.c:2955 replication/slot.c:2989 replication/slot.c:3004 +#: replication/slot.c:2957 replication/slot.c:2991 replication/slot.c:3006 #, c-format msgid "" "Logical replication is waiting on the standby associated with replication " @@ -25042,30 +25142,30 @@ msgstr "" "Логическая репликация ожидает резервного сервера, связанного со слотом " "репликации \"%s\"." -#: replication/slot.c:2957 +#: replication/slot.c:2959 #, c-format msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." msgstr "Создайте слот репликации \"%s\" или опустите параметр \"%s\"." -#: replication/slot.c:2967 +#: replication/slot.c:2969 #, c-format msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" msgstr "" "слот логической репликации \"%s\" не может быть указан в параметре \"%s\"" -#: replication/slot.c:2969 +#: replication/slot.c:2971 #, c-format msgid "" "Logical replication is waiting for correction on replication slot \"%s\"." msgstr "Логическая репликация ожидает исправления слота репликации \"%s\"." -#: replication/slot.c:2971 +#: replication/slot.c:2973 #, c-format msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." msgstr "" "Удалите указание слота логической репликации \"%s\" из параметра \"%s\"." -#: replication/slot.c:2987 +#: replication/slot.c:2989 #, c-format msgid "" "physical replication slot \"%s\" specified in parameter \"%s\" has been " @@ -25074,14 +25174,14 @@ msgstr "" "слот физической репликации \"%s\", указанный в параметре \"%s\", был " "аннулирован" -#: replication/slot.c:2991 +#: replication/slot.c:2993 #, c-format msgid "" "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." msgstr "" "Удалите и пересоздайте слот репликации \"%s\" или опустите параметр \"%s\"." -#: replication/slot.c:3002 +#: replication/slot.c:3004 #, c-format msgid "" "replication slot \"%s\" specified in parameter \"%s\" does not have " @@ -25090,7 +25190,7 @@ msgstr "" "у слота репликации \"%s\", указанного в параметре \"%s\", нулевое значение " "active_pid" -#: replication/slot.c:3006 +#: replication/slot.c:3008 #, c-format msgid "" "Start the standby associated with the replication slot \"%s\", or amend " @@ -25236,7 +25336,7 @@ msgstr "Разобрать \"%s\" не удалось." msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "число синхронных резервных серверов (%d) должно быть больше нуля" -#: replication/walreceiver.c:276 +#: replication/walreceiver.c:285 #, c-format msgid "" "streaming replication receiver \"%s\" could not connect to the primary " @@ -25245,72 +25345,90 @@ msgstr "" "приёмник потоковой репликации \"%s\" не смог подключиться к главному " "серверу: %s" -#: replication/walreceiver.c:324 +#: replication/walreceiver.c:335 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "идентификаторы СУБД на главном и резервном серверах различаются" -#: replication/walreceiver.c:325 +#: replication/walreceiver.c:336 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Идентификатор на главном сервере: %s, на резервном: %s." -#: replication/walreceiver.c:336 +#: replication/walreceiver.c:347 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "" "последняя линия времени %u на главном сервере отстаёт от восстанавливаемой " "линии времени %u" -#: replication/walreceiver.c:389 +#: replication/walreceiver.c:390 +#, c-format +msgid "" +"walreceiver requested start point %X/%08X on timeline %u is ahead of the " +"upstream server's flush position %X/%08X, waiting" +msgstr "" +"walreceiver запросил начальную точку %X/%08X на линии времени %u, " +"опережающую позицию сброшенных данных на вышестоящем сервере %X/%08X, " +"требуется ожидание" + +#: replication/walreceiver.c:405 +#, c-format +msgid "" +"terminating walreceiver due to timeout while waiting for upstream to catch up" +msgstr "" +"завершение приёма журнала из-за тайм-аута при ожидании достижения требуемой " +"позиции вышестоящим сервером" + +#: replication/walreceiver.c:466 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "" "начало передачи журнала с главного сервера, с позиции %X/%X на линии времени " "%u" -#: replication/walreceiver.c:393 +#: replication/walreceiver.c:470 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "перезапуск передачи журнала с позиции %X/%X на линии времени %u" -#: replication/walreceiver.c:428 +#: replication/walreceiver.c:505 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "продолжить передачу WAL нельзя, восстановление уже окончено" -#: replication/walreceiver.c:472 +#: replication/walreceiver.c:549 #, c-format msgid "replication terminated by primary server" msgstr "репликация прекращена главным сервером" -#: replication/walreceiver.c:473 +#: replication/walreceiver.c:550 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "На линии времени %u в %X/%X достигнут конец журнала." -#: replication/walreceiver.c:573 +#: replication/walreceiver.c:650 #, c-format msgid "terminating walreceiver due to timeout" msgstr "завершение приёма журнала из-за тайм-аута" -#: replication/walreceiver.c:605 +#: replication/walreceiver.c:682 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "" "на главном сервере больше нет журналов для запрошенной линии времени %u" -#: replication/walreceiver.c:621 replication/walreceiver.c:1063 +#: replication/walreceiver.c:698 replication/walreceiver.c:1140 #, c-format msgid "could not close WAL segment %s: %m" msgstr "не удалось закрыть сегмент WAL %s: %m" -#: replication/walreceiver.c:740 +#: replication/walreceiver.c:817 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "загрузка файла истории для линии времени %u с главного сервера" -#: replication/walreceiver.c:951 +#: replication/walreceiver.c:1025 #, c-format msgid "could not write to WAL segment %s at offset %d, length %lu: %m" msgstr "не удалось записать в сегмент WAL %s (смещение %d, длина %lu): %m" @@ -25358,68 +25476,68 @@ msgstr "" "на этом сервере (%X/%X)" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1257 +#: replication/walsender.c:1279 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s требуется выполнять не в транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1267 +#: replication/walsender.c:1289 #, c-format msgid "%s must be called inside a transaction" msgstr "%s требуется выполнять внутри транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1273 +#: replication/walsender.c:1295 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s требуется выполнять в транзакции уровня изоляции REPEATABLE READ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1278 +#: replication/walsender.c:1300 #, c-format msgid "%s must be called in a read-only transaction" msgstr "%s требуется выполнять внутри транзакции только для чтения" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1284 +#: replication/walsender.c:1306 #, c-format msgid "%s must be called before any query" msgstr "%s требуется выполнять до каких-либо запросов" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1290 +#: replication/walsender.c:1312 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s требуется вызывать не в подтранзакции" -#: replication/walsender.c:1467 +#: replication/walsender.c:1489 #, c-format msgid "terminating walsender process after promotion" msgstr "завершение процесса передачи журнала после повышения" -#: replication/walsender.c:2010 +#: replication/walsender.c:2038 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "" "нельзя выполнять новые команды, пока процесс передачи WAL находится в режиме " "остановки" -#: replication/walsender.c:2064 +#: replication/walsender.c:2092 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "" "нельзя выполнять команды SQL в процессе, передающем WAL для физической " "репликации" -#: replication/walsender.c:2095 +#: replication/walsender.c:2123 #, c-format msgid "received replication command: %s" msgstr "получена команда репликации: %s" -#: replication/walsender.c:2103 tcop/fastpath.c:208 tcop/postgres.c:1137 -#: tcop/postgres.c:1494 tcop/postgres.c:1746 tcop/postgres.c:2251 -#: tcop/postgres.c:2688 tcop/postgres.c:2765 +#: replication/walsender.c:2131 tcop/fastpath.c:208 tcop/postgres.c:1138 +#: tcop/postgres.c:1495 tcop/postgres.c:1747 tcop/postgres.c:2252 +#: tcop/postgres.c:2689 tcop/postgres.c:2766 #, c-format msgid "" "current transaction is aborted, commands ignored until end of transaction " @@ -25427,32 +25545,32 @@ msgid "" msgstr "" "текущая транзакция прервана, команды до конца блока транзакции игнорируются" -#: replication/walsender.c:2263 replication/walsender.c:2298 +#: replication/walsender.c:2291 replication/walsender.c:2326 #, c-format msgid "unexpected EOF on standby connection" msgstr "неожиданный обрыв соединения с резервным сервером" -#: replication/walsender.c:2286 +#: replication/walsender.c:2314 #, c-format msgid "invalid standby message type \"%c\"" msgstr "неверный тип сообщения резервного сервера: \"%c\"" -#: replication/walsender.c:2375 +#: replication/walsender.c:2403 #, c-format msgid "unexpected message type \"%c\"" msgstr "неожиданный тип сообщения \"%c\"" -#: replication/walsender.c:2789 +#: replication/walsender.c:2820 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "завершение процесса передачи журнала из-за тайм-аута репликации" -#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:820 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "правило \"%s\" для отношения \"%s\" уже существует" -#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:758 #, c-format msgid "relation \"%s\" cannot have rules" msgstr "к отношению \"%s\" не могут применяться правила" @@ -25518,56 +25636,56 @@ msgstr "в правилах для SELECT не может быть услови msgid "\"%s\" is already a view" msgstr "\"%s\" уже является представлением" -#: rewrite/rewriteDefine.c:408 +#: rewrite/rewriteDefine.c:395 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "правило представления для \"%s\" должно называться \"%s\"" -#: rewrite/rewriteDefine.c:435 +#: rewrite/rewriteDefine.c:420 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "в правиле нельзя указать несколько списков RETURNING" -#: rewrite/rewriteDefine.c:440 +#: rewrite/rewriteDefine.c:425 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "списки RETURNING в условных правилах не поддерживаются" -#: rewrite/rewriteDefine.c:444 +#: rewrite/rewriteDefine.c:429 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "списки RETURNING поддерживаются только в правилах INSTEAD" -#: rewrite/rewriteDefine.c:458 +#: rewrite/rewriteDefine.c:443 rewrite/rewriteDefine.c:839 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "" "не относящееся к представлению правило для \"%s\" не может называться \"%s\"" -#: rewrite/rewriteDefine.c:532 +#: rewrite/rewriteDefine.c:517 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "список результата правила для SELECT содержит слишком много столбцов" -#: rewrite/rewriteDefine.c:533 +#: rewrite/rewriteDefine.c:518 #, c-format msgid "RETURNING list has too many entries" msgstr "список RETURNING содержит слишком много столбцов" -#: rewrite/rewriteDefine.c:560 +#: rewrite/rewriteDefine.c:545 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "" "преобразовать отношение, содержащее удалённые столбцы, в представление нельзя" -#: rewrite/rewriteDefine.c:561 +#: rewrite/rewriteDefine.c:546 #, c-format msgid "" "cannot create a RETURNING list for a relation containing dropped columns" msgstr "" "создать список RETURNING для отношения, содержащего удалённые столбцы, нельзя" -#: rewrite/rewriteDefine.c:567 +#: rewrite/rewriteDefine.c:552 #, c-format msgid "" "SELECT rule's target entry %d has different column name from column \"%s\"" @@ -25575,67 +25693,67 @@ msgstr "" "элементу %d результата правила для SELECT присвоено имя, отличное от имени " "столбца \"%s\"" -#: rewrite/rewriteDefine.c:569 +#: rewrite/rewriteDefine.c:554 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "Имя элемента результата SELECT: \"%s\"." -#: rewrite/rewriteDefine.c:578 +#: rewrite/rewriteDefine.c:563 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "" "элемент %d результата правила для SELECT имеет тип, отличный от типа столбца " "\"%s\"" -#: rewrite/rewriteDefine.c:580 +#: rewrite/rewriteDefine.c:565 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "элемент %d списка RETURNING имеет тип, отличный от типа столбца \"%s\"" -#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 +#: rewrite/rewriteDefine.c:568 rewrite/rewriteDefine.c:592 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "Элемент результата SELECT имеет тип %s, тогда как тип столбца - %s." -#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 +#: rewrite/rewriteDefine.c:571 rewrite/rewriteDefine.c:596 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Элемент списка RETURNING имеет тип %s, тогда как тип столбца - %s." -#: rewrite/rewriteDefine.c:602 +#: rewrite/rewriteDefine.c:587 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "" "элемент %d результата правила для SELECT имеет размер, отличный от столбца " "\"%s\"" -#: rewrite/rewriteDefine.c:604 +#: rewrite/rewriteDefine.c:589 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "элемент %d списка RETURNING имеет размер, отличный от столбца \"%s\"" -#: rewrite/rewriteDefine.c:621 +#: rewrite/rewriteDefine.c:606 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "список результата правила для SELECT содержит недостаточно элементов" -#: rewrite/rewriteDefine.c:622 +#: rewrite/rewriteDefine.c:607 #, c-format msgid "RETURNING list has too few entries" msgstr "список RETURNING содержит недостаточно элементов" -#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 +#: rewrite/rewriteDefine.c:696 rewrite/rewriteDefine.c:811 #: rewrite/rewriteSupport.c:108 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "правило \"%s\" для отношения\"%s\" не существует" -#: rewrite/rewriteDefine.c:845 +#: rewrite/rewriteDefine.c:830 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "переименовывать правило ON SELECT нельзя" -#: rewrite/rewriteHandler.c:590 +#: rewrite/rewriteHandler.c:589 #, c-format msgid "" "WITH query name \"%s\" appears in both a rule action and the query being " @@ -25644,7 +25762,7 @@ msgstr "" "имя запроса WITH \"%s\" оказалось и в действии правила, и в переписываемом " "запросе" -#: rewrite/rewriteHandler.c:620 +#: rewrite/rewriteHandler.c:619 #, c-format msgid "" "INSERT ... SELECT rule actions are not supported for queries having data-" @@ -25653,123 +25771,123 @@ msgstr "" "правила INSERT ... SELECT не поддерживаются для запросов с операторами, " "изменяющими данные, в WITH" -#: rewrite/rewriteHandler.c:674 +#: rewrite/rewriteHandler.c:707 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "RETURNING можно определить только для одного правила" -#: rewrite/rewriteHandler.c:911 rewrite/rewriteHandler.c:950 +#: rewrite/rewriteHandler.c:944 rewrite/rewriteHandler.c:983 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "в столбец \"%s\" можно вставить только значение по умолчанию" -#: rewrite/rewriteHandler.c:913 rewrite/rewriteHandler.c:979 +#: rewrite/rewriteHandler.c:946 rewrite/rewriteHandler.c:1012 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "" "Столбец \"%s\" является столбцом идентификации со свойством GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:915 +#: rewrite/rewriteHandler.c:948 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Для переопределения укажите OVERRIDING SYSTEM VALUE." -#: rewrite/rewriteHandler.c:977 rewrite/rewriteHandler.c:985 +#: rewrite/rewriteHandler.c:1010 rewrite/rewriteHandler.c:1018 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "столбцу \"%s\" можно присвоить только значение DEFAULT" -#: rewrite/rewriteHandler.c:1121 rewrite/rewriteHandler.c:1139 +#: rewrite/rewriteHandler.c:1154 rewrite/rewriteHandler.c:1172 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "многочисленные присвоения одному столбцу \"%s\"" -#: rewrite/rewriteHandler.c:1694 +#: rewrite/rewriteHandler.c:1727 #, c-format msgid "MERGE is not supported for relations with rules." msgstr "MERGE не поддерживается для отношений с правилами." -#: rewrite/rewriteHandler.c:1734 rewrite/rewriteHandler.c:3274 +#: rewrite/rewriteHandler.c:1767 rewrite/rewriteHandler.c:3339 #, c-format msgid "access to non-system view \"%s\" is restricted" msgstr "доступ к несистемному представлению \"%s\" ограничен" -#: rewrite/rewriteHandler.c:2133 rewrite/rewriteHandler.c:4285 +#: rewrite/rewriteHandler.c:2166 rewrite/rewriteHandler.c:4350 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "обнаружена бесконечная рекурсия в правилах для отношения \"%s\"" -#: rewrite/rewriteHandler.c:2238 +#: rewrite/rewriteHandler.c:2271 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "обнаружена бесконечная рекурсия в политике для отношения \"%s\"" -#: rewrite/rewriteHandler.c:2601 +#: rewrite/rewriteHandler.c:2666 msgid "Junk view columns are not updatable." msgstr "Утилизируемые столбцы представлений не обновляются." -#: rewrite/rewriteHandler.c:2606 +#: rewrite/rewriteHandler.c:2671 msgid "" "View columns that are not columns of their base relation are not updatable." msgstr "" "Столбцы представлений, не являющиеся столбцами базовых отношений, не " "обновляются." -#: rewrite/rewriteHandler.c:2609 +#: rewrite/rewriteHandler.c:2674 msgid "View columns that refer to system columns are not updatable." msgstr "" "Столбцы представлений, ссылающиеся на системные столбцы, не обновляются." -#: rewrite/rewriteHandler.c:2612 +#: rewrite/rewriteHandler.c:2677 msgid "View columns that return whole-row references are not updatable." msgstr "" "Столбцы представлений, возвращающие ссылки на всю строку, не обновляются." -#: rewrite/rewriteHandler.c:2673 +#: rewrite/rewriteHandler.c:2738 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Представления с DISTINCT не обновляются автоматически." -#: rewrite/rewriteHandler.c:2676 +#: rewrite/rewriteHandler.c:2741 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Представления с GROUP BY не обновляются автоматически." -#: rewrite/rewriteHandler.c:2679 +#: rewrite/rewriteHandler.c:2744 msgid "Views containing HAVING are not automatically updatable." msgstr "Представления с HAVING не обновляются автоматически." -#: rewrite/rewriteHandler.c:2682 +#: rewrite/rewriteHandler.c:2747 msgid "" "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "" "Представления с UNION, INTERSECT или EXCEPT не обновляются автоматически." -#: rewrite/rewriteHandler.c:2685 +#: rewrite/rewriteHandler.c:2750 msgid "Views containing WITH are not automatically updatable." msgstr "Представления с WITH не обновляются автоматически." -#: rewrite/rewriteHandler.c:2688 +#: rewrite/rewriteHandler.c:2753 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Представления с LIMIT или OFFSET не обновляются автоматически." -#: rewrite/rewriteHandler.c:2700 +#: rewrite/rewriteHandler.c:2765 msgid "Views that return aggregate functions are not automatically updatable." msgstr "" "Представления, возвращающие агрегатные функции, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2703 +#: rewrite/rewriteHandler.c:2768 msgid "Views that return window functions are not automatically updatable." msgstr "" "Представления, возвращающие оконные функции, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2706 +#: rewrite/rewriteHandler.c:2771 msgid "" "Views that return set-returning functions are not automatically updatable." msgstr "" "Представления, возвращающие функции с результатом-множеством, не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:2713 rewrite/rewriteHandler.c:2717 -#: rewrite/rewriteHandler.c:2725 +#: rewrite/rewriteHandler.c:2778 rewrite/rewriteHandler.c:2782 +#: rewrite/rewriteHandler.c:2790 msgid "" "Views that do not select from a single table or view are not automatically " "updatable." @@ -25777,22 +25895,22 @@ msgstr "" "Представления, выбирающие данные не из одной таблицы или представления, не " "обновляются автоматически." -#: rewrite/rewriteHandler.c:2728 +#: rewrite/rewriteHandler.c:2793 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Представления, содержащие TABLESAMPLE, не обновляются автоматически." -#: rewrite/rewriteHandler.c:2752 +#: rewrite/rewriteHandler.c:2817 msgid "Views that have no updatable columns are not automatically updatable." msgstr "" "Представления, не содержащие обновляемых столбцов, не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:3133 rewrite/rewriteHandler.c:3168 +#: rewrite/rewriteHandler.c:3198 rewrite/rewriteHandler.c:3233 #, c-format msgid "cannot insert into view \"%s\"" msgstr "вставить данные в представление \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3136 +#: rewrite/rewriteHandler.c:3201 #, c-format msgid "" "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or " @@ -25801,12 +25919,12 @@ msgstr "" "Чтобы представление допускало добавление данных, установите триггер INSTEAD " "OF INSERT или безусловное правило ON INSERT DO INSTEAD." -#: rewrite/rewriteHandler.c:3141 rewrite/rewriteHandler.c:3177 +#: rewrite/rewriteHandler.c:3206 rewrite/rewriteHandler.c:3242 #, c-format msgid "cannot update view \"%s\"" msgstr "изменить данные в представлении \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3144 +#: rewrite/rewriteHandler.c:3209 #, c-format msgid "" "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an " @@ -25815,12 +25933,12 @@ msgstr "" "Чтобы представление допускало изменение данных, установите триггер INSTEAD " "OF UPDATE или безусловное правило ON UPDATE DO INSTEAD." -#: rewrite/rewriteHandler.c:3149 rewrite/rewriteHandler.c:3186 +#: rewrite/rewriteHandler.c:3214 rewrite/rewriteHandler.c:3251 #, c-format msgid "cannot delete from view \"%s\"" msgstr "удалить данные из представления \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3152 +#: rewrite/rewriteHandler.c:3217 #, c-format msgid "" "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an " @@ -25829,7 +25947,7 @@ msgstr "" "Чтобы представление допускало удаление данных, установите триггер INSTEAD OF " "DELETE или безусловное правило ON DELETE DO INSTEAD." -#: rewrite/rewriteHandler.c:3171 +#: rewrite/rewriteHandler.c:3236 #, c-format msgid "" "To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT " @@ -25838,7 +25956,7 @@ msgstr "" "Чтобы представление допускало добавление данных посредством MERGE, создайте " "триггер INSTEAD OF INSERT." -#: rewrite/rewriteHandler.c:3180 +#: rewrite/rewriteHandler.c:3245 #, c-format msgid "" "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE " @@ -25847,7 +25965,7 @@ msgstr "" "Чтобы представление допускало изменение данных посредством MERGE, создайте " "триггер INSTEAD OF UPDATE." -#: rewrite/rewriteHandler.c:3189 +#: rewrite/rewriteHandler.c:3254 #, c-format msgid "" "To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE " @@ -25856,27 +25974,27 @@ msgstr "" "Чтобы представление допускало удаление данных посредством MERGE, создайте " "триггер INSTEAD OF DELETE." -#: rewrite/rewriteHandler.c:3364 +#: rewrite/rewriteHandler.c:3429 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "вставить данные в столбец \"%s\" представления \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3372 +#: rewrite/rewriteHandler.c:3437 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "изменить данные в столбце \"%s\" представления \"%s\" нельзя" -#: rewrite/rewriteHandler.c:3380 +#: rewrite/rewriteHandler.c:3445 #, c-format msgid "cannot merge into column \"%s\" of view \"%s\"" msgstr "столбец \"%s\" представления \"%s\" не допускает объединение данных" -#: rewrite/rewriteHandler.c:3408 +#: rewrite/rewriteHandler.c:3473 #, c-format msgid "cannot merge into view \"%s\"" msgstr "представление \"%s\" не допускает объединение данных" -#: rewrite/rewriteHandler.c:3410 +#: rewrite/rewriteHandler.c:3475 #, c-format msgid "" "MERGE is not supported for views with INSTEAD OF triggers for some actions " @@ -25885,7 +26003,7 @@ msgstr "" "MERGE не поддерживается для представлений, имеющих триггеры INSTEAD OF для " "некоторых, но не всех действий." -#: rewrite/rewriteHandler.c:3411 +#: rewrite/rewriteHandler.c:3476 #, c-format msgid "" "To enable merging into the view, either provide a full set of INSTEAD OF " @@ -25894,7 +26012,7 @@ msgstr "" "Чтобы представление допускало объединение данных, или предоставьте полный " "набор триггеров INSTEAD OF, или удалите существующие триггеры INSTEAD OF." -#: rewrite/rewriteHandler.c:3942 +#: rewrite/rewriteHandler.c:4007 #, c-format msgid "" "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in " @@ -25903,7 +26021,7 @@ msgstr "" "правила DO INSTEAD NOTIFY не поддерживаются в операторах, изменяющих данные, " "в WITH" -#: rewrite/rewriteHandler.c:3953 +#: rewrite/rewriteHandler.c:4018 #, c-format msgid "" "DO INSTEAD NOTHING rules are not supported for data-modifying statements in " @@ -25912,7 +26030,7 @@ msgstr "" "правила DO INSTEAD NOTHING не поддерживаются в операторах, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3967 +#: rewrite/rewriteHandler.c:4032 #, c-format msgid "" "conditional DO INSTEAD rules are not supported for data-modifying statements " @@ -25921,13 +26039,13 @@ msgstr "" "условные правила DO INSTEAD не поддерживаются для операторов, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3971 +#: rewrite/rewriteHandler.c:4036 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "" "правила DO ALSO не поддерживаются для операторов, изменяющих данные, в WITH" -#: rewrite/rewriteHandler.c:3976 +#: rewrite/rewriteHandler.c:4041 #, c-format msgid "" "multi-statement DO INSTEAD rules are not supported for data-modifying " @@ -25936,50 +26054,50 @@ msgstr "" "составные правила DO INSTEAD не поддерживаются для операторов, изменяющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:4237 +#: rewrite/rewriteHandler.c:4302 msgid "" "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "" "Представления в сочетании с правилами DO INSTEAD с условиями не обновляются " "автоматически." -#: rewrite/rewriteHandler.c:4335 +#: rewrite/rewriteHandler.c:4400 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "выполнить INSERT RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:4337 +#: rewrite/rewriteHandler.c:4402 #, 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:4342 +#: rewrite/rewriteHandler.c:4407 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "выполнить UPDATE RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:4344 +#: rewrite/rewriteHandler.c:4409 #, 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:4349 +#: rewrite/rewriteHandler.c:4414 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "выполнить DELETE RETURNING для отношения \"%s\" нельзя" -#: rewrite/rewriteHandler.c:4351 +#: rewrite/rewriteHandler.c:4416 #, 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:4369 +#: rewrite/rewriteHandler.c:4434 #, c-format msgid "" "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or " @@ -25988,7 +26106,7 @@ msgstr "" "INSERT c предложением ON CONFLICT нельзя использовать с таблицей, для " "которой заданы правила INSERT или UPDATE" -#: rewrite/rewriteHandler.c:4426 +#: rewrite/rewriteHandler.c:4491 #, c-format msgid "" "WITH cannot be used in a query that is rewritten by rules into multiple " @@ -25997,17 +26115,12 @@ msgstr "" "WITH нельзя использовать в запросе, преобразованном правилами в несколько " "запросов" -#: rewrite/rewriteManip.c:1175 +#: rewrite/rewriteManip.c:1186 #, c-format msgid "conditional utility statements are not implemented" msgstr "условные служебные операторы не реализованы" -#: rewrite/rewriteManip.c:1520 -#, c-format -msgid "WHERE CURRENT OF on a view is not implemented" -msgstr "условие WHERE CURRENT OF для представлений не реализовано" - -#: rewrite/rewriteManip.c:1923 +#: rewrite/rewriteManip.c:1915 #, c-format msgid "" "NEW variables in ON UPDATE rules cannot reference columns that are part of a " @@ -26051,8 +26164,8 @@ msgstr "нераспознанный параметр Snowball: \"%s\"" msgid "missing Language parameter" msgstr "отсутствует параметр Language" -#: statistics/attribute_stats.c:192 statistics/attribute_stats.c:937 -#: statistics/relation_stats.c:98 +#: statistics/attribute_stats.c:192 statistics/attribute_stats.c:963 +#: statistics/relation_stats.c:100 #, c-format msgid "Statistics cannot be modified during recovery." msgstr "Статистика не может меняться в режиме восстановления." @@ -26093,17 +26206,31 @@ msgstr "не удалось определить оператор «меньше msgid "column \"%s\" is not a range type" msgstr "столбец \"%s\" не диапазонного типа" -#: statistics/attribute_stats.c:738 +#: statistics/attribute_stats.c:396 +#, c-format +msgid "" +"could not parse \"%s\": incorrect number of elements (same as \"%s\" " +"required)" +msgstr "" +"не удалось разобрать \"%s\": число элементов должно совпадать с числом " +"элементов в \"%s\"" + +#: statistics/attribute_stats.c:755 +#, c-format +msgid "\"%s\" must be a one-dimensional array" +msgstr "значение \"%s\" должно быть одномерным массивом" + +#: statistics/attribute_stats.c:764 #, c-format msgid "\"%s\" array must not contain null values" msgstr "массив \"%s\" не должен содержать значения NULL" -#: statistics/attribute_stats.c:781 +#: statistics/attribute_stats.c:807 #, c-format msgid "maximum number of statistics slots exceeded: %d" msgstr "превышен предел числа слотов статистики: %d" -#: statistics/attribute_stats.c:949 +#: statistics/attribute_stats.c:975 #, c-format msgid "cannot clear statistics on system column \"%s\"" msgstr "очистить статистику для системного столбца \"%s\" нельзя" @@ -26122,7 +26249,12 @@ msgid "" msgstr "" "функция, возвращающая запись, вызвана в контексте, не допускающем этот тип" -#: statistics/relation_stats.c:117 +#: statistics/relation_stats.c:119 +#, c-format +msgid "argument \"%s\" must be a finite value" +msgstr "аргумент \"%s\" должен быть конечным значением" + +#: statistics/relation_stats.c:126 #, c-format msgid "argument \"%s\" must not be less than -1.0" msgstr "аргумент \"%s\" не должен быть меньше -1.0" @@ -26236,22 +26368,24 @@ msgstr "завершение ввода/вывода за процесс %d" msgid "I/O worker executing I/O on behalf of process %d" msgstr "обработчик ввода/вывода, выполняющий ввод/вывод за процесс %d" -#: storage/buffer/bufmgr.c:662 storage/buffer/bufmgr.c:818 +#: storage/aio/read_stream.c:566 storage/buffer/bufmgr.c:662 +#: storage/buffer/bufmgr.c:1204 storage/buffer/bufmgr.c:1284 +#: storage/buffer/bufmgr.c:2600 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "обращаться к временным таблицам других сеансов нельзя" -#: storage/buffer/bufmgr.c:2703 storage/buffer/localbuf.c:393 +#: storage/buffer/bufmgr.c:2726 storage/buffer/localbuf.c:401 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "не удалось увеличить отношение \"%s\" до блока %u" -#: storage/buffer/bufmgr.c:2774 +#: storage/buffer/bufmgr.c:2797 #, c-format msgid "unexpected data beyond EOF in block %u of relation \"%s\"" msgstr "неожиданные данные после EOF в блоке %u отношения \"%s\"" -#: storage/buffer/bufmgr.c:2777 +#: storage/buffer/bufmgr.c:2800 #, c-format msgid "" "This has been seen to occur with buggy kernels; consider updating your " @@ -26260,22 +26394,22 @@ msgstr "" "Эта ситуация может возникать из-за ошибок в ядре; возможно, вам следует " "обновить ОС." -#: storage/buffer/bufmgr.c:6178 +#: storage/buffer/bufmgr.c:6201 #, c-format msgid "could not write block %u of %s" msgstr "не удалось запись блок %u файла %s" -#: storage/buffer/bufmgr.c:6182 +#: storage/buffer/bufmgr.c:6205 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Множественные сбои - возможно, постоянная ошибка записи." -#: storage/buffer/bufmgr.c:6199 storage/buffer/bufmgr.c:6214 +#: storage/buffer/bufmgr.c:6222 storage/buffer/bufmgr.c:6237 #, c-format msgid "writing block %u of relation \"%s\"" msgstr "запись блока %u отношения \"%s\"" -#: storage/buffer/bufmgr.c:7317 +#: storage/buffer/bufmgr.c:7340 #, c-format msgid "" "zeroing %u page(s) and ignoring %u checksum failure(s) among blocks %u..%u " @@ -26284,12 +26418,12 @@ msgstr "" "обнуление %u страниц без реакции на ошибки контрольных сумм (%u) в блоках " "%u..%u отношения \"%s\"" -#: storage/buffer/bufmgr.c:7320 storage/buffer/bufmgr.c:7348 +#: storage/buffer/bufmgr.c:7343 storage/buffer/bufmgr.c:7371 #, c-format msgid "Block %u held the first zeroed page." msgstr "Первую обнулённую страницу содержал блок %u." -#: storage/buffer/bufmgr.c:7322 +#: storage/buffer/bufmgr.c:7345 #, c-format msgid "See server log for details about the other %d invalid block." msgid_plural "See server log for details about the other %d invalid blocks." @@ -26302,55 +26436,55 @@ msgstr[1] "" msgstr[2] "" "Подробные сведения о ещё %d некорректных блоках найти в протоколе сервера." -#: storage/buffer/bufmgr.c:7339 +#: storage/buffer/bufmgr.c:7362 #, c-format msgid "%u invalid pages among blocks %u..%u of relation \"%s\"" msgstr "%u некорректных страниц в блоках %u..%u отношения \"%s\"" -#: storage/buffer/bufmgr.c:7340 +#: storage/buffer/bufmgr.c:7363 #, c-format msgid "Block %u held the first invalid page." msgstr "Первую некорректную страницу содержал блок %u." -#: storage/buffer/bufmgr.c:7341 +#: storage/buffer/bufmgr.c:7364 #, c-format msgid "See server log for the other %u invalid block(s)." msgstr "" "Сведения об остальных %u некорректных блоках можно найти в протоколе сервера." -#: storage/buffer/bufmgr.c:7346 +#: storage/buffer/bufmgr.c:7369 #, c-format msgid "invalid page in block %u of relation \"%s\"; zeroing out page" msgstr "некорректная страница в блоке %u отношения \"%s\"; страница обнуляется" -#: storage/buffer/bufmgr.c:7347 +#: storage/buffer/bufmgr.c:7370 #, c-format msgid "zeroing out %u invalid pages among blocks %u..%u of relation \"%s\"" msgstr "обнуление %u некорректных страниц в блоках %u..%u отношения \"%s\"" -#: storage/buffer/bufmgr.c:7349 +#: storage/buffer/bufmgr.c:7372 #, c-format msgid "See server log for the other %u zeroed block(s)." msgstr "" "Сведения об остальных %u обнулённых блоках можно найти в протоколе сервера." -#: storage/buffer/bufmgr.c:7354 +#: storage/buffer/bufmgr.c:7377 #, c-format msgid "ignoring checksum failure in block %u of relation \"%s\"" msgstr "ошибка контрольной суммы в блоке %u отношения \"%s\" игнорируется" -#: storage/buffer/bufmgr.c:7355 +#: storage/buffer/bufmgr.c:7378 #, c-format msgid "ignoring %u checksum failures among blocks %u..%u of relation \"%s\"" msgstr "" "%u ошибок контрольных сумм в блоках %u..%u отношения \"%s\" игнорируются" -#: storage/buffer/bufmgr.c:7356 +#: storage/buffer/bufmgr.c:7379 #, c-format msgid "Block %u held the first ignored page." msgstr "Первую игнорируемую некорректную страницу содержал блок %u." -#: storage/buffer/bufmgr.c:7357 +#: storage/buffer/bufmgr.c:7380 #, c-format msgid "See server log for the other %u ignored block(s)." msgstr "" @@ -26361,12 +26495,12 @@ msgstr "" msgid "no empty local buffer available" msgstr "нет пустого локального буфера" -#: storage/buffer/localbuf.c:736 +#: storage/buffer/localbuf.c:744 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "обращаться к временным таблицам во время параллельных операций нельзя" -#: storage/buffer/localbuf.c:876 +#: storage/buffer/localbuf.c:884 #, c-format msgid "" "\"temp_buffers\" cannot be changed after any temporary tables have been " @@ -26545,12 +26679,12 @@ msgstr "" msgid "\"%s\" is not supported on this platform." msgstr "\"%s\" не поддерживается на этой платформе." -#: storage/file/fd.c:4030 tcop/backend_startup.c:1080 +#: storage/file/fd.c:4030 tcop/backend_startup.c:1099 #, c-format msgid "Invalid list syntax in parameter \"%s\"." msgstr "Неверный формат списка в параметре \"%s\"." -#: storage/file/fd.c:4050 tcop/backend_startup.c:1054 +#: storage/file/fd.c:4050 tcop/backend_startup.c:1073 #, c-format msgid "Invalid option \"%s\"." msgstr "Неверный параметр \"%s\"." @@ -26718,24 +26852,24 @@ msgstr "" "Только роли с правами роли, которой принадлежит процесс, или с правами роли " "\"%s\" могут завершить этот процесс." -#: storage/ipc/procsignal.c:451 +#: storage/ipc/procsignal.c:460 #, c-format msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "" "продолжается ожидание получения сигнала ProcSignalBarrier обслуживающим " "процессом с PID %d" -#: storage/ipc/procsignal.c:733 +#: storage/ipc/procsignal.c:745 #, c-format msgid "invalid cancel request with PID 0" msgstr "неправильный запрос отмены с PID 0" -#: storage/ipc/procsignal.c:788 +#: storage/ipc/procsignal.c:800 #, c-format msgid "wrong key in cancel request for process %d" msgstr "неправильный ключ в запросе на отмену процесса %d" -#: storage/ipc/procsignal.c:797 +#: storage/ipc/procsignal.c:809 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "процесс с кодом %d, полученным в запросе на отмену, не найден" @@ -26788,17 +26922,12 @@ msgstr "" "недостаточно разделяемой памяти для структуры данных \"%s\" (требовалось " "байт: %zu)" -#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 -#, c-format -msgid "requested shared memory size overflows size_t" -msgstr "запрошенный размер разделяемой памяти не умещается в size_t" - #: storage/ipc/signalfuncs.c:74 #, c-format msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d не относится к обслуживающему процессу PostgreSQL" -#: storage/ipc/signalfuncs.c:123 storage/lmgr/proc.c:1546 +#: storage/ipc/signalfuncs.c:123 storage/lmgr/proc.c:1579 #: utils/adt/mcxtfuncs.c:302 #, c-format msgid "could not send signal to process %d: %m" @@ -26879,13 +27008,13 @@ msgstr "процесс восстановления продолжает ожи msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "процесс восстановления завершил ожидание после %ld.%03d мс: %s" -#: storage/ipc/standby.c:921 tcop/postgres.c:3223 +#: storage/ipc/standby.c:921 tcop/postgres.c:3224 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "" "выполнение оператора отменено из-за конфликта с процессом восстановления" -#: storage/ipc/standby.c:922 tcop/postgres.c:2573 +#: storage/ipc/standby.c:922 tcop/postgres.c:2574 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "" @@ -27194,7 +27323,7 @@ msgstr "" "число запрошенных подключений резервных серверов превышает " "\"max_wal_senders\" (сейчас: %d)" -#: storage/lmgr/proc.c:1591 +#: storage/lmgr/proc.c:1624 #, c-format msgid "" "process %d avoided deadlock for %s on %s by rearranging queue order after " @@ -27203,7 +27332,7 @@ msgstr "" "процесс %d избежал взаимоблокировки, ожидая в режиме %s блокировку \"%s\", " "изменив порядок очереди через %ld.%03d мс" -#: storage/lmgr/proc.c:1606 +#: storage/lmgr/proc.c:1639 #, c-format msgid "" "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" @@ -27211,19 +27340,19 @@ msgstr "" "процесс %d обнаружил взаимоблокировку, ожидая в режиме %s блокировку \"%s\" " "в течение %ld.%03d мс" -#: storage/lmgr/proc.c:1615 +#: storage/lmgr/proc.c:1648 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "" "процесс %d продолжает ожидать в режиме %s блокировку \"%s\" в течение %ld." "%03d мс" -#: storage/lmgr/proc.c:1622 +#: storage/lmgr/proc.c:1655 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "процесс %d получил в режиме %s блокировку \"%s\" через %ld.%03d мс" -#: storage/lmgr/proc.c:1639 +#: storage/lmgr/proc.c:1672 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "" @@ -27422,37 +27551,37 @@ msgstr "запрос прямого SSL-соединения принят" msgid "direct SSL connection rejected" msgstr "запрос прямого SSL-соединения отвергнут" -#: tcop/backend_startup.c:528 tcop/backend_startup.c:556 +#: tcop/backend_startup.c:529 tcop/backend_startup.c:557 #, c-format msgid "incomplete startup packet" msgstr "неполный стартовый пакет" -#: tcop/backend_startup.c:540 +#: tcop/backend_startup.c:541 #, c-format msgid "invalid length of startup packet" msgstr "неверная длина стартового пакета" -#: tcop/backend_startup.c:597 +#: tcop/backend_startup.c:598 #, c-format msgid "SSLRequest accepted" msgstr "SSLRequest принят" -#: tcop/backend_startup.c:600 +#: tcop/backend_startup.c:601 #, c-format msgid "SSLRequest rejected" msgstr "SSLRequest отвергнут" -#: tcop/backend_startup.c:609 +#: tcop/backend_startup.c:610 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "не удалось отправить ответ в процессе SSL-согласования: %m" -#: tcop/backend_startup.c:627 +#: tcop/backend_startup.c:628 #, c-format msgid "received unencrypted data after SSL request" msgstr "после запроса SSL получены незашифрованные данные" -#: tcop/backend_startup.c:628 tcop/backend_startup.c:682 +#: tcop/backend_startup.c:629 tcop/backend_startup.c:692 #, c-format msgid "" "This could be either a client-software bug or evidence of an attempted man-" @@ -27461,60 +27590,60 @@ msgstr "" "Это может свидетельствовать об ошибке в клиентском ПО или о попытке атаки " "MITM." -#: tcop/backend_startup.c:651 +#: tcop/backend_startup.c:661 #, c-format msgid "GSSENCRequest accepted" msgstr "GSSENCRequest принят" -#: tcop/backend_startup.c:654 +#: tcop/backend_startup.c:664 #, c-format msgid "GSSENCRequest rejected" msgstr "GSSENCRequest отвергнут" -#: tcop/backend_startup.c:663 +#: tcop/backend_startup.c:673 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "не удалось отправить ответ в процессе согласования GSSAPI: %m" -#: tcop/backend_startup.c:681 +#: tcop/backend_startup.c:691 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "после запроса шифрования GSSAPI получены незашифрованные данные" -#: tcop/backend_startup.c:709 +#: tcop/backend_startup.c:728 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "" "неподдерживаемый протокол клиентского приложения %u.%u; сервер поддерживает " "%u.0 - %u.%u" -#: tcop/backend_startup.c:772 +#: tcop/backend_startup.c:791 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Допустимые значения: \"false\", 0, \"true\", 1, \"database\"." -#: tcop/backend_startup.c:813 +#: tcop/backend_startup.c:832 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "" "неверная структура стартового пакета: последним байтом должен быть терминатор" -#: tcop/backend_startup.c:830 +#: tcop/backend_startup.c:849 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "в стартовом пакете не указано имя пользователя PostgreSQL" -#: tcop/backend_startup.c:884 +#: tcop/backend_startup.c:903 #, c-format msgid "invalid length of cancel request packet" msgstr "неверная длина пакета отмены запроса" -#: tcop/backend_startup.c:892 +#: tcop/backend_startup.c:911 #, c-format msgid "invalid length of cancel key in cancel request packet" msgstr "неверная длина ключа отмены в пакете отмены запроса" -#: tcop/backend_startup.c:1022 +#: tcop/backend_startup.c:1041 #, c-format msgid "" "Cannot specify log_connections option \"%s\" in a list with other options." @@ -27537,8 +27666,8 @@ msgstr "вызвать функцию \"%s\" через интерфейс fastp msgid "fastpath function call: \"%s\" (OID %u)" msgstr "вызов функции (через fastpath): \"%s\" (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1363 tcop/postgres.c:1599 -#: tcop/postgres.c:2077 tcop/postgres.c:2349 +#: tcop/fastpath.c:312 tcop/postgres.c:1364 tcop/postgres.c:1600 +#: tcop/postgres.c:2078 tcop/postgres.c:2350 #, c-format msgid "duration: %s ms" msgstr "продолжительность: %s мс" @@ -27573,44 +27702,44 @@ msgstr "неверный размер аргумента (%d) в сообщен msgid "incorrect binary data format in function argument %d" msgstr "неправильный формат двоичных данных в аргументе функции %d" -#: tcop/postgres.c:455 tcop/postgres.c:5018 +#: tcop/postgres.c:456 tcop/postgres.c:5022 #, c-format msgid "invalid frontend message type %d" msgstr "неправильный тип клиентского сообщения %d" -#: tcop/postgres.c:1070 +#: tcop/postgres.c:1071 #, c-format msgid "statement: %s" msgstr "оператор: %s" -#: tcop/postgres.c:1368 +#: tcop/postgres.c:1369 #, c-format msgid "duration: %s ms statement: %s" msgstr "продолжительность: %s мс, оператор: %s" -#: tcop/postgres.c:1474 +#: tcop/postgres.c:1475 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "в подготовленный оператор нельзя вставить несколько команд" -#: tcop/postgres.c:1604 +#: tcop/postgres.c:1605 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "продолжительность: %s мс, разбор %s: %s" # [SM]: TO REVIEW -#: tcop/postgres.c:1671 tcop/postgres.c:2669 +#: tcop/postgres.c:1672 tcop/postgres.c:2670 #, c-format msgid "unnamed prepared statement does not exist" msgstr "безымянный подготовленный оператор не существует" -#: tcop/postgres.c:1723 +#: tcop/postgres.c:1724 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "" "неверное число форматов параметров в сообщении Bind (%d, а параметров %d)" -#: tcop/postgres.c:1729 +#: tcop/postgres.c:1730 #, c-format msgid "" "bind message supplies %d parameters, but prepared statement \"%s\" requires " @@ -27619,120 +27748,120 @@ msgstr "" "в сообщении Bind передано неверное число параметров (%d, а подготовленный " "оператор \"%s\" требует %d)" -#: tcop/postgres.c:1943 +#: tcop/postgres.c:1944 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "неверный формат двоичных данных в параметре Bind %d" -#: tcop/postgres.c:2082 +#: tcop/postgres.c:2083 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "продолжительность: %s мс, сообщение Bind %s%s%s: %s" -#: tcop/postgres.c:2137 tcop/postgres.c:2751 +#: tcop/postgres.c:2138 tcop/postgres.c:2752 #, c-format msgid "portal \"%s\" does not exist" msgstr "портал \"%s\" не существует" -#: tcop/postgres.c:2230 +#: tcop/postgres.c:2231 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2232 tcop/postgres.c:2357 +#: tcop/postgres.c:2233 tcop/postgres.c:2358 msgid "execute fetch from" msgstr "выборка из" -#: tcop/postgres.c:2233 tcop/postgres.c:2358 +#: tcop/postgres.c:2234 tcop/postgres.c:2359 msgid "execute" msgstr "выполнение" -#: tcop/postgres.c:2354 +#: tcop/postgres.c:2355 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "продолжительность: %s мс %s %s%s%s: %s" -#: tcop/postgres.c:2502 +#: tcop/postgres.c:2503 #, c-format msgid "prepare: %s" msgstr "подготовка: %s" -#: tcop/postgres.c:2527 +#: tcop/postgres.c:2528 #, c-format msgid "Parameters: %s" msgstr "Параметры: %s" -#: tcop/postgres.c:2542 +#: tcop/postgres.c:2543 #, c-format msgid "Abort reason: recovery conflict" msgstr "Причина прерывания: конфликт при восстановлении" -#: tcop/postgres.c:2558 +#: tcop/postgres.c:2559 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Пользователь удерживал фиксатор разделяемого буфера слишком долго." -#: tcop/postgres.c:2561 +#: tcop/postgres.c:2562 #, c-format msgid "User was holding a relation lock for too long." msgstr "Пользователь удерживал блокировку таблицы слишком долго." -#: tcop/postgres.c:2564 +#: tcop/postgres.c:2565 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "" "Пользователь использовал табличное пространство, которое должно быть удалено." -#: tcop/postgres.c:2567 +#: tcop/postgres.c:2568 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "" "Запросу пользователя нужно было видеть версии строк, которые должны быть " "удалены." -#: tcop/postgres.c:2570 +#: tcop/postgres.c:2571 #, c-format msgid "User was using a logical replication slot that must be invalidated." msgstr "" "Пользователь использовал слот логической репликации, который должен быть " "аннулирован." -#: tcop/postgres.c:2576 +#: tcop/postgres.c:2577 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Пользователь был подключён к базе данных, которая должна быть удалена." -#: tcop/postgres.c:2615 +#: tcop/postgres.c:2616 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "портал \"%s\", параметр $%d = %s" -#: tcop/postgres.c:2618 +#: tcop/postgres.c:2619 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "портал \"%s\", параметр $%d" -#: tcop/postgres.c:2624 +#: tcop/postgres.c:2625 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "неименованный портал, параметр $%d = %s" -#: tcop/postgres.c:2627 +#: tcop/postgres.c:2628 #, c-format msgid "unnamed portal parameter $%d" msgstr "неименованный портал, параметр $%d" -#: tcop/postgres.c:2982 +#: tcop/postgres.c:2983 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "закрытие подключения из-за неожиданного сигнала SIGQUIT" -#: tcop/postgres.c:2988 +#: tcop/postgres.c:2989 #, c-format msgid "terminating connection because of crash of another server process" msgstr "закрытие подключения из-за краха другого серверного процесса" -#: tcop/postgres.c:2989 +#: tcop/postgres.c:2990 #, c-format msgid "" "The postmaster has commanded this server process to roll back the current " @@ -27743,7 +27872,7 @@ msgstr "" "транзакцию и завершиться, так как другой серверный процесс завершился " "аварийно и, возможно, разрушил разделяемую память." -#: tcop/postgres.c:2993 tcop/postgres.c:3246 +#: tcop/postgres.c:2994 tcop/postgres.c:3247 #, c-format msgid "" "In a moment you should be able to reconnect to the database and repeat your " @@ -27752,18 +27881,18 @@ msgstr "" "Вы сможете переподключиться к базе данных и повторить вашу команду сию " "минуту." -#: tcop/postgres.c:3000 +#: tcop/postgres.c:3001 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "" "закрытие подключения вследствие получения команды для немедленного отключения" -#: tcop/postgres.c:3078 +#: tcop/postgres.c:3079 #, c-format msgid "floating-point exception" msgstr "исключение в операции с плавающей точкой" -#: tcop/postgres.c:3079 +#: tcop/postgres.c:3080 #, c-format msgid "" "An invalid floating-point operation was signaled. This probably means an out-" @@ -27773,90 +27902,90 @@ msgstr "" "оказался вне допустимых рамок или произошла ошибка вычисления, например, " "деление на ноль." -#: tcop/postgres.c:3244 +#: tcop/postgres.c:3245 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "закрытие подключения из-за конфликта с процессом восстановления" -#: tcop/postgres.c:3316 +#: tcop/postgres.c:3317 #, c-format msgid "canceling authentication due to timeout" msgstr "отмена проверки подлинности из-за тайм-аута" -#: tcop/postgres.c:3320 +#: tcop/postgres.c:3321 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "прекращение процесса автоочистки по команде администратора" -#: tcop/postgres.c:3324 +#: tcop/postgres.c:3325 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "завершение обработчика логической репликации по команде администратора" -#: tcop/postgres.c:3339 +#: tcop/postgres.c:3340 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "завершение процесса считывания журнала по команде администратора" -#: tcop/postgres.c:3355 +#: tcop/postgres.c:3356 #, c-format msgid "terminating connection due to administrator command" msgstr "закрытие подключения по команде администратора" -#: tcop/postgres.c:3386 +#: tcop/postgres.c:3387 #, c-format msgid "connection to client lost" msgstr "подключение к клиенту потеряно" -#: tcop/postgres.c:3438 +#: tcop/postgres.c:3439 #, c-format msgid "canceling statement due to lock timeout" msgstr "выполнение оператора отменено из-за тайм-аута блокировки" -#: tcop/postgres.c:3445 +#: tcop/postgres.c:3446 #, c-format msgid "canceling statement due to statement timeout" msgstr "выполнение оператора отменено из-за тайм-аута" -#: tcop/postgres.c:3452 +#: tcop/postgres.c:3453 #, c-format msgid "canceling autovacuum task" msgstr "отмена задачи автоочистки" -#: tcop/postgres.c:3465 +#: tcop/postgres.c:3466 #, c-format msgid "canceling statement due to user request" msgstr "выполнение оператора отменено по запросу пользователя" -#: tcop/postgres.c:3486 +#: tcop/postgres.c:3487 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "закрытие подключения из-за тайм-аута простоя в транзакции" -#: tcop/postgres.c:3499 +#: tcop/postgres.c:3500 #, c-format msgid "terminating connection due to transaction timeout" msgstr "закрытие подключения из-за тайм-аута транзакции" -#: tcop/postgres.c:3512 +#: tcop/postgres.c:3513 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "закрытие подключения из-за тайм-аута простоя сеанса" -#: tcop/postgres.c:3548 +#: tcop/postgres.c:3552 #, c-format msgid "\"client_connection_check_interval\" must be set to 0 on this platform." msgstr "" "Значение \"client_connection_check_interval\" должно равняться 0 на этой " "платформе." -#: tcop/postgres.c:3569 +#: tcop/postgres.c:3573 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "" "Этот параметр нельзя включить, когда \"log_statement_stats\" равен true." -#: tcop/postgres.c:3584 +#: tcop/postgres.c:3588 #, c-format msgid "" "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", " @@ -27866,32 +27995,32 @@ msgstr "" "\"log_parser_stats\", \"log_planner_stats\" или \"log_executor_stats\" равны " "true." -#: tcop/postgres.c:4024 +#: tcop/postgres.c:4028 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "неверный аргумент командной строки для серверного процесса: %s" -#: tcop/postgres.c:4025 tcop/postgres.c:4031 +#: tcop/postgres.c:4029 tcop/postgres.c:4035 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Для дополнительной информации попробуйте \"%s --help\"." -#: tcop/postgres.c:4029 +#: tcop/postgres.c:4033 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: неверный аргумент командной строки: %s" -#: tcop/postgres.c:4082 +#: tcop/postgres.c:4086 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: не указаны ни база данных, ни пользователь" -#: tcop/postgres.c:4275 +#: tcop/postgres.c:4279 #, c-format msgid "could not generate random cancel key" msgstr "не удалось сгенерировать случайный ключ отмены" -#: tcop/postgres.c:4677 +#: tcop/postgres.c:4681 #, c-format msgid "" "connection ready: setup total=%.3f ms, fork=%.3f ms, authentication=%.3f ms" @@ -27899,29 +28028,29 @@ msgstr "" "подключение готово: общее время подготовки=%.3f ms, создание процесса=%.3f " "ms, аутентификация=%.3f ms" -#: tcop/postgres.c:4908 +#: tcop/postgres.c:4912 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "неверный подтип сообщения CLOSE: %d" -#: tcop/postgres.c:4945 +#: tcop/postgres.c:4949 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "неверный подтип сообщения DESCRIBE: %d" -#: tcop/postgres.c:5039 +#: tcop/postgres.c:5043 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "" "вызовы функций через fastpath не поддерживаются для реплицирующих соединений" -#: tcop/postgres.c:5043 +#: tcop/postgres.c:5047 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "" "протокол расширенных запросов не поддерживается для реплицирующих соединений" -#: tcop/postgres.c:5189 +#: tcop/postgres.c:5193 #, c-format msgid "" "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s " @@ -28028,17 +28157,17 @@ msgstr "повторяющийся параметр Accept" msgid "unrecognized simple dictionary parameter: \"%s\"" msgstr "нераспознанный параметр словаря simple: \"%s\"" -#: tsearch/dict_synonym.c:120 +#: tsearch/dict_synonym.c:119 #, c-format msgid "unrecognized synonym parameter: \"%s\"" msgstr "нераспознанный параметр функции синонимов: \"%s\"" -#: tsearch/dict_synonym.c:127 +#: tsearch/dict_synonym.c:126 #, c-format msgid "missing Synonyms parameter" msgstr "отсутствует параметр Synonyms" -#: tsearch/dict_synonym.c:134 +#: tsearch/dict_synonym.c:133 #, c-format msgid "could not open synonym file \"%s\": %m" msgstr "не удалось открыть файл синонимов \"%s\": %m" @@ -28118,12 +28247,12 @@ msgid "missing Dictionary parameter" msgstr "отсутствует параметр Dictionary" #: tsearch/spell.c:384 tsearch/spell.c:401 tsearch/spell.c:410 -#: tsearch/spell.c:1041 +#: tsearch/spell.c:1053 #, c-format msgid "invalid affix flag \"%s\"" msgstr "неверный флаг аффиксов \"%s\"" -#: tsearch/spell.c:388 tsearch/spell.c:1045 +#: tsearch/spell.c:388 tsearch/spell.c:1057 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "флаг аффикса \"%s\" вне диапазона" @@ -28148,24 +28277,24 @@ msgstr "не удалось открыть файл словаря \"%s\": %m" msgid "invalid regular expression: %s" msgstr "неверное регулярное выражение: %s" -#: tsearch/spell.c:963 tsearch/spell.c:979 tsearch/spell.c:995 -#: tsearch/spell.c:1011 tsearch/spell.c:1076 gram.y:18905 gram.y:18922 +#: tsearch/spell.c:972 tsearch/spell.c:989 tsearch/spell.c:1006 +#: tsearch/spell.c:1023 tsearch/spell.c:1088 gram.y:18905 gram.y:18922 #, c-format msgid "syntax error" msgstr "ошибка синтаксиса" -#: tsearch/spell.c:1168 tsearch/spell.c:1180 tsearch/spell.c:1744 -#: tsearch/spell.c:1749 tsearch/spell.c:1754 +#: tsearch/spell.c:1182 tsearch/spell.c:1189 tsearch/spell.c:1200 +#: tsearch/spell.c:1773 tsearch/spell.c:1778 tsearch/spell.c:1783 #, c-format msgid "invalid affix alias \"%s\"" msgstr "неверное указание аффикса \"%s\"" -#: tsearch/spell.c:1221 tsearch/spell.c:1292 tsearch/spell.c:1441 +#: tsearch/spell.c:1241 tsearch/spell.c:1312 tsearch/spell.c:1470 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "не удалось открыть файл аффиксов \"%s\": %m" -#: tsearch/spell.c:1275 +#: tsearch/spell.c:1295 #, c-format msgid "" "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag " @@ -28174,22 +28303,27 @@ msgstr "" "словарь Ispell поддерживает для флага только значения \"default\", \"long\" " "и \"num\"" -#: tsearch/spell.c:1319 +#: tsearch/spell.c:1339 #, c-format msgid "invalid number of flag vector aliases" msgstr "неверное количество векторов флагов" -#: tsearch/spell.c:1342 +#: tsearch/spell.c:1362 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "количество псевдонимов превышает заданное число %d" -#: tsearch/spell.c:1556 +#: tsearch/spell.c:1436 +#, c-format +msgid "number of aliases is less than specified number %d" +msgstr "количество псевдонимов меньше заданного числа %d" + +#: tsearch/spell.c:1585 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "файл аффиксов содержит команды и в старом, и в новом стиле" -#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:274 utils/adt/tsvector_op.c:1126 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:274 utils/adt/tsvector_op.c:1099 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "строка слишком длинна для tsvector (%d Б, при максимуме %d)" @@ -28226,26 +28360,32 @@ msgstr "не удалось открыть файл стоп-слов \"%s\": %m msgid "text search parser does not support headline creation" msgstr "анализатор текстового поиска не поддерживает создание выдержек" -#: tsearch/wparser_def.c:2665 +#: tsearch/wparser_def.c:2668 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "нераспознанный параметр функции выдержки: \"%s\"" -#: tsearch/wparser_def.c:2675 +#: tsearch/wparser_def.c:2678 #, c-format msgid "%s must be less than %s" msgstr "%s должно быть меньше %s" -#: tsearch/wparser_def.c:2679 +#: tsearch/wparser_def.c:2682 #, c-format msgid "%s must be positive" msgstr "%s должно быть больше нуля" -#: tsearch/wparser_def.c:2683 tsearch/wparser_def.c:2687 +#: tsearch/wparser_def.c:2686 tsearch/wparser_def.c:2690 #, c-format msgid "%s must be >= 0" msgstr "%s должно быть >= 0" +#: tsearch/wparser_def.c:2729 tsearch/wparser_def.c:2733 +#: tsearch/wparser_def.c:2737 +#, c-format +msgid "value for \"%s\" is too long" +msgstr "значение для \"%s\" слишком длинное" + #: utils/activity/pgstat.c:534 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" @@ -28362,7 +28502,7 @@ msgstr "файл статистики \"%s\" испорчен" msgid "function call to dropped function" msgstr "вызвана функция, которая была удалена" -#: utils/activity/pgstat_shmem.c:536 +#: utils/activity/pgstat_shmem.c:539 #, c-format msgid "Failed while allocating entry %u/%u/%." msgstr "Не удалось выделить память для объекта %u/%u/%." @@ -28482,20 +28622,20 @@ msgstr "функция \"%s\" не существует" msgid "must be able to SET ROLE \"%s\"" msgstr "нужны права для выполнения SET ROLE \"%s\"" -#: utils/adt/array_userfuncs.c:118 utils/adt/array_userfuncs.c:565 -#: utils/adt/array_userfuncs.c:942 utils/adt/json.c:611 utils/adt/json.c:749 +#: utils/adt/array_userfuncs.c:119 utils/adt/array_userfuncs.c:566 +#: utils/adt/array_userfuncs.c:943 utils/adt/json.c:611 utils/adt/json.c:749 #: utils/adt/json.c:799 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 #: utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 #, c-format msgid "could not determine input data type" msgstr "не удалось определить тип входных данных" -#: utils/adt/array_userfuncs.c:123 +#: utils/adt/array_userfuncs.c:124 #, c-format msgid "input data type is not an array" msgstr "тип входных данных не является массивом" -#: utils/adt/array_userfuncs.c:167 utils/adt/array_userfuncs.c:249 +#: utils/adt/array_userfuncs.c:168 utils/adt/array_userfuncs.c:250 #: utils/adt/float.c:1229 utils/adt/float.c:1303 utils/adt/float.c:4107 #: utils/adt/float.c:4145 utils/adt/int.c:807 utils/adt/int.c:829 #: utils/adt/int.c:843 utils/adt/int.c:857 utils/adt/int.c:888 @@ -28503,7 +28643,7 @@ msgstr "тип входных данных не является массиво #: utils/adt/int.c:1054 utils/adt/int.c:1087 utils/adt/int.c:1101 #: utils/adt/int.c:1115 utils/adt/int.c:1146 utils/adt/int.c:1228 #: utils/adt/int.c:1292 utils/adt/int.c:1360 utils/adt/int.c:1366 -#: utils/adt/int8.c:1256 utils/adt/numeric.c:2040 utils/adt/numeric.c:4558 +#: utils/adt/int8.c:1286 utils/adt/numeric.c:2046 utils/adt/numeric.c:4564 #: utils/adt/rangetypes.c:1552 utils/adt/rangetypes.c:1565 #: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1186 #: utils/adt/varlena.c:3240 utils/adt/varlena.c:4174 @@ -28511,58 +28651,63 @@ msgstr "тип входных данных не является массиво msgid "integer out of range" msgstr "целое вне диапазона" -#: utils/adt/array_userfuncs.c:174 utils/adt/array_userfuncs.c:259 +#: utils/adt/array_userfuncs.c:175 utils/adt/array_userfuncs.c:260 #, c-format msgid "argument must be empty or one-dimensional array" msgstr "аргумент должен быть одномерным массивом или пустым" -#: utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:410 -#: utils/adt/array_userfuncs.c:447 utils/adt/array_userfuncs.c:476 -#: utils/adt/array_userfuncs.c:504 +#: utils/adt/array_userfuncs.c:372 utils/adt/array_userfuncs.c:411 +#: utils/adt/array_userfuncs.c:448 utils/adt/array_userfuncs.c:477 +#: utils/adt/array_userfuncs.c:505 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "соединять несовместимые массивы нельзя" -#: utils/adt/array_userfuncs.c:372 +#: utils/adt/array_userfuncs.c:373 #, c-format msgid "" "Arrays with element types %s and %s are not compatible for concatenation." msgstr "Массивы с элементами типов %s и %s несовместимы для соединения." -#: utils/adt/array_userfuncs.c:411 +#: utils/adt/array_userfuncs.c:412 #, c-format msgid "Arrays of %d and %d dimensions are not compatible for concatenation." msgstr "Массивы с размерностями %d и %d несовместимы для соединения." -#: utils/adt/array_userfuncs.c:448 +#: utils/adt/array_userfuncs.c:449 #, c-format msgid "" "Arrays with differing element dimensions are not compatible for " "concatenation." msgstr "Массивы с разными размерностями элементов несовместимы для соединения." -#: utils/adt/array_userfuncs.c:477 utils/adt/array_userfuncs.c:505 +#: utils/adt/array_userfuncs.c:478 utils/adt/array_userfuncs.c:506 #, c-format msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Массивы с разными размерностями несовместимы для соединения." -#: utils/adt/array_userfuncs.c:1051 utils/adt/array_userfuncs.c:1059 -#: utils/adt/arrayfuncs.c:5634 utils/adt/arrayfuncs.c:5640 +#: utils/adt/array_userfuncs.c:1053 utils/adt/array_userfuncs.c:1061 +#: utils/adt/arrayfuncs.c:5643 utils/adt/arrayfuncs.c:5649 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "аккумулировать массивы различной размерности нельзя" -#: utils/adt/array_userfuncs.c:1348 utils/adt/array_userfuncs.c:1502 +#: utils/adt/array_userfuncs.c:1073 utils/adt/arrayfuncs.c:5605 +#, c-format +msgid "array size exceeds the maximum allowed (%zu)" +msgstr "размер массива превышает предел (%zu)" + +#: utils/adt/array_userfuncs.c:1357 utils/adt/array_userfuncs.c:1511 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "поиск элементов в многомерных массивах не поддерживается" -#: utils/adt/array_userfuncs.c:1377 +#: utils/adt/array_userfuncs.c:1386 #, c-format msgid "initial position must not be null" msgstr "начальная позиция не может быть NULL" -#: utils/adt/array_userfuncs.c:1750 +#: utils/adt/array_userfuncs.c:1759 #, c-format msgid "sample size must be between 0 and %d" msgstr "размер выборки должен задаваться числом от 0 до %d" @@ -28667,7 +28812,7 @@ msgid "Unexpected end of input." msgstr "Неожиданный конец ввода." #: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3511 -#: utils/adt/arrayfuncs.c:6126 +#: utils/adt/arrayfuncs.c:6133 #, c-format msgid "invalid number of dimensions: %d" msgstr "неверное число размерностей: %d" @@ -28684,8 +28829,8 @@ msgstr "" "с бинарными данными связан тип элемента массива %u (%s) вместо ожидаемого %u " "(%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 -#: utils/adt/rangetypes.c:353 utils/cache/lsyscache.c:3098 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:451 +#: utils/adt/rangetypes.c:353 utils/cache/lsyscache.c:3260 #, c-format msgid "no binary input function available for type %s" msgstr "для типа %s нет функции ввода двоичных данных" @@ -28695,8 +28840,8 @@ msgstr "для типа %s нет функции ввода двоичных д msgid "improper binary format in array element %d" msgstr "неподходящий двоичный формат в элементе массива %d" -#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 -#: utils/adt/rangetypes.c:358 utils/cache/lsyscache.c:3131 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:456 +#: utils/adt/rangetypes.c:358 utils/cache/lsyscache.c:3293 #, c-format msgid "no binary output function available for type %s" msgstr "для типа %s нет функции вывода двоичных данных" @@ -28708,8 +28853,8 @@ msgstr "разрезание массивов постоянной длины н #: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 #: utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 -#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6112 -#: utils/adt/arrayfuncs.c:6138 utils/adt/arrayfuncs.c:6149 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6119 +#: utils/adt/arrayfuncs.c:6145 utils/adt/arrayfuncs.c:6156 #: utils/adt/json.c:1441 utils/adt/json.c:1509 utils/adt/jsonb.c:1317 #: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4734 utils/adt/jsonfuncs.c:4887 #: utils/adt/jsonfuncs.c:4998 utils/adt/jsonfuncs.c:5046 @@ -28763,8 +28908,8 @@ msgstr "элемент массива null недопустим в данном msgid "cannot compare arrays of different element types" msgstr "нельзя сравнивать массивы с элементами разных типов" -#: utils/adt/arrayfuncs.c:4195 utils/adt/multirangetypes.c:2806 -#: utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1425 +#: utils/adt/arrayfuncs.c:4195 utils/adt/multirangetypes.c:2807 +#: utils/adt/multirangetypes.c:2879 utils/adt/rangetypes.c:1425 #: utils/adt/rangetypes.c:1489 utils/adt/rowtypes.c:1893 #, c-format msgid "could not identify a hash function for type %s" @@ -28780,52 +28925,52 @@ msgstr "не удалось найти функцию расширенного msgid "data type %s is not an array type" msgstr "тип данных %s не является типом массива" -#: utils/adt/arrayfuncs.c:5579 +#: utils/adt/arrayfuncs.c:5580 #, c-format msgid "cannot accumulate null arrays" msgstr "аккумулировать NULL-массивы нельзя" -#: utils/adt/arrayfuncs.c:5607 +#: utils/adt/arrayfuncs.c:5616 #, c-format msgid "cannot accumulate empty arrays" msgstr "аккумулировать пустые массивы нельзя" -#: utils/adt/arrayfuncs.c:6010 utils/adt/arrayfuncs.c:6050 +#: utils/adt/arrayfuncs.c:6017 utils/adt/arrayfuncs.c:6057 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "массив размерностей или массив нижних границ не может быть null" -#: utils/adt/arrayfuncs.c:6113 utils/adt/arrayfuncs.c:6139 +#: utils/adt/arrayfuncs.c:6120 utils/adt/arrayfuncs.c:6146 #, c-format msgid "Dimension array must be one dimensional." msgstr "Массив размерностей должен быть одномерным." -#: utils/adt/arrayfuncs.c:6118 utils/adt/arrayfuncs.c:6144 +#: utils/adt/arrayfuncs.c:6125 utils/adt/arrayfuncs.c:6151 #, c-format msgid "dimension values cannot be null" msgstr "значения размерностей не могут быть null" -#: utils/adt/arrayfuncs.c:6150 +#: utils/adt/arrayfuncs.c:6157 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Массив нижних границ и массив размерностей имеют разные размеры." -#: utils/adt/arrayfuncs.c:6431 +#: utils/adt/arrayfuncs.c:6438 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "удаление элементов из многомерных массивов не поддерживается" -#: utils/adt/arrayfuncs.c:6708 +#: utils/adt/arrayfuncs.c:6715 #, c-format msgid "thresholds must be one-dimensional array" msgstr "границы должны задаваться одномерным массивом" -#: utils/adt/arrayfuncs.c:6713 +#: utils/adt/arrayfuncs.c:6720 #, c-format msgid "thresholds array must not contain NULLs" msgstr "массив границ не должен содержать NULL" -#: utils/adt/arrayfuncs.c:6946 +#: utils/adt/arrayfuncs.c:6953 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "число удаляемых элементов должно быть от 0 до %d" @@ -28866,7 +29011,7 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "преобразование кодировки из %s в ASCII не поддерживается" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:150 utils/adt/cash.c:354 utils/adt/datetime.c:4264 +#: utils/adt/bool.c:150 utils/adt/cash.c:370 utils/adt/datetime.c:4264 #: utils/adt/float.c:207 utils/adt/float.c:294 utils/adt/float.c:308 #: utils/adt/float.c:413 utils/adt/float.c:496 utils/adt/float.c:510 #: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 @@ -28874,38 +29019,38 @@ msgstr "преобразование кодировки из %s в ASCII не п #: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 #: utils/adt/geo_ops.c:4672 utils/adt/int.c:198 utils/adt/int.c:210 #: utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 -#: utils/adt/network.c:99 utils/adt/numeric.c:805 utils/adt/numeric.c:7325 -#: utils/adt/numeric.c:7528 utils/adt/numeric.c:8475 utils/adt/numutils.c:356 +#: utils/adt/network.c:99 utils/adt/numeric.c:805 utils/adt/numeric.c:7331 +#: utils/adt/numeric.c:7534 utils/adt/numeric.c:8481 utils/adt/numutils.c:356 #: utils/adt/numutils.c:617 utils/adt/numutils.c:878 utils/adt/numutils.c:917 #: utils/adt/numutils.c:939 utils/adt/numutils.c:1003 utils/adt/numutils.c:1025 #: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 #: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:512 -#: utils/adt/uuid.c:176 utils/adt/xid8funcs.c:323 +#: utils/adt/uuid.c:193 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "неверный синтаксис для типа %s: \"%s\"" #: utils/adt/cash.c:98 utils/adt/cash.c:111 utils/adt/cash.c:124 -#: utils/adt/cash.c:137 utils/adt/cash.c:150 +#: utils/adt/cash.c:137 utils/adt/cash.c:150 utils/adt/cash.c:174 #, c-format msgid "money out of range" msgstr "денежное значение вне диапазона" -#: utils/adt/cash.c:161 utils/adt/cash.c:725 utils/adt/float.c:106 +#: utils/adt/cash.c:161 utils/adt/cash.c:741 utils/adt/float.c:106 #: utils/adt/int.c:872 utils/adt/int.c:988 utils/adt/int.c:1068 #: utils/adt/int.c:1130 utils/adt/int.c:1168 utils/adt/int.c:1196 -#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 -#: utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 -#: utils/adt/numeric.c:3295 utils/adt/numeric.c:3318 utils/adt/numeric.c:3403 -#: utils/adt/numeric.c:3421 utils/adt/numeric.c:3517 utils/adt/numeric.c:9400 -#: utils/adt/numeric.c:9924 utils/adt/numeric.c:10040 utils/adt/numeric.c:11551 -#: utils/adt/timestamp.c:3772 +#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:972 +#: utils/adt/int8.c:1052 utils/adt/int8.c:1114 utils/adt/int8.c:1194 +#: utils/adt/numeric.c:3301 utils/adt/numeric.c:3324 utils/adt/numeric.c:3409 +#: utils/adt/numeric.c:3427 utils/adt/numeric.c:3523 utils/adt/numeric.c:9406 +#: utils/adt/numeric.c:9930 utils/adt/numeric.c:10046 utils/adt/numeric.c:11557 +#: utils/adt/timestamp.c:3776 #, c-format msgid "division by zero" msgstr "деление на ноль" -#: utils/adt/cash.c:292 utils/adt/cash.c:317 utils/adt/cash.c:327 -#: utils/adt/cash.c:367 utils/adt/int.c:204 utils/adt/numutils.c:350 +#: utils/adt/cash.c:308 utils/adt/cash.c:333 utils/adt/cash.c:343 +#: utils/adt/cash.c:383 utils/adt/int.c:204 utils/adt/numutils.c:350 #: utils/adt/numutils.c:611 utils/adt/numutils.c:872 utils/adt/numutils.c:923 #: utils/adt/numutils.c:962 utils/adt/numutils.c:1009 #, c-format @@ -28938,9 +29083,9 @@ msgstr "TIME(%d)%s: точность должна быть неотрицате msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%s: точность уменьшена до дозволенного максимума: %d" -#: utils/adt/date.c:168 utils/adt/date.c:176 utils/adt/formatting.c:4172 -#: utils/adt/formatting.c:4181 utils/adt/formatting.c:4286 -#: utils/adt/formatting.c:4296 +#: utils/adt/date.c:168 utils/adt/date.c:176 utils/adt/formatting.c:4285 +#: utils/adt/formatting.c:4294 utils/adt/formatting.c:4399 +#: utils/adt/formatting.c:4409 #, c-format msgid "date out of range: \"%s\"" msgstr "дата вне диапазона: \"%s\"" @@ -28973,22 +29118,22 @@ msgid "date out of range for timestamp" msgstr "дата вне диапазона для типа timestamp" #: utils/adt/date.c:1187 utils/adt/date.c:1270 utils/adt/date.c:1286 -#: utils/adt/date.c:2280 utils/adt/date.c:3076 utils/adt/timestamp.c:4724 -#: utils/adt/timestamp.c:4815 utils/adt/timestamp.c:4963 -#: utils/adt/timestamp.c:5064 utils/adt/timestamp.c:5179 -#: utils/adt/timestamp.c:5231 utils/adt/timestamp.c:5488 -#: utils/adt/timestamp.c:5689 utils/adt/timestamp.c:5736 -#: utils/adt/timestamp.c:5960 utils/adt/timestamp.c:6007 -#: utils/adt/timestamp.c:6088 utils/adt/timestamp.c:6232 +#: utils/adt/date.c:2280 utils/adt/date.c:3076 utils/adt/timestamp.c:4728 +#: utils/adt/timestamp.c:4819 utils/adt/timestamp.c:4967 +#: utils/adt/timestamp.c:5068 utils/adt/timestamp.c:5183 +#: utils/adt/timestamp.c:5235 utils/adt/timestamp.c:5492 +#: utils/adt/timestamp.c:5693 utils/adt/timestamp.c:5740 +#: utils/adt/timestamp.c:5964 utils/adt/timestamp.c:6011 +#: utils/adt/timestamp.c:6092 utils/adt/timestamp.c:6236 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "единица \"%s\" для типа %s не поддерживается" #: utils/adt/date.c:1295 utils/adt/date.c:2296 utils/adt/date.c:3096 -#: utils/adt/timestamp.c:4829 utils/adt/timestamp.c:5081 -#: utils/adt/timestamp.c:5245 utils/adt/timestamp.c:5448 -#: utils/adt/timestamp.c:5745 utils/adt/timestamp.c:6016 -#: utils/adt/timestamp.c:6057 utils/adt/timestamp.c:6293 +#: utils/adt/timestamp.c:4833 utils/adt/timestamp.c:5085 +#: utils/adt/timestamp.c:5249 utils/adt/timestamp.c:5452 +#: utils/adt/timestamp.c:5749 utils/adt/timestamp.c:6020 +#: utils/adt/timestamp.c:6061 utils/adt/timestamp.c:6297 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "единица \"%s\" для типа %s не распознана" @@ -28996,38 +29141,38 @@ msgstr "единица \"%s\" для типа %s не распознана" #: utils/adt/date.c:1379 utils/adt/date.c:1425 utils/adt/date.c:1984 #: utils/adt/date.c:2015 utils/adt/date.c:2044 utils/adt/date.c:2934 #: utils/adt/date.c:3166 utils/adt/datetime.c:432 utils/adt/datetime.c:1826 -#: utils/adt/formatting.c:4017 utils/adt/formatting.c:4053 -#: utils/adt/formatting.c:4140 utils/adt/formatting.c:4262 utils/adt/json.c:375 +#: utils/adt/formatting.c:4130 utils/adt/formatting.c:4166 +#: utils/adt/formatting.c:4253 utils/adt/formatting.c:4375 utils/adt/json.c:375 #: utils/adt/json.c:414 utils/adt/timestamp.c:250 utils/adt/timestamp.c:282 #: utils/adt/timestamp.c:707 utils/adt/timestamp.c:716 #: utils/adt/timestamp.c:794 utils/adt/timestamp.c:827 -#: utils/adt/timestamp.c:3125 utils/adt/timestamp.c:3134 -#: utils/adt/timestamp.c:3151 utils/adt/timestamp.c:3156 -#: utils/adt/timestamp.c:3175 utils/adt/timestamp.c:3188 -#: utils/adt/timestamp.c:3199 utils/adt/timestamp.c:3205 -#: utils/adt/timestamp.c:3211 utils/adt/timestamp.c:3216 -#: utils/adt/timestamp.c:3269 utils/adt/timestamp.c:3278 -#: utils/adt/timestamp.c:3299 utils/adt/timestamp.c:3304 -#: utils/adt/timestamp.c:3325 utils/adt/timestamp.c:3338 -#: utils/adt/timestamp.c:3352 utils/adt/timestamp.c:3360 -#: utils/adt/timestamp.c:3366 utils/adt/timestamp.c:3371 -#: utils/adt/timestamp.c:4439 utils/adt/timestamp.c:4591 -#: utils/adt/timestamp.c:4667 utils/adt/timestamp.c:4733 -#: utils/adt/timestamp.c:4823 utils/adt/timestamp.c:4902 -#: utils/adt/timestamp.c:4972 utils/adt/timestamp.c:5075 -#: utils/adt/timestamp.c:5553 utils/adt/timestamp.c:5827 -#: utils/adt/timestamp.c:6361 utils/adt/timestamp.c:6371 -#: utils/adt/timestamp.c:6376 utils/adt/timestamp.c:6382 -#: utils/adt/timestamp.c:6422 utils/adt/timestamp.c:6509 -#: utils/adt/timestamp.c:6550 utils/adt/timestamp.c:6554 -#: utils/adt/timestamp.c:6608 utils/adt/timestamp.c:6612 -#: utils/adt/timestamp.c:6618 utils/adt/timestamp.c:6659 utils/adt/xml.c:2575 +#: utils/adt/timestamp.c:3129 utils/adt/timestamp.c:3138 +#: utils/adt/timestamp.c:3155 utils/adt/timestamp.c:3160 +#: utils/adt/timestamp.c:3179 utils/adt/timestamp.c:3192 +#: utils/adt/timestamp.c:3203 utils/adt/timestamp.c:3209 +#: utils/adt/timestamp.c:3215 utils/adt/timestamp.c:3220 +#: utils/adt/timestamp.c:3273 utils/adt/timestamp.c:3282 +#: utils/adt/timestamp.c:3303 utils/adt/timestamp.c:3308 +#: utils/adt/timestamp.c:3329 utils/adt/timestamp.c:3342 +#: utils/adt/timestamp.c:3356 utils/adt/timestamp.c:3364 +#: utils/adt/timestamp.c:3370 utils/adt/timestamp.c:3375 +#: utils/adt/timestamp.c:4443 utils/adt/timestamp.c:4595 +#: utils/adt/timestamp.c:4671 utils/adt/timestamp.c:4737 +#: utils/adt/timestamp.c:4827 utils/adt/timestamp.c:4906 +#: utils/adt/timestamp.c:4976 utils/adt/timestamp.c:5079 +#: utils/adt/timestamp.c:5557 utils/adt/timestamp.c:5831 +#: utils/adt/timestamp.c:6365 utils/adt/timestamp.c:6375 +#: utils/adt/timestamp.c:6380 utils/adt/timestamp.c:6386 +#: utils/adt/timestamp.c:6426 utils/adt/timestamp.c:6513 +#: utils/adt/timestamp.c:6554 utils/adt/timestamp.c:6558 +#: utils/adt/timestamp.c:6612 utils/adt/timestamp.c:6616 +#: utils/adt/timestamp.c:6622 utils/adt/timestamp.c:6663 utils/adt/xml.c:2575 #: utils/adt/xml.c:2582 utils/adt/xml.c:2602 utils/adt/xml.c:2609 #, c-format msgid "timestamp out of range" msgstr "timestamp вне диапазона" -#: utils/adt/date.c:1601 utils/adt/date.c:2417 utils/adt/formatting.c:4345 +#: utils/adt/date.c:1601 utils/adt/date.c:2417 utils/adt/formatting.c:4458 #, c-format msgid "time out of range" msgstr "время вне диапазона" @@ -29054,9 +29199,9 @@ msgstr "бесконечный интервал нельзя вычесть из #: utils/adt/date.c:2180 utils/adt/date.c:2732 utils/adt/float.c:1043 #: utils/adt/float.c:1119 utils/adt/int.c:664 utils/adt/int.c:711 -#: utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2699 -#: utils/adt/timestamp.c:3869 utils/adt/timestamp.c:3906 -#: utils/adt/timestamp.c:3947 +#: utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2705 +#: utils/adt/timestamp.c:3873 utils/adt/timestamp.c:3910 +#: utils/adt/timestamp.c:3951 #, c-format msgid "invalid preceding or following size in window function" msgstr "неверное смещение PRECEDING или FOLLOWING в оконной функции" @@ -29066,12 +29211,12 @@ msgstr "неверное смещение PRECEDING или FOLLOWING в окон msgid "time zone displacement out of range" msgstr "смещение часового пояса вне диапазона" -#: utils/adt/date.c:3197 utils/adt/timestamp.c:6404 utils/adt/timestamp.c:6641 +#: utils/adt/date.c:3197 utils/adt/timestamp.c:6408 utils/adt/timestamp.c:6645 #, c-format msgid "interval time zone \"%s\" must be finite" msgstr "задающий часовой пояс интервал \"%s\" должен быть конечным" -#: utils/adt/date.c:3204 utils/adt/timestamp.c:6411 utils/adt/timestamp.c:6648 +#: utils/adt/date.c:3204 utils/adt/timestamp.c:6415 utils/adt/timestamp.c:6652 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "" @@ -29255,35 +29400,35 @@ msgstr "\"%s\" вне диапазона для типа double precision" #: utils/adt/float.c:1254 utils/adt/float.c:1328 utils/adt/int.c:384 #: utils/adt/int.c:922 utils/adt/int.c:944 utils/adt/int.c:958 #: utils/adt/int.c:972 utils/adt/int.c:1004 utils/adt/int.c:1242 -#: utils/adt/int8.c:1277 utils/adt/numeric.c:4697 utils/adt/numeric.c:4702 +#: utils/adt/int8.c:1307 utils/adt/numeric.c:4703 utils/adt/numeric.c:4708 #: utils/adt/varlena.c:4149 #, c-format msgid "smallint out of range" msgstr "smallint вне диапазона" -#: utils/adt/float.c:1454 utils/adt/numeric.c:3813 utils/adt/numeric.c:10455 +#: utils/adt/float.c:1454 utils/adt/numeric.c:3819 utils/adt/numeric.c:10461 #, c-format msgid "cannot take square root of a negative number" msgstr "извлечь квадратный корень отрицательного числа нельзя" -#: utils/adt/float.c:1522 utils/adt/numeric.c:4101 utils/adt/numeric.c:4213 +#: utils/adt/float.c:1522 utils/adt/numeric.c:4107 utils/adt/numeric.c:4219 #, c-format msgid "zero raised to a negative power is undefined" msgstr "ноль в отрицательной степени даёт неопределённость" -#: utils/adt/float.c:1526 utils/adt/numeric.c:4105 utils/adt/numeric.c:11346 +#: utils/adt/float.c:1526 utils/adt/numeric.c:4111 utils/adt/numeric.c:11352 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "отрицательное число в дробной степени даёт комплексный результат" -#: utils/adt/float.c:1702 utils/adt/float.c:1735 utils/adt/numeric.c:4013 -#: utils/adt/numeric.c:11126 +#: utils/adt/float.c:1702 utils/adt/float.c:1735 utils/adt/numeric.c:4019 +#: utils/adt/numeric.c:11132 #, c-format msgid "cannot take logarithm of zero" msgstr "вычислить логарифм нуля нельзя" -#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3951 -#: utils/adt/numeric.c:4008 utils/adt/numeric.c:11130 +#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3957 +#: utils/adt/numeric.c:4014 utils/adt/numeric.c:11136 #, c-format msgid "cannot take logarithm of a negative number" msgstr "вычислить логарифм отрицательного числа нельзя" @@ -29297,154 +29442,154 @@ msgstr "вычислить логарифм отрицательного чис msgid "input is out of range" msgstr "введённое значение вне диапазона" -#: utils/adt/float.c:4085 utils/adt/numeric.c:1980 +#: utils/adt/float.c:4085 utils/adt/numeric.c:1986 #, c-format msgid "count must be greater than zero" msgstr "счётчик должен быть больше нуля" -#: utils/adt/float.c:4090 utils/adt/numeric.c:1991 +#: utils/adt/float.c:4090 utils/adt/numeric.c:1997 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "операнд, нижняя и верхняя границы не могут быть NaN" -#: utils/adt/float.c:4096 utils/adt/numeric.c:1996 +#: utils/adt/float.c:4096 utils/adt/numeric.c:2002 #, c-format msgid "lower and upper bounds must be finite" msgstr "нижняя и верхняя границы должны быть конечными" -#: utils/adt/float.c:4162 utils/adt/numeric.c:2010 +#: utils/adt/float.c:4162 utils/adt/numeric.c:2016 #, c-format msgid "lower bound cannot equal upper bound" msgstr "нижняя граница не может равняться верхней" -#: utils/adt/formatting.c:556 +#: utils/adt/formatting.c:557 #, c-format msgid "invalid format specification for an interval value" msgstr "неправильная спецификация формата для целого числа" -#: utils/adt/formatting.c:557 +#: utils/adt/formatting.c:558 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Интервалы не привязываются к определённым календарным датам." -#: utils/adt/formatting.c:1197 +#: utils/adt/formatting.c:1200 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\" может быть только последним шаблоном" -#: utils/adt/formatting.c:1205 +#: utils/adt/formatting.c:1208 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\" должна стоять до \"PR\"" -#: utils/adt/formatting.c:1221 +#: utils/adt/formatting.c:1224 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\" должен стоять до \"PR\"" -#: utils/adt/formatting.c:1248 +#: utils/adt/formatting.c:1251 #, c-format msgid "multiple decimal points" msgstr "многочисленные десятичные точки" -#: utils/adt/formatting.c:1252 utils/adt/formatting.c:1339 +#: utils/adt/formatting.c:1255 utils/adt/formatting.c:1342 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "нельзя использовать \"V\" вместе с десятичной точкой" -#: utils/adt/formatting.c:1264 +#: utils/adt/formatting.c:1267 #, c-format msgid "cannot use \"S\" twice" msgstr "нельзя использовать \"S\" дважды" -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1271 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "нельзя использовать \"S\" вместе с \"PL\"/\"MI\"/\"SG\"/\"PR\"" -#: utils/adt/formatting.c:1288 +#: utils/adt/formatting.c:1291 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "нельзя использовать \"S\" вместе с \"MI\"" -#: utils/adt/formatting.c:1298 +#: utils/adt/formatting.c:1301 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "нельзя использовать \"S\" вместе с \"PL\"" -#: utils/adt/formatting.c:1308 +#: utils/adt/formatting.c:1311 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "нельзя использовать \"S\" вместе с \"SG\"" -#: utils/adt/formatting.c:1317 +#: utils/adt/formatting.c:1320 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "нельзя использовать \"PR\" вместе с \"S\"/\"PL\"/\"MI\"/\"SG\"" -#: utils/adt/formatting.c:1326 +#: utils/adt/formatting.c:1329 #, c-format msgid "cannot use \"RN\" twice" msgstr "нельзя использовать \"RN\" дважды" -#: utils/adt/formatting.c:1347 +#: utils/adt/formatting.c:1350 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "нельзя использовать \"EEEE\" дважды" -#: utils/adt/formatting.c:1353 +#: utils/adt/formatting.c:1356 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\" несовместим с другими форматами" -#: utils/adt/formatting.c:1354 +#: utils/adt/formatting.c:1357 #, c-format msgid "" "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "" "\"EEEE\" может использоваться только с шаблонами цифр и десятичной точки." -#: utils/adt/formatting.c:1363 +#: utils/adt/formatting.c:1366 #, c-format msgid "\"RN\" is incompatible with other formats" msgstr "\"RN\" несовместим с другими форматами" -#: utils/adt/formatting.c:1364 +#: utils/adt/formatting.c:1367 #, c-format msgid "\"RN\" may only be used together with \"FM\"." msgstr "\"RN\" может использоваться только вместе с \"FM\"." -#: utils/adt/formatting.c:1445 +#: utils/adt/formatting.c:1448 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "неверный разделитель в формате datetime: \"%s\"" -#: utils/adt/formatting.c:1572 +#: utils/adt/formatting.c:1575 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" не является числом" -#: utils/adt/formatting.c:1653 utils/adt/formatting.c:1717 -#: utils/adt/formatting.c:1781 utils/adt/formatting.c:1845 +#: utils/adt/formatting.c:1656 utils/adt/formatting.c:1720 +#: utils/adt/formatting.c:1784 utils/adt/formatting.c:1848 #, c-format msgid "could not determine which collation to use for %s function" msgstr "" "не удалось определить, какое правило сортировки использовать для функции %s" # well-spelled: категоризацию -#: utils/adt/formatting.c:1853 +#: utils/adt/formatting.c:1856 #, c-format msgid "Unicode case folding can only be performed if server encoding is UTF8" msgstr "" "сворачивание регистра Unicode можно выполнять, только если кодировка сервера " "— UTF8" -#: utils/adt/formatting.c:2150 +#: utils/adt/formatting.c:2153 #, c-format msgid "invalid combination of date conventions" msgstr "неверное сочетание стилей дат" -#: utils/adt/formatting.c:2151 +#: utils/adt/formatting.c:2154 #, c-format msgid "" "Do not mix Gregorian and ISO week date conventions in a formatting template." @@ -29452,27 +29597,27 @@ msgstr "" "Не смешивайте Григорианский стиль дат (недель) с ISO в одном шаблоне " "форматирования." -#: utils/adt/formatting.c:2173 +#: utils/adt/formatting.c:2176 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "конфликтующие значения поля \"%s\" в строке форматирования" -#: utils/adt/formatting.c:2175 +#: utils/adt/formatting.c:2178 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Это значение противоречит предыдущему значению поля того же типа." -#: utils/adt/formatting.c:2242 +#: utils/adt/formatting.c:2245 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "входная строка короче, чем требует поле форматирования \"%s\"" -#: utils/adt/formatting.c:2244 +#: utils/adt/formatting.c:2247 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Требуется символов: %d, а осталось только %d." -#: utils/adt/formatting.c:2246 utils/adt/formatting.c:2260 +#: utils/adt/formatting.c:2249 utils/adt/formatting.c:2263 #, c-format msgid "" "If your source string is not fixed-width, try using the \"FM\" modifier." @@ -29480,128 +29625,128 @@ msgstr "" "Если входная строка имеет переменную длину, попробуйте использовать " "модификатор \"FM\"." -#: utils/adt/formatting.c:2256 utils/adt/formatting.c:2269 -#: utils/adt/formatting.c:2490 utils/adt/formatting.c:3390 -#: utils/adt/formatting.c:3593 +#: utils/adt/formatting.c:2259 utils/adt/formatting.c:2272 +#: utils/adt/formatting.c:2603 utils/adt/formatting.c:3503 +#: utils/adt/formatting.c:3706 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "неверное значение \"%s\" для \"%s\"" -#: utils/adt/formatting.c:2258 +#: utils/adt/formatting.c:2261 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Поле должно поглотить символов: %d, но удалось разобрать только %d." -#: utils/adt/formatting.c:2271 +#: utils/adt/formatting.c:2274 #, c-format msgid "Value must be an integer." msgstr "Значение должно быть целым числом." -#: utils/adt/formatting.c:2276 utils/adt/formatting.c:3601 +#: utils/adt/formatting.c:2279 utils/adt/formatting.c:3714 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "значение \"%s\" во входной строке вне диапазона" -#: utils/adt/formatting.c:2278 +#: utils/adt/formatting.c:2281 #, c-format msgid "Value must be in the range %d to %d." msgstr "Значение должно быть в интервале %d..%d." -#: utils/adt/formatting.c:2492 +#: utils/adt/formatting.c:2605 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "" "Данное значение не соответствует ни одному из допустимых значений для этого " "поля." -#: utils/adt/formatting.c:2708 utils/adt/formatting.c:2728 -#: utils/adt/formatting.c:2748 utils/adt/formatting.c:2768 -#: utils/adt/formatting.c:2787 utils/adt/formatting.c:2806 -#: utils/adt/formatting.c:2830 utils/adt/formatting.c:2848 -#: utils/adt/formatting.c:2866 utils/adt/formatting.c:2884 -#: utils/adt/formatting.c:2901 utils/adt/formatting.c:2918 +#: utils/adt/formatting.c:2821 utils/adt/formatting.c:2841 +#: utils/adt/formatting.c:2861 utils/adt/formatting.c:2881 +#: utils/adt/formatting.c:2900 utils/adt/formatting.c:2919 +#: utils/adt/formatting.c:2943 utils/adt/formatting.c:2961 +#: utils/adt/formatting.c:2979 utils/adt/formatting.c:2997 +#: utils/adt/formatting.c:3014 utils/adt/formatting.c:3031 #, c-format msgid "localized string format value too long" msgstr "слишком длинное значение формата локализованной строки" -#: utils/adt/formatting.c:3198 +#: utils/adt/formatting.c:3311 #, c-format msgid "unmatched format separator \"%c\"" msgstr "нет соответствия для заданного в формате разделителя \"%c\"" -#: utils/adt/formatting.c:3259 +#: utils/adt/formatting.c:3372 #, c-format msgid "unmatched format character \"%s\"" msgstr "нет соответствия для заданного в формате символа \"%s\"" -#: utils/adt/formatting.c:3392 +#: utils/adt/formatting.c:3505 #, c-format msgid "Time zone abbreviation is not recognized." msgstr "Сокращённое название часового пояса не распознано." -#: utils/adt/formatting.c:3690 +#: utils/adt/formatting.c:3803 #, c-format msgid "input string is too short for datetime format" msgstr "входная строка короче, чем требует формат datetime" -#: utils/adt/formatting.c:3698 +#: utils/adt/formatting.c:3811 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "" "после разбора формата datetime во входной строке остались дополнительные " "символы" -#: utils/adt/formatting.c:4242 +#: utils/adt/formatting.c:4355 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "во входной строке для типа timestamptz нет указания часового пояса" -#: utils/adt/formatting.c:4248 +#: utils/adt/formatting.c:4361 #, c-format msgid "timestamptz out of range" msgstr "значение timestamptz вне диапазона" -#: utils/adt/formatting.c:4276 +#: utils/adt/formatting.c:4389 #, c-format msgid "datetime format is zoned but not timed" msgstr "в формате datetime указан часовой пояс, но отсутствует время" -#: utils/adt/formatting.c:4325 +#: utils/adt/formatting.c:4438 #, c-format msgid "missing time zone in input string for type timetz" msgstr "во входной строке для типа timetz нет указания часового пояса" -#: utils/adt/formatting.c:4331 +#: utils/adt/formatting.c:4444 #, c-format msgid "timetz out of range" msgstr "значение timetz вне диапазона" -#: utils/adt/formatting.c:4357 +#: utils/adt/formatting.c:4470 #, c-format msgid "datetime format is not dated and not timed" msgstr "в формате datetime нет ни даты, ни времени" -#: utils/adt/formatting.c:4534 +#: utils/adt/formatting.c:4647 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "час \"%d\" не соответствует 12-часовому формату времени" -#: utils/adt/formatting.c:4536 +#: utils/adt/formatting.c:4649 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Используйте 24-часовой формат или передавайте часы от 1 до 12." -#: utils/adt/formatting.c:4713 +#: utils/adt/formatting.c:4826 #, c-format msgid "cannot calculate day of year without year information" msgstr "нельзя рассчитать день года без информации о годе" -#: utils/adt/formatting.c:5836 +#: utils/adt/formatting.c:5960 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" не поддерживается при вводе" -#: utils/adt/formatting.c:6113 +#: utils/adt/formatting.c:6250 #, c-format msgid "invalid Roman numeral" msgstr "неверное римское число" @@ -29689,8 +29834,8 @@ msgstr "массив не подходит для типа int2vector" msgid "invalid int2vector data" msgstr "неверные данные int2vector" -#: utils/adt/int.c:1558 utils/adt/int8.c:1403 utils/adt/numeric.c:1767 -#: utils/adt/timestamp.c:6708 utils/adt/timestamp.c:6794 +#: utils/adt/int.c:1558 utils/adt/int8.c:1433 utils/adt/numeric.c:1773 +#: utils/adt/timestamp.c:6712 utils/adt/timestamp.c:6798 #, c-format msgid "step size cannot equal zero" msgstr "размер шага не может быть нулевым" @@ -29699,19 +29844,19 @@ msgstr "размер шага не может быть нулевым" #: utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 #: utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 #: utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 -#: utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 -#: utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 -#: utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 -#: utils/adt/int8.c:1055 utils/adt/int8.c:1069 utils/adt/int8.c:1100 -#: utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 -#: utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4646 +#: utils/adt/int8.c:787 utils/adt/int8.c:929 utils/adt/int8.c:943 +#: utils/adt/int8.c:957 utils/adt/int8.c:988 utils/adt/int8.c:1010 +#: utils/adt/int8.c:1024 utils/adt/int8.c:1038 utils/adt/int8.c:1071 +#: utils/adt/int8.c:1085 utils/adt/int8.c:1099 utils/adt/int8.c:1130 +#: utils/adt/int8.c:1152 utils/adt/int8.c:1166 utils/adt/int8.c:1180 +#: utils/adt/int8.c:1342 utils/adt/int8.c:1377 utils/adt/numeric.c:4652 #: utils/adt/rangetypes.c:1599 utils/adt/rangetypes.c:1612 #: utils/adt/varbit.c:1676 utils/adt/varlena.c:4199 #, c-format msgid "bigint out of range" msgstr "bigint вне диапазона" -#: utils/adt/int8.c:1360 +#: utils/adt/int8.c:1390 #, c-format msgid "OID out of range" msgstr "OID вне диапазона" @@ -30172,8 +30317,8 @@ msgstr "метод .%s() в jsonpath может применяться толь #: utils/adt/jsonpath_exec.c:1165 utils/adt/jsonpath_exec.c:1191 #: utils/adt/jsonpath_exec.c:1279 utils/adt/jsonpath_exec.c:1304 #: utils/adt/jsonpath_exec.c:1356 utils/adt/jsonpath_exec.c:1376 -#: utils/adt/jsonpath_exec.c:1438 utils/adt/jsonpath_exec.c:1527 -#: utils/adt/jsonpath_exec.c:1560 utils/adt/jsonpath_exec.c:1584 +#: utils/adt/jsonpath_exec.c:1438 utils/adt/jsonpath_exec.c:1516 +#: utils/adt/jsonpath_exec.c:1548 utils/adt/jsonpath_exec.c:1572 #, c-format msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type %s" msgstr "аргумент \"%s\" метода элемента jsonpath .%s() не подходит для типа %s" @@ -30186,7 +30331,7 @@ msgstr "метод элемента jsonpath .%s() не принимает зн # skip-rule: space-before-period #: utils/adt/jsonpath_exec.c:1209 utils/adt/jsonpath_exec.c:1312 -#: utils/adt/jsonpath_exec.c:1454 utils/adt/jsonpath_exec.c:1592 +#: utils/adt/jsonpath_exec.c:1454 utils/adt/jsonpath_exec.c:1580 #, c-format msgid "" "jsonpath item method .%s() can only be applied to a string or numeric value" @@ -30204,20 +30349,20 @@ msgstr "" "метод .%s() в jsonpath может применяться только к булевскому, строковому или " "числовому значению" -#: utils/adt/jsonpath_exec.c:1486 +#: utils/adt/jsonpath_exec.c:1482 #, c-format msgid "" "precision of jsonpath item method .%s() is out of range for type integer" msgstr "точность в аргументе метода jsonpath .%s() вне диапазона типа integer" -#: utils/adt/jsonpath_exec.c:1500 +#: utils/adt/jsonpath_exec.c:1496 #, c-format msgid "scale of jsonpath item method .%s() is out of range for type integer" msgstr "" "масштаб в аргументе метода элемента jsonpath .%s() вне диапазона типа integer" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1647 +#: utils/adt/jsonpath_exec.c:1635 #, c-format msgid "" "jsonpath item method .%s() can only be applied to a boolean, string, " @@ -30226,84 +30371,84 @@ msgstr "" "метод .%s() в jsonpath может применяться только к булевскому, строковому, " "числовому значению или к дате/времени" -#: utils/adt/jsonpath_exec.c:2136 +#: utils/adt/jsonpath_exec.c:2124 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "" "левый операнд оператора %s в jsonpath не является одним числовым значением" -#: utils/adt/jsonpath_exec.c:2143 +#: utils/adt/jsonpath_exec.c:2131 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "" "правый операнд оператора %s в jsonpath не является одним числовым значением" -#: utils/adt/jsonpath_exec.c:2211 +#: utils/adt/jsonpath_exec.c:2199 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "" "операнд унарного оператора %s в jsonpath не является числовым значением" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:2310 +#: utils/adt/jsonpath_exec.c:2298 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "метод .%s() в jsonpath может применяться только к числовому значению" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:2356 +#: utils/adt/jsonpath_exec.c:2344 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "метод .%s() в jsonpath может применяться только к строке" -#: utils/adt/jsonpath_exec.c:2449 +#: utils/adt/jsonpath_exec.c:2437 #, c-format msgid "" "time precision of jsonpath item method .%s() is out of range for type integer" msgstr "" "точность времени в аргументе метода jsonpath .%s() вне диапазона типа integer" -#: utils/adt/jsonpath_exec.c:2483 utils/adt/jsonpath_exec.c:2489 -#: utils/adt/jsonpath_exec.c:2516 utils/adt/jsonpath_exec.c:2544 -#: utils/adt/jsonpath_exec.c:2597 utils/adt/jsonpath_exec.c:2648 -#: utils/adt/jsonpath_exec.c:2719 +#: utils/adt/jsonpath_exec.c:2471 utils/adt/jsonpath_exec.c:2477 +#: utils/adt/jsonpath_exec.c:2504 utils/adt/jsonpath_exec.c:2532 +#: utils/adt/jsonpath_exec.c:2585 utils/adt/jsonpath_exec.c:2636 +#: utils/adt/jsonpath_exec.c:2707 #, c-format msgid "%s format is not recognized: \"%s\"" msgstr "формат %s не распознан: \"%s\"" -#: utils/adt/jsonpath_exec.c:2485 +#: utils/adt/jsonpath_exec.c:2473 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "" "Воспользуйтесь аргументом datetime для указания формата входных данных." -#: utils/adt/jsonpath_exec.c:2678 utils/adt/jsonpath_exec.c:2759 +#: utils/adt/jsonpath_exec.c:2666 utils/adt/jsonpath_exec.c:2747 #, c-format msgid "time precision of jsonpath item method .%s() is invalid" msgstr "точность времени в аргументе метода jsonpath .%s() некорректная" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:2839 +#: utils/adt/jsonpath_exec.c:2827 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "метод .%s() в jsonpath может применяться только к объекту" -#: utils/adt/jsonpath_exec.c:3123 +#: utils/adt/jsonpath_exec.c:3111 #, c-format msgid "could not convert value of type %s to jsonpath" msgstr "преобразовать значение типа %s в jsonpath не удалось" -#: utils/adt/jsonpath_exec.c:3157 +#: utils/adt/jsonpath_exec.c:3145 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "не удалось найти в jsonpath переменную \"%s\"" -#: utils/adt/jsonpath_exec.c:3210 +#: utils/adt/jsonpath_exec.c:3198 #, c-format msgid "\"vars\" argument is not an object" msgstr "аргумент \"vars\" не является объектом" -#: utils/adt/jsonpath_exec.c:3211 +#: utils/adt/jsonpath_exec.c:3199 #, c-format msgid "" "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." @@ -30311,27 +30456,27 @@ msgstr "" "Параметры jsonpath должны передаваться в виде пар ключ-значение в объекте " "\"vars\"." -#: utils/adt/jsonpath_exec.c:3474 +#: utils/adt/jsonpath_exec.c:3462 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "индекс элемента в jsonpath не является одним числовым значением" -#: utils/adt/jsonpath_exec.c:3486 +#: utils/adt/jsonpath_exec.c:3474 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "индекс массива в jsonpath вне целочисленного диапазона" -#: utils/adt/jsonpath_exec.c:3670 +#: utils/adt/jsonpath_exec.c:3658 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "значение %s нельзя преобразовать в %s без сведений о часовом поясе" -#: utils/adt/jsonpath_exec.c:3672 +#: utils/adt/jsonpath_exec.c:3660 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Для передачи часового пояса используйте функцию *_tz()." -#: utils/adt/jsonpath_exec.c:3980 +#: utils/adt/jsonpath_exec.c:3968 #, c-format msgid "" "JSON path expression for column \"%s\" must return single item when no " @@ -30340,14 +30485,14 @@ msgstr "" "выражение пути JSON для столбца \"%s\" в отсутствие обёртки должно " "возвращать одиночный элемент" -#: utils/adt/jsonpath_exec.c:3982 utils/adt/jsonpath_exec.c:3987 +#: utils/adt/jsonpath_exec.c:3970 utils/adt/jsonpath_exec.c:3975 #, c-format msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." msgstr "" "Используйте предложение WITH WRAPPER, чтобы обернуть элементы SQL/JSON в " "массив." -#: utils/adt/jsonpath_exec.c:3986 +#: utils/adt/jsonpath_exec.c:3974 #, c-format msgid "" "JSON path expression in JSON_QUERY must return single item when no wrapper " @@ -30356,14 +30501,14 @@ msgstr "" "выражение пути JSON в JSON_QUERY в отсутствие обёртки должно возвращать " "одиночный элемент" -#: utils/adt/jsonpath_exec.c:4044 utils/adt/jsonpath_exec.c:4068 +#: utils/adt/jsonpath_exec.c:4032 utils/adt/jsonpath_exec.c:4056 #, c-format msgid "JSON path expression for column \"%s\" must return single scalar item" msgstr "" "выражение пути JSON для столбца \"%s\" должно возвращать один скалярный " "элемент" -#: utils/adt/jsonpath_exec.c:4049 utils/adt/jsonpath_exec.c:4073 +#: utils/adt/jsonpath_exec.c:4037 utils/adt/jsonpath_exec.c:4061 #, c-format msgid "JSON path expression in JSON_VALUE must return single scalar item" msgstr "" @@ -30380,7 +30525,7 @@ msgstr "длина аргумента levenshtein() превышает макс msgid "could not determine which collation to use for LIKE" msgstr "не удалось определить, какой порядок сортировки использовать для LIKE" -#: utils/adt/like.c:193 utils/adt/like_support.c:1019 +#: utils/adt/like.c:193 utils/adt/like_support.c:1031 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "не удалось определить, какой порядок сортировки использовать для ILIKE" @@ -30390,28 +30535,28 @@ msgstr "не удалось определить, какой порядок со msgid "nondeterministic collations are not supported for ILIKE" msgstr "недетерминированные правила сортировки не поддерживаются для ILIKE" -#: utils/adt/like_match.c:107 utils/adt/like_match.c:169 -#: utils/adt/like_match.c:237 +#: utils/adt/like_match.c:164 utils/adt/like_match.c:232 +#: utils/adt/like_match.c:352 #, c-format msgid "LIKE pattern must not end with escape character" msgstr "шаблон LIKE не должен заканчиваться защитным символом" -#: utils/adt/like_match.c:437 utils/adt/regexp.c:804 +#: utils/adt/like_match.c:448 utils/adt/regexp.c:804 #, c-format msgid "invalid escape string" msgstr "неверный защитный символ" -#: utils/adt/like_match.c:438 utils/adt/regexp.c:805 +#: utils/adt/like_match.c:449 utils/adt/regexp.c:805 #, c-format msgid "Escape string must be empty or one character." msgstr "Защитный символ должен быть пустым или состоять из одного байта." -#: utils/adt/like_support.c:1009 +#: utils/adt/like_support.c:1021 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "регистронезависимое сравнение не поддерживается для типа bytea" -#: utils/adt/like_support.c:1106 +#: utils/adt/like_support.c:1118 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "сравнение с регулярными выражениями не поддерживается для типа bytea" @@ -30533,12 +30678,12 @@ msgstr "Ожидалось начало диапазона." msgid "Expected comma or end of multirange." msgstr "Ожидалась запятая или конец мультидиапазона." -#: utils/adt/multirangetypes.c:982 +#: utils/adt/multirangetypes.c:983 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "мультидиапазоны нельзя получить из массивов мультидиапазонов" -#: utils/adt/multirangetypes.c:1008 +#: utils/adt/multirangetypes.c:1009 #, c-format msgid "multirange values cannot contain null members" msgstr "мультидиапазоны не могут содержать элементы NULL" @@ -30617,10 +30762,10 @@ msgstr "результат вне диапазона" msgid "cannot subtract inet values of different sizes" msgstr "нельзя вычитать значения inet разного размера" -#: utils/adt/numeric.c:795 utils/adt/numeric.c:3763 utils/adt/numeric.c:7320 -#: utils/adt/numeric.c:7523 utils/adt/numeric.c:7995 utils/adt/numeric.c:10929 -#: utils/adt/numeric.c:11404 utils/adt/numeric.c:11498 -#: utils/adt/numeric.c:11633 +#: utils/adt/numeric.c:795 utils/adt/numeric.c:3769 utils/adt/numeric.c:7326 +#: utils/adt/numeric.c:7529 utils/adt/numeric.c:8001 utils/adt/numeric.c:10935 +#: utils/adt/numeric.c:11410 utils/adt/numeric.c:11504 +#: utils/adt/numeric.c:11639 #, c-format msgid "value overflows numeric format" msgstr "значение переполняет формат numeric" @@ -30640,99 +30785,99 @@ msgstr "неверный порядок числа во внешнем знач msgid "invalid digit in external \"numeric\" value" msgstr "неверная цифра во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:1338 utils/adt/numeric.c:1352 +#: utils/adt/numeric.c:1335 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "точность NUMERIC %d должна быть между 1 и %d" -#: utils/adt/numeric.c:1343 +#: utils/adt/numeric.c:1340 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "порядок NUMERIC %d должен быть между %d и %d" -#: utils/adt/numeric.c:1361 +#: utils/adt/numeric.c:1367 #, c-format msgid "invalid NUMERIC type modifier" msgstr "неверный модификатор типа NUMERIC" -#: utils/adt/numeric.c:1727 +#: utils/adt/numeric.c:1733 #, c-format msgid "start value cannot be NaN" msgstr "начальное значение не может быть NaN" -#: utils/adt/numeric.c:1731 +#: utils/adt/numeric.c:1737 #, c-format msgid "start value cannot be infinity" msgstr "начальное значение не может быть бесконечностью" -#: utils/adt/numeric.c:1738 +#: utils/adt/numeric.c:1744 #, c-format msgid "stop value cannot be NaN" msgstr "конечное значение не может быть NaN" -#: utils/adt/numeric.c:1742 +#: utils/adt/numeric.c:1748 #, c-format msgid "stop value cannot be infinity" msgstr "конечное значение не может быть бесконечностью" -#: utils/adt/numeric.c:1755 +#: utils/adt/numeric.c:1761 #, c-format msgid "step size cannot be NaN" msgstr "размер шага не может быть NaN" -#: utils/adt/numeric.c:1759 +#: utils/adt/numeric.c:1765 #, c-format msgid "step size cannot be infinity" msgstr "размер шага не может быть бесконечностью" -#: utils/adt/numeric.c:3753 +#: utils/adt/numeric.c:3759 #, c-format msgid "factorial of a negative number is undefined" msgstr "факториал отрицательного числа даёт неопределённость" -#: utils/adt/numeric.c:4360 +#: utils/adt/numeric.c:4366 #, c-format msgid "lower bound cannot be NaN" msgstr "нижняя граница не может быть NaN" -#: utils/adt/numeric.c:4364 +#: utils/adt/numeric.c:4370 #, c-format msgid "lower bound cannot be infinity" msgstr "нижняя граница не может быть бесконечностью" -#: utils/adt/numeric.c:4371 +#: utils/adt/numeric.c:4377 #, c-format msgid "upper bound cannot be NaN" msgstr "верхняя граница не может быть NaN" -#: utils/adt/numeric.c:4375 +#: utils/adt/numeric.c:4381 #, c-format msgid "upper bound cannot be infinity" msgstr "верхняя граница не может быть бесконечностью" -#: utils/adt/numeric.c:4536 utils/adt/numeric.c:4624 utils/adt/numeric.c:4684 -#: utils/adt/numeric.c:4880 +#: utils/adt/numeric.c:4542 utils/adt/numeric.c:4630 utils/adt/numeric.c:4690 +#: utils/adt/numeric.c:4886 #, c-format msgid "cannot convert NaN to %s" msgstr "нельзя преобразовать NaN в %s" -#: utils/adt/numeric.c:4540 utils/adt/numeric.c:4628 utils/adt/numeric.c:4688 -#: utils/adt/numeric.c:4884 +#: utils/adt/numeric.c:4546 utils/adt/numeric.c:4634 utils/adt/numeric.c:4694 +#: utils/adt/numeric.c:4890 #, c-format msgid "cannot convert infinity to %s" msgstr "нельзя представить бесконечность в %s" -#: utils/adt/numeric.c:4893 +#: utils/adt/numeric.c:4899 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn вне диапазона" -#: utils/adt/numeric.c:8085 utils/adt/numeric.c:8136 +#: utils/adt/numeric.c:8091 utils/adt/numeric.c:8142 #, c-format msgid "numeric field overflow" msgstr "переполнение поля numeric" -#: utils/adt/numeric.c:8086 +#: utils/adt/numeric.c:8092 #, c-format msgid "" "A field with precision %d, scale %d must round to an absolute value less " @@ -30741,13 +30886,13 @@ msgstr "" "Поле с точностью %d, порядком %d должно округляться до абсолютного значения " "меньше чем %s%d." -#: utils/adt/numeric.c:8137 +#: utils/adt/numeric.c:8143 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "" "Поле с точностью %d, порядком %d не может содержать значение бесконечности." -#: utils/adt/numeric.c:11702 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/numeric.c:11708 utils/adt/pseudorandomfuncs.c:135 #: utils/adt/pseudorandomfuncs.c:159 #, c-format msgid "lower bound must be less than or equal to upper bound" @@ -30828,36 +30973,36 @@ msgstr "" "ALTER COLLATION %s REFRESH VERSION либо соберите PostgreSQL с правильной " "версией библиотеки." -#: utils/adt/pg_locale.c:1498 utils/adt/pg_locale.c:1525 -#: utils/adt/pg_locale_builtin.c:188 +#: utils/adt/pg_locale.c:1504 utils/adt/pg_locale.c:1531 +#: utils/adt/pg_locale_builtin.c:200 #, c-format msgid "invalid locale name \"%s\" for builtin provider" msgstr "неверное имя локали \"%s\" для встроенного провайдера" -#: utils/adt/pg_locale.c:1590 +#: utils/adt/pg_locale.c:1596 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "не удалось получить из названия локали \"%s\" метку языка: %s" -#: utils/adt/pg_locale.c:1599 utils/adt/pg_locale.c:1674 +#: utils/adt/pg_locale.c:1605 utils/adt/pg_locale.c:1680 #: utils/adt/pg_locale_icu.c:215 #, c-format msgid "ICU is not supported in this build" msgstr "ICU не поддерживается в данной сборке" -#: utils/adt/pg_locale.c:1632 +#: utils/adt/pg_locale.c:1638 #, c-format msgid "could not get language from ICU locale \"%s\": %s" msgstr "не удалось определить язык для локали ICU \"%s\": %s" -#: utils/adt/pg_locale.c:1634 utils/adt/pg_locale.c:1664 +#: utils/adt/pg_locale.c:1640 utils/adt/pg_locale.c:1670 #, c-format msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." msgstr "" "Чтобы отключить проверку локалей ICU, установите для параметра \"%s\" " "значение \"%s\"." -#: utils/adt/pg_locale.c:1662 +#: utils/adt/pg_locale.c:1668 #, c-format msgid "ICU locale \"%s\" has unknown language \"%s\"" msgstr "для локали ICU \"%s\" получен неизвестный язык \"%s\"" @@ -30878,33 +31023,33 @@ msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" msgstr "" "не удалось открыть сортировщик для локали \"%s\" с правилами \"%s\": %s" -#: utils/adt/pg_locale_icu.c:488 +#: utils/adt/pg_locale_icu.c:490 #, c-format msgid "collation failed: %s" msgstr "ошибка в библиотеке сортировки: %s" -#: utils/adt/pg_locale_icu.c:567 utils/adt/pg_locale_icu.c:831 +#: utils/adt/pg_locale_icu.c:563 utils/adt/pg_locale_icu.c:819 #, c-format msgid "sort key generation failed: %s" msgstr "не удалось сгенерировать ключ сортировки: %s" -#: utils/adt/pg_locale_icu.c:641 utils/adt/pg_locale_icu.c:653 -#: utils/adt/pg_locale_icu.c:878 utils/adt/pg_locale_icu.c:899 +#: utils/adt/pg_locale_icu.c:637 utils/adt/pg_locale_icu.c:649 +#: utils/adt/pg_locale_icu.c:873 utils/adt/pg_locale_icu.c:893 #, c-format msgid "%s failed: %s" msgstr "ошибка %s: %s" -#: utils/adt/pg_locale_icu.c:682 +#: utils/adt/pg_locale_icu.c:678 #, c-format msgid "case conversion failed: %s" msgstr "преобразовать регистр не удалось: %s" -#: utils/adt/pg_locale_icu.c:851 +#: utils/adt/pg_locale_icu.c:842 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "ICU не поддерживает кодировку \"%s\"" -#: utils/adt/pg_locale_icu.c:858 +#: utils/adt/pg_locale_icu.c:849 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "не удалось открыть преобразователь ICU для кодировки \"%s\": %s" @@ -30930,34 +31075,34 @@ msgstr "" "не удалось получить версию правила сортировки для локали \"%s\" (код ошибки: " "%lu)" -#: utils/adt/pg_locale_libc.c:771 utils/adt/pg_locale_libc.c:784 +#: utils/adt/pg_locale_libc.c:777 utils/adt/pg_locale_libc.c:790 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "не удалось преобразовать строку в UTF-16 (код ошибки: %lu)" -#: utils/adt/pg_locale_libc.c:793 +#: utils/adt/pg_locale_libc.c:799 #, c-format msgid "could not compare Unicode strings: %m" msgstr "не удалось сравнить строки в Unicode: %m" -#: utils/adt/pg_locale_libc.c:825 +#: utils/adt/pg_locale_libc.c:831 #, c-format msgid "could not create locale \"%s\": %m" msgstr "не удалось создать локаль \"%s\": %m" -#: utils/adt/pg_locale_libc.c:828 +#: utils/adt/pg_locale_libc.c:834 #, c-format msgid "" "The operating system could not find any locale data for the locale name " "\"%s\"." msgstr "Операционная система не может найти данные локали с именем \"%s\"." -#: utils/adt/pg_locale_libc.c:1000 +#: utils/adt/pg_locale_libc.c:1006 #, c-format msgid "invalid multibyte character for locale" msgstr "неверный многобайтный символ для локали" -#: utils/adt/pg_locale_libc.c:1001 +#: utils/adt/pg_locale_libc.c:1007 #, c-format msgid "" "The server's LC_CTYPE locale is probably incompatible with the database " @@ -31165,8 +31310,8 @@ msgid "Use NONE to denote the missing argument of a unary operator." msgstr "" "Чтобы обозначить отсутствующий аргумент унарного оператора, укажите NONE." -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10836 -#: utils/adt/ruleutils.c:11049 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10838 +#: utils/adt/ruleutils.c:11051 #, c-format msgid "too many arguments" msgstr "слишком много аргументов" @@ -31377,22 +31522,22 @@ msgstr "не удалось сравнить различные типы сто msgid "cannot compare record types with different numbers of columns" msgstr "сравнивать типы записей с разным числом столбцов нельзя" -#: utils/adt/ruleutils.c:2740 +#: utils/adt/ruleutils.c:2742 #, c-format msgid "input is a query, not an expression" msgstr "на вход поступил запрос, а не выражение" -#: utils/adt/ruleutils.c:2752 +#: utils/adt/ruleutils.c:2754 #, c-format msgid "expression contains variables of more than one relation" msgstr "выражение содержит переменные из нескольких отношений" -#: utils/adt/ruleutils.c:2759 +#: utils/adt/ruleutils.c:2761 #, c-format msgid "expression contains variables" msgstr "выражение содержит переменные" -#: utils/adt/ruleutils.c:5433 +#: utils/adt/ruleutils.c:5435 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "правило \"%s\" имеет неподдерживаемый тип событий %d" @@ -31470,21 +31615,21 @@ msgstr "timestamp вне диапазона: \"%g\"" #: utils/adt/timestamp.c:948 utils/adt/timestamp.c:1507 #: utils/adt/timestamp.c:1517 utils/adt/timestamp.c:1578 -#: utils/adt/timestamp.c:2866 utils/adt/timestamp.c:2875 -#: utils/adt/timestamp.c:2890 utils/adt/timestamp.c:2964 -#: utils/adt/timestamp.c:2981 utils/adt/timestamp.c:3038 -#: utils/adt/timestamp.c:3081 utils/adt/timestamp.c:3459 -#: utils/adt/timestamp.c:3517 utils/adt/timestamp.c:3540 -#: utils/adt/timestamp.c:3549 utils/adt/timestamp.c:3573 -#: utils/adt/timestamp.c:3596 utils/adt/timestamp.c:3605 -#: utils/adt/timestamp.c:3740 utils/adt/timestamp.c:3841 -#: utils/adt/timestamp.c:4248 utils/adt/timestamp.c:4285 -#: utils/adt/timestamp.c:4333 utils/adt/timestamp.c:4342 -#: utils/adt/timestamp.c:4434 utils/adt/timestamp.c:4481 -#: utils/adt/timestamp.c:4490 utils/adt/timestamp.c:4586 -#: utils/adt/timestamp.c:4639 utils/adt/timestamp.c:4649 -#: utils/adt/timestamp.c:4874 utils/adt/timestamp.c:4884 -#: utils/adt/timestamp.c:5239 +#: utils/adt/timestamp.c:2870 utils/adt/timestamp.c:2879 +#: utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2968 +#: utils/adt/timestamp.c:2985 utils/adt/timestamp.c:3042 +#: utils/adt/timestamp.c:3085 utils/adt/timestamp.c:3463 +#: utils/adt/timestamp.c:3521 utils/adt/timestamp.c:3544 +#: utils/adt/timestamp.c:3553 utils/adt/timestamp.c:3577 +#: utils/adt/timestamp.c:3600 utils/adt/timestamp.c:3609 +#: utils/adt/timestamp.c:3744 utils/adt/timestamp.c:3845 +#: utils/adt/timestamp.c:4252 utils/adt/timestamp.c:4289 +#: utils/adt/timestamp.c:4337 utils/adt/timestamp.c:4346 +#: utils/adt/timestamp.c:4438 utils/adt/timestamp.c:4485 +#: utils/adt/timestamp.c:4494 utils/adt/timestamp.c:4590 +#: utils/adt/timestamp.c:4643 utils/adt/timestamp.c:4653 +#: utils/adt/timestamp.c:4878 utils/adt/timestamp.c:4888 +#: utils/adt/timestamp.c:5243 #, c-format msgid "interval out of range" msgstr "interval вне диапазона" @@ -31509,33 +31654,33 @@ msgstr "INTERVAL(%d): точность уменьшена до максимал msgid "interval(%d) precision must be between %d and %d" msgstr "точность interval(%d) должна быть между %d и %d" -#: utils/adt/timestamp.c:4623 utils/adt/timestamp.c:4858 +#: utils/adt/timestamp.c:4627 utils/adt/timestamp.c:4862 #, c-format msgid "origin out of range" msgstr "начало вне диапазона" -#: utils/adt/timestamp.c:4628 utils/adt/timestamp.c:4863 +#: utils/adt/timestamp.c:4632 utils/adt/timestamp.c:4867 #, c-format msgid "timestamps cannot be binned into infinite intervals" msgstr "значения timestamp нельзя подогнать под бесконечные интервалы" -#: utils/adt/timestamp.c:4633 utils/adt/timestamp.c:4868 +#: utils/adt/timestamp.c:4637 utils/adt/timestamp.c:4872 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "" "значения timestamp нельзя подогнать под интервалы, содержащие месяцы или годы" -#: utils/adt/timestamp.c:4644 utils/adt/timestamp.c:4879 +#: utils/adt/timestamp.c:4648 utils/adt/timestamp.c:4883 #, c-format msgid "stride must be greater than zero" msgstr "шаг должен быть больше нуля" -#: utils/adt/timestamp.c:5181 utils/adt/timestamp.c:5233 +#: utils/adt/timestamp.c:5185 utils/adt/timestamp.c:5237 #, c-format msgid "Months usually have fractional weeks." msgstr "В месяцах обычно дробное количество недель." -#: utils/adt/timestamp.c:6713 utils/adt/timestamp.c:6799 +#: utils/adt/timestamp.c:6717 utils/adt/timestamp.c:6803 #, c-format msgid "step size cannot be infinite" msgstr "размер шага не может быть бесконечным" @@ -31654,62 +31799,67 @@ msgstr "слово слишком длинное (%ld Б, при максиму msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "строка слишком длинна для tsvector (%ld Б, при максимуме %ld)" -#: utils/adt/tsvector_op.c:771 +#: utils/adt/tsvector_op.c:238 +#, c-format +msgid "unrecognized weight: \"%c\"" +msgstr "нераспознанный вес: \"%c\"" + +#: utils/adt/tsvector_op.c:242 +#, c-format +msgid "unrecognized weight: \"\\%03o\"" +msgstr "нераспознанный вес: \"\\%03o\"" + +#: utils/adt/tsvector_op.c:766 #, c-format msgid "lexeme array may not contain nulls" msgstr "массив лексем не может содержать элементы null" -#: utils/adt/tsvector_op.c:776 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain empty strings" msgstr "массив лексем не должен содержать пустые строки" -#: utils/adt/tsvector_op.c:845 +#: utils/adt/tsvector_op.c:840 #, c-format msgid "weight array may not contain nulls" msgstr "массив весов не может содержать элементы null" -#: utils/adt/tsvector_op.c:869 -#, c-format -msgid "unrecognized weight: \"%c\"" -msgstr "нераспознанный вес: \"%c\"" - -#: utils/adt/tsvector_op.c:2599 +#: utils/adt/tsvector_op.c:2572 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "запрос ts_stat должен вернуть один столбец tsvector" -#: utils/adt/tsvector_op.c:2792 +#: utils/adt/tsvector_op.c:2765 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "столбец \"%s\" типа tsvector не существует" -#: utils/adt/tsvector_op.c:2799 +#: utils/adt/tsvector_op.c:2772 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "столбец \"%s\" должен иметь тип tsvector" -#: utils/adt/tsvector_op.c:2811 +#: utils/adt/tsvector_op.c:2784 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "столбец конфигурации \"%s\" не существует" -#: utils/adt/tsvector_op.c:2817 +#: utils/adt/tsvector_op.c:2790 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "столбец \"%s\" должен иметь тип regconfig" -#: utils/adt/tsvector_op.c:2824 +#: utils/adt/tsvector_op.c:2797 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "значение столбца конфигурации \"%s\" не должно быть null" -#: utils/adt/tsvector_op.c:2837 +#: utils/adt/tsvector_op.c:2810 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "имя конфигурации текстового поиска \"%s\" должно указываться со схемой" -#: utils/adt/tsvector_op.c:2862 +#: utils/adt/tsvector_op.c:2835 #, c-format msgid "column \"%s\" is not of a character type" msgstr "столбец \"%s\" имеет не символьный тип" @@ -31730,11 +31880,34 @@ msgstr "нет спец. символа \"%s\"" msgid "wrong position info in tsvector: \"%s\"" msgstr "неверная информация о позиции в tsvector: \"%s\"" -#: utils/adt/uuid.c:535 utils/adt/uuid.c:632 +#: utils/adt/uuid.c:552 utils/adt/uuid.c:649 #, c-format msgid "could not generate random values" msgstr "не удалось сгенерировать случайные значения" +#: utils/adt/uuid.c:700 +#, c-format +msgid "interval out of range for UUID version 7" +msgstr "интервал вне диапазона для UUID версии 7" + +#: utils/adt/uuid.c:701 +#, c-format +msgid "UUID version 7 does not support infinite intervals." +msgstr "В UUID версии 7 бесконечные интервалы не поддерживаются." + +#: utils/adt/uuid.c:725 +#, c-format +msgid "timestamp out of range for UUID version 7" +msgstr "дата/время вне диапазона для UUID версии 7" + +#: utils/adt/uuid.c:726 +#, c-format +msgid "" +"UUID version 7 supports timestamps from 1970-01-01 to approximately year " +"10889." +msgstr "" +"В UUID версии 7 поддерживаются даты с 1970-01-01 до примерно 10889 года." + #: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" @@ -32056,50 +32229,50 @@ msgstr "неверный запрос" msgid "portal \"%s\" does not return tuples" msgstr "портал \"%s\" не возвращает кортежи" -#: utils/adt/xml.c:4363 +#: utils/adt/xml.c:4365 #, c-format msgid "invalid array for XML namespace mapping" msgstr "неправильный массив с сопоставлениями пространств имён XML" -#: utils/adt/xml.c:4364 +#: utils/adt/xml.c:4366 #, c-format msgid "" "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Массив должен быть двухмерным и содержать 2 элемента по второй оси." -#: utils/adt/xml.c:4388 +#: utils/adt/xml.c:4390 #, c-format msgid "empty XPath expression" msgstr "пустое выражение XPath" -#: utils/adt/xml.c:4440 +#: utils/adt/xml.c:4442 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ни префикс, ни URI пространства имён не может быть null" -#: utils/adt/xml.c:4447 +#: utils/adt/xml.c:4449 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "" "не удалось зарегистрировать пространство имён XML с префиксом \"%s\" и URI " "\"%s\"" -#: utils/adt/xml.c:4796 +#: utils/adt/xml.c:4798 #, c-format msgid "DEFAULT namespace is not supported" msgstr "пространство имён DEFAULT не поддерживается" -#: utils/adt/xml.c:4825 +#: utils/adt/xml.c:4827 #, c-format msgid "row path filter must not be empty string" msgstr "путь отбираемых строк не должен быть пустым" -#: utils/adt/xml.c:4859 +#: utils/adt/xml.c:4861 #, c-format msgid "column path filter must not be empty string" msgstr "путь отбираемого столбца не должен быть пустым" -#: utils/adt/xml.c:5006 +#: utils/adt/xml.c:5008 #, c-format msgid "more than one value returned by column XPath expression" msgstr "выражение XPath, отбирающее столбец, возвратило более одного значения" @@ -32112,23 +32285,23 @@ msgstr "" "не удалось определить фактический тип аргумента для полиморфной функции " "\"%s\"" -#: utils/cache/lsyscache.c:1109 +#: utils/cache/lsyscache.c:1257 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "приведение типа %s к типу %s не существует" -#: utils/cache/lsyscache.c:3027 utils/cache/lsyscache.c:3060 -#: utils/cache/lsyscache.c:3093 utils/cache/lsyscache.c:3126 +#: utils/cache/lsyscache.c:3189 utils/cache/lsyscache.c:3222 +#: utils/cache/lsyscache.c:3255 utils/cache/lsyscache.c:3288 #, c-format msgid "type %s is only a shell" msgstr "тип %s является пустышкой" -#: utils/cache/lsyscache.c:3032 +#: utils/cache/lsyscache.c:3194 #, c-format msgid "no input function available for type %s" msgstr "для типа %s нет функции ввода" -#: utils/cache/lsyscache.c:3065 +#: utils/cache/lsyscache.c:3227 #, c-format msgid "no output function available for type %s" msgstr "для типа %s нет функции вывода" @@ -32142,30 +32315,30 @@ msgstr "" "в классе операторов \"%s\" метода доступа %s нет опорной функции %d для типа " "%s" -#: utils/cache/relcache.c:3805 +#: utils/cache/relcache.c:3807 #, c-format msgid "heap relfilenumber value not set when in binary upgrade mode" msgstr "" "значение relfilenumber для кучи не задано в режиме двоичного обновления" -#: utils/cache/relcache.c:3813 +#: utils/cache/relcache.c:3815 #, c-format msgid "unexpected request for new relfilenumber in binary upgrade mode" msgstr "" "неожиданный запрос нового значения relfilenumber в режиме двоичного " "обновления" -#: utils/cache/relcache.c:6633 +#: utils/cache/relcache.c:6635 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "создать файл инициализации для кеша отношений \"%s\" не удалось: %m" -#: utils/cache/relcache.c:6635 +#: utils/cache/relcache.c:6637 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Продолжаем всё равно, хотя что-то не так." -#: utils/cache/relcache.c:6965 +#: utils/cache/relcache.c:6967 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "не удалось стереть файл кеша \"%s\": %m" @@ -32186,7 +32359,7 @@ msgstr "файл сопоставления отношений \"%s\" содер msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "ошибка контрольной суммы в файле сопоставления отношений \"%s\"" -#: utils/cache/typcache.c:1901 utils/fmgr/funcapi.c:574 +#: utils/cache/typcache.c:1894 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "тип записи не зарегистрирован" @@ -36325,12 +36498,12 @@ msgstr "" "Чтобы отключить политику для владельца таблицы, воспользуйтесь командой " "ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/stack_depth.c:101 +#: utils/misc/stack_depth.c:102 #, c-format msgid "stack depth limit exceeded" msgstr "превышен предел глубины стека" -#: utils/misc/stack_depth.c:102 +#: utils/misc/stack_depth.c:103 #, c-format msgid "" "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), " @@ -36340,12 +36513,12 @@ msgstr "" "КБ), предварительно убедившись, что ОС предоставляет достаточный размер " "стека." -#: utils/misc/stack_depth.c:149 +#: utils/misc/stack_depth.c:165 #, c-format msgid "\"max_stack_depth\" must not exceed %zdkB." msgstr "Значение \"max_stack_depth\" не должно превышать %zd КБ." -#: utils/misc/stack_depth.c:151 +#: utils/misc/stack_depth.c:167 #, c-format msgid "" "Increase the platform's stack depth limit via \"ulimit -s\" or local " @@ -36451,16 +36624,26 @@ msgstr "Ошибка при создании контекста памяти \"% msgid "could not attach to dynamic shared area" msgstr "не удалось подключиться к динамической разделяемой области" -#: utils/mmgr/mcxt.c:1163 +#: utils/mmgr/mcxt.c:1166 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Ошибка при запросе блока размером %zu в контексте памяти \"%s\"." -#: utils/mmgr/mcxt.c:1319 +#: utils/mmgr/mcxt.c:1322 #, c-format msgid "logging memory contexts of PID %d" msgstr "вывод информации о памяти процесса с PID %d" +#: utils/mmgr/mcxt.c:1698 +#, c-format +msgid "invalid memory allocation request size %zu + %zu" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu" + +#: utils/mmgr/mcxt.c:1717 +#, c-format +msgid "invalid memory allocation request size %zu * %zu" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu" + #: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" @@ -36540,8 +36723,8 @@ msgstr "Данные содержат дублирующиеся ключи." #: utils/sort/tuplestore.c:552 utils/sort/tuplestore.c:562 #: utils/sort/tuplestore.c:921 utils/sort/tuplestore.c:1025 #: utils/sort/tuplestore.c:1089 utils/sort/tuplestore.c:1106 -#: utils/sort/tuplestore.c:1308 utils/sort/tuplestore.c:1373 -#: utils/sort/tuplestore.c:1382 +#: utils/sort/tuplestore.c:1320 utils/sort/tuplestore.c:1385 +#: utils/sort/tuplestore.c:1394 #, c-format msgid "could not seek in tuplestore temporary file" msgstr "не удалось переместиться во временном файле хранилища кортежей" @@ -37075,7 +37258,7 @@ msgstr "неверная последовательность шестнадца msgid "unexpected end after backslash" msgstr "неожиданный конец строки после обратной косой черты" -#: jsonpath_scan.l:201 repl_scanner.l:217 scan.l:742 +#: jsonpath_scan.l:201 repl_scanner.l:221 scan.l:742 msgid "unterminated quoted string" msgstr "незавершённая строка в кавычках" @@ -37257,6 +37440,21 @@ msgstr "нестандартное использование спецсимво msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Используйте для записи спецсимволов синтаксис спецстрок E'\\r\\n'." +#, c-format +#~ msgid "aborting startup due to startup process failure" +#~ msgstr "прерывание запуска из-за ошибки в стартовом процессе" + +#, fuzzy, c-format +#~ msgid "" +#~ "cannot synchronize replication slots when standby promotion is ongoing" +#~ msgstr "" +#~ "синхронизировать слоты репликации, когда выполняется повышение резервного " +#~ "сервера, нельзя" + +#, c-format +#~ msgid "requested shared memory size overflows size_t" +#~ msgstr "запрошенный размер разделяемой памяти не умещается в size_t" + #, c-format #~ msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON LARGE OBJECTS" #~ msgstr "" diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 66620fb4755..de43a87f74d 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -1071,8 +1071,8 @@ rebuild_database_list(Oid newdb) static int db_comparator(const void *a, const void *b) { - return pg_cmp_s32(((const avl_dbase *) a)->adl_score, - ((const avl_dbase *) b)->adl_score); + return pg_cmp_s32(((const avl_dbase *) b)->adl_score, + ((const avl_dbase *) a)->adl_score); } /* diff --git a/src/backend/postmaster/walsummarizer.c b/src/backend/postmaster/walsummarizer.c index e0ff745f2dd..96bef8778ce 100644 --- a/src/backend/postmaster/walsummarizer.c +++ b/src/backend/postmaster/walsummarizer.c @@ -104,6 +104,8 @@ typedef struct bool historic; XLogRecPtr read_upto; bool end_of_wal; + int num_descendant_tlis; + TimeLineID *descendant_tlis; } SummarizerReadLocalXLogPrivate; /* Pointer to shared memory state. */ @@ -147,10 +149,14 @@ int wal_summary_keep_time = 10 * HOURS_PER_DAY * MINS_PER_HOUR; static void WalSummarizerShutdown(int code, Datum arg); static XLogRecPtr GetLatestLSN(TimeLineID *tli); +static XLogRecPtr WalSummarizerSwitchPoint(TimeLineID current_tli, List *tles, + int *num_descendant_tlis, + TimeLineID **descendant_tlis); static void ProcessWalSummarizerInterrupts(void); static XLogRecPtr SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact, XLogRecPtr switch_lsn, - XLogRecPtr maximum_lsn); + XLogRecPtr maximum_lsn, + int num_descendant_tlis, TimeLineID *descendant_tlis); static void SummarizeDbaseRecord(XLogReaderState *xlogreader, BlockRefTable *brtab); static void SummarizeSmgrRecord(XLogReaderState *xlogreader, @@ -159,6 +165,9 @@ static void SummarizeXactRecord(XLogReaderState *xlogreader, BlockRefTable *brtab); static bool SummarizeXlogRecord(XLogReaderState *xlogreader, bool *new_fast_forward); +static void summarizer_wal_segment_open(XLogReaderState *state, + XLogSegNo nextSegNo, + TimeLineID *tli_p); static int summarizer_read_local_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, @@ -222,16 +231,19 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len) * true if 'current_lsn' is known to be the start of a WAL record or WAL * segment, and false if it might be in the middle of a record someplace. * - * 'switch_lsn' and 'switch_tli', if set, are the LSN at which we need to - * switch to a new timeline and the timeline to which we need to switch. - * If not set, we either haven't figured out the answers yet or we're - * already on the latest timeline. + * 'switch_lsn', is the LSN at which we need to switch to a new timeline. + * If not set, we either haven't figured out the answer yet or we're + * already on the latest timeline. 'descendant_tlis' stores an array of + * future timeline IDs to which we know we'll need to switch, and + * 'num_descendant_tlis' is the length of that array. The first element of + * the array is the first timeline to which we will need to switch. */ XLogRecPtr current_lsn; TimeLineID current_tli; bool exact; XLogRecPtr switch_lsn = InvalidXLogRecPtr; - TimeLineID switch_tli = 0; + int num_descendant_tlis = 0; + TimeLineID *descendant_tlis = NULL; Assert(startup_data_len == 0); @@ -353,6 +365,7 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len) { XLogRecPtr latest_lsn; TimeLineID latest_tli; + XLogRecPtr maximum_lsn; XLogRecPtr end_of_summary_lsn; /* Flush any leaked data in the top-level context */ @@ -383,11 +396,33 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len) if (current_tli != latest_tli && XLogRecPtrIsInvalid(switch_lsn)) { List *tles = readTimeLineHistory(latest_tli); + int new_num_descendant_tlis; + TimeLineID *new_descendant_tlis; - switch_lsn = tliSwitchPoint(current_tli, tles, &switch_tli); + /* + * Make sure that the array of descendant TLIs get stored into + * TopMemoryContext. + */ + MemoryContextSwitchTo(TopMemoryContext); + switch_lsn = WalSummarizerSwitchPoint(current_tli, tles, + &new_num_descendant_tlis, + &new_descendant_tlis); + MemoryContextSwitchTo(context); + + /* + * Free any old array of descendant TLIs and install the new + * values. + */ + if (descendant_tlis != NULL) + pfree(descendant_tlis); + num_descendant_tlis = new_num_descendant_tlis; + descendant_tlis = new_descendant_tlis; + + /* Debug message. */ ereport(DEBUG1, errmsg_internal("switch point from TLI %u to TLI %u is at %X/%X", - current_tli, switch_tli, LSN_FORMAT_ARGS(switch_lsn))); + current_tli, descendant_tlis[0], + LSN_FORMAT_ARGS(switch_lsn))); } /* @@ -398,12 +433,15 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len) if (!XLogRecPtrIsInvalid(switch_lsn) && current_lsn >= switch_lsn) { /* Restart summarization from switch point. */ - current_tli = switch_tli; + Assert(num_descendant_tlis > 0); + current_tli = descendant_tlis[0]; current_lsn = switch_lsn; - /* Next timeline and switch point, if any, not yet known. */ + /* Switch point, if any, and future TLIs, not yet known. */ switch_lsn = InvalidXLogRecPtr; - switch_tli = 0; + num_descendant_tlis = 0; + pfree(descendant_tlis); + descendant_tlis = NULL; /* Update (really, rewind, if needed) state in shared memory. */ LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); @@ -417,9 +455,11 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len) } /* Summarize WAL. */ + maximum_lsn = XLogRecPtrIsValid(switch_lsn) ? switch_lsn : latest_lsn; end_of_summary_lsn = SummarizeWAL(current_tli, current_lsn, exact, - switch_lsn, latest_lsn); + switch_lsn, maximum_lsn, + num_descendant_tlis, descendant_tlis); Assert(!XLogRecPtrIsInvalid(end_of_summary_lsn)); Assert(end_of_summary_lsn >= current_lsn); @@ -855,6 +895,62 @@ GetLatestLSN(TimeLineID *tli) } } +/* + * Compute the LSN at which we switched from current_tli to some later timeline. + * 'tles' must be the timeline history of the latest timeline. + * + * As a side effect, we set *num_descendant_tlis to the number of later TLIs that + * appear in the timeline history, and *descendant_tlis to an array of those TLIs, + * starting with immediate successor of current_tli. + */ +static XLogRecPtr +WalSummarizerSwitchPoint(TimeLineID current_tli, List *tles, + int *num_descendant_tlis, TimeLineID **descendant_tlis) +{ + XLogRecPtr switch_lsn = InvalidXLogRecPtr; + int count = 0; + + /* + * Find the switch point and, at the same time, count the number of TLIs + * in this history that are descendants of that TLI. + */ + foreach_ptr(TimeLineHistoryEntry, tle, tles) + { + if (tle->tli == current_tli) + { + switch_lsn = tle->end; + break; + } + ++count; + } + + /* Sanity checks. */ + if (!XLogRecPtrIsValid(switch_lsn)) + ereport(ERROR, + (errmsg("requested timeline %u is not in this server's history", + current_tli))); + if (count == 0) + elog(ERROR, "cannot compute switch point for current TLI %u", current_tli); + + /* + * Generate an array of TLIs that are part of this history and descendants + * of current_tli. The TLE list starts with the newest timeline and works + * backward toward older timelines; we want the opposite ordering. + */ + *num_descendant_tlis = count; + *descendant_tlis = palloc_array(TimeLineID, count); + for (int i = 0; i < count; ++i) + { + TimeLineHistoryEntry *tle; + + tle = (TimeLineHistoryEntry *) list_nth(tles, count - i - 1); + (*descendant_tlis)[i] = tle->tli; + } + + /* Return value is the switchpoint. */ + return switch_lsn; +} + /* * Interrupt handler for main loop of WAL summarizer process. */ @@ -908,7 +1004,8 @@ ProcessWalSummarizerInterrupts(void) */ static XLogRecPtr SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact, - XLogRecPtr switch_lsn, XLogRecPtr maximum_lsn) + XLogRecPtr switch_lsn, XLogRecPtr maximum_lsn, + int num_descendant_tlis, TimeLineID *descendant_tlis) { SummarizerReadLocalXLogPrivate *private_data; XLogReaderState *xlogreader; @@ -926,11 +1023,13 @@ SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact, private_data->tli = tli; private_data->historic = !XLogRecPtrIsInvalid(switch_lsn); private_data->read_upto = maximum_lsn; + private_data->num_descendant_tlis = num_descendant_tlis; + private_data->descendant_tlis = descendant_tlis; /* Create xlogreader. */ xlogreader = XLogReaderAllocate(wal_segment_size, NULL, XL_ROUTINE(.page_read = &summarizer_read_local_xlog_page, - .segment_open = &wal_segment_open, + .segment_open = &summarizer_wal_segment_open, .segment_close = &wal_segment_close), private_data); if (xlogreader == NULL) @@ -1485,6 +1584,54 @@ SummarizeXlogRecord(XLogReaderState *xlogreader, bool *new_fast_forward) return true; } +/* + * Similar to wal_segment_open, but checks for a file on any descendant timelines + * known to us if no file is found on the requested timeline. + */ +static void +summarizer_wal_segment_open(XLogReaderState *state, XLogSegNo nextSegNo, + TimeLineID *tli_p) +{ + SummarizerReadLocalXLogPrivate *private_data = state->private_data; + int count = 0; + TimeLineID tli = *tli_p; + char path[MAXPGPATH]; + + for (;;) + { + XLogFilePath(path, tli, nextSegNo, state->segcxt.ws_segsize); + state->seg.ws_file = BasicOpenFile(path, O_RDONLY | PG_BINARY); + if (state->seg.ws_file >= 0) + { + *tli_p = tli; + return; + } + + /* + * If the error is anything other than file-not-found, complain at + * once. + */ + if (errno != ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", + path))); + + /* Try other timelines, if any remain. */ + if (count >= private_data->num_descendant_tlis) + break; + tli = private_data->descendant_tlis[count]; + ++count; + } + + /* Complain about the originally requested filename. */ + XLogFilePath(path, *tli_p, nextSegNo, state->segcxt.ws_segsize); + ereport(ERROR, + (errcode_for_file_access(), + errmsg("requested WAL segment %s has already been removed", + path))); +} + /* * Similar to read_local_xlog_page, but limited to read from one particular * timeline. If the end of WAL is reached, it will wait for more if reading diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index a3ceb666f5e..ec41ce87a70 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -116,7 +116,7 @@ static WalReceiverFunctionsType PQWalReceiverFunctions = { }; /* Prototypes for private functions */ -static char *stringlist_to_identifierstr(PGconn *conn, List *strings); +static char *stringlist_to_identifierstr(List *strings); /* * Module initialization function @@ -458,6 +458,20 @@ libpqrcv_identify_system(WalReceiverConn *conn, TimeLineID *primary_tli) } primary_sysid = pstrdup(PQgetvalue(res, 0, 0)); *primary_tli = pg_strtoint32(PQgetvalue(res, 0, 1)); + + /* Column 2 is the server's current WAL flush position */ + { + uint32 hi, + lo; + + if (sscanf(PQgetvalue(res, 0, 2), "%X/%X", &hi, &lo) != 2) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("could not parse WAL location \"%s\"", + PQgetvalue(res, 0, 2)))); + WalRcvIdentifySystemLsn = ((uint64) hi) << 32 | lo; + } + PQclear(res); return primary_sysid; @@ -528,6 +542,32 @@ libpqrcv_get_option_from_conninfo(const char *connInfo, const char *keyword) return option; } +/* + * Append a suitably-quoted identifier or string literal to buf. + * "quote" should be either a double-quote or single-quote character. + * + * Caution: this quoting logic is sufficient for identifiers and literals + * in the replication grammar, but not always in regular SQL. Specifically, + * it'd fail for a string literal if standard_conforming_strings is off. + */ +static void +appendQuotedString(StringInfo buf, const char *str, char quote) +{ + appendStringInfoChar(buf, quote); + while (*str) + { + char c = *str++; + + if (c == quote) + appendStringInfoChar(buf, c); + appendStringInfoChar(buf, c); + } + appendStringInfoChar(buf, quote); +} + +#define appendQuotedIdentifier(b, s) appendQuotedString(b, s, '"') +#define appendQuotedLiteral(b, s) appendQuotedString(b, s, '\'') + /* * Start streaming WAL data from given streaming options. * @@ -553,8 +593,10 @@ libpqrcv_startstreaming(WalReceiverConn *conn, /* Build the command. */ appendStringInfoString(&cmd, "START_REPLICATION"); if (options->slotname != NULL) - appendStringInfo(&cmd, " SLOT \"%s\"", - options->slotname); + { + appendStringInfoString(&cmd, " SLOT "); + appendQuotedIdentifier(&cmd, options->slotname); + } if (options->logical) appendStringInfoString(&cmd, " LOGICAL"); @@ -569,7 +611,6 @@ libpqrcv_startstreaming(WalReceiverConn *conn, { char *pubnames_str; List *pubnames; - char *pubnames_literal; appendStringInfoString(&cmd, " ("); @@ -577,8 +618,10 @@ libpqrcv_startstreaming(WalReceiverConn *conn, options->proto.logical.proto_version); if (options->proto.logical.streaming_str) - appendStringInfo(&cmd, ", streaming '%s'", - options->proto.logical.streaming_str); + { + appendStringInfoString(&cmd, ", streaming "); + appendQuotedLiteral(&cmd, options->proto.logical.streaming_str); + } if (options->proto.logical.twophase && PQserverVersion(conn->streamConn) >= 150000) @@ -586,25 +629,15 @@ libpqrcv_startstreaming(WalReceiverConn *conn, if (options->proto.logical.origin && PQserverVersion(conn->streamConn) >= 160000) - appendStringInfo(&cmd, ", origin '%s'", - options->proto.logical.origin); + { + appendStringInfoString(&cmd, ", origin "); + appendQuotedLiteral(&cmd, options->proto.logical.origin); + } pubnames = options->proto.logical.publication_names; - pubnames_str = stringlist_to_identifierstr(conn->streamConn, pubnames); - if (!pubnames_str) - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), /* likely guess */ - errmsg("could not start WAL streaming: %s", - pchomp(PQerrorMessage(conn->streamConn))))); - pubnames_literal = PQescapeLiteral(conn->streamConn, pubnames_str, - strlen(pubnames_str)); - if (!pubnames_literal) - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), /* likely guess */ - errmsg("could not start WAL streaming: %s", - pchomp(PQerrorMessage(conn->streamConn))))); - appendStringInfo(&cmd, ", publication_names %s", pubnames_literal); - PQfreemem(pubnames_literal); + pubnames_str = stringlist_to_identifierstr(pubnames); + appendStringInfoString(&cmd, ", publication_names "); + appendQuotedLiteral(&cmd, pubnames_str); pfree(pubnames_str); if (options->proto.logical.binary && @@ -920,7 +953,8 @@ libpqrcv_create_slot(WalReceiverConn *conn, const char *slotname, initStringInfo(&cmd); - appendStringInfo(&cmd, "CREATE_REPLICATION_SLOT \"%s\"", slotname); + appendStringInfoString(&cmd, "CREATE_REPLICATION_SLOT "); + appendQuotedIdentifier(&cmd, slotname); if (temporary) appendStringInfoString(&cmd, " TEMPORARY"); @@ -1004,6 +1038,14 @@ libpqrcv_create_slot(WalReceiverConn *conn, const char *slotname, slotname, pchomp(PQerrorMessage(conn->streamConn))))); } + /* CREATE_REPLICATION_SLOT returns a single row with four columns */ + if (PQnfields(res) != 4 || PQntuples(res) != 1) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("invalid response from primary server"), + errdetail("Could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields.", + slotname, PQntuples(res), PQnfields(res), 1, 4))); + if (lsn) *lsn = DatumGetLSN(DirectFunctionCall1Coll(pg_lsn_in, InvalidOid, CStringGetDatum(PQgetvalue(res, 0, 1)))); @@ -1029,8 +1071,9 @@ libpqrcv_alter_slot(WalReceiverConn *conn, const char *slotname, PGresult *res; initStringInfo(&cmd); - appendStringInfo(&cmd, "ALTER_REPLICATION_SLOT %s ( ", - quote_identifier(slotname)); + appendStringInfoString(&cmd, "ALTER_REPLICATION_SLOT "); + appendQuotedIdentifier(&cmd, slotname); + appendStringInfoString(&cmd, " ( "); if (failover) appendStringInfo(&cmd, "FAILOVER %s", @@ -1226,10 +1269,10 @@ libpqrcv_exec(WalReceiverConn *conn, const char *query, * * This is essentially the reverse of SplitIdentifierString. * - * The caller should free the result. + * The caller should pfree the result. */ static char * -stringlist_to_identifierstr(PGconn *conn, List *strings) +stringlist_to_identifierstr(List *strings) { ListCell *lc; StringInfoData res; @@ -1240,21 +1283,12 @@ stringlist_to_identifierstr(PGconn *conn, List *strings) foreach(lc, strings) { char *val = strVal(lfirst(lc)); - char *val_escaped; if (first) first = false; else appendStringInfoChar(&res, ','); - - val_escaped = PQescapeIdentifier(conn, val, strlen(val)); - if (!val_escaped) - { - free(res.data); - return NULL; - } - appendStringInfoString(&res, val_escaped); - PQfreemem(val_escaped); + appendQuotedIdentifier(&res, val); } return res.data; diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 53997b6f6ab..4d3a39f4cd7 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -42,9 +42,11 @@ #include "storage/proc.h" #include "storage/procarray.h" #include "utils/builtins.h" +#include "utils/guc.h" #include "utils/injection_point.h" #include "utils/inval.h" #include "utils/memutils.h" +#include "utils/varlena.h" /* data for errcontext callback */ typedef struct LogicalErrorCallbackState @@ -54,6 +56,9 @@ typedef struct LogicalErrorCallbackState XLogRecPtr report_location; } LogicalErrorCallbackState; +/* GUC variables */ +char *output_plugin_libraries_string; + /* wrappers around output plugin callbacks */ static void output_plugin_error_callback(void *arg); static void startup_cb_wrapper(LogicalDecodingContext *ctx, OutputPluginOptions *opt, @@ -181,7 +186,69 @@ StartupDecodingContext(List *output_plugin_options, * now. */ if (!fast_forward) - LoadOutputPlugin(&ctx->callbacks, NameStr(slot->data.plugin)); + { + /* + * Before loading this library, make sure it's been blessed for + * logical decoding. + */ + const char *plugin = NameStr(slot->data.plugin); + bool plugin_allowed = false; + + if (output_plugin_libraries_string && output_plugin_libraries_string[0]) + { + /* Check this plugin against output_plugin_libraries. */ + char *rawstring; + List *elemlist = NIL; + + /* Need a modifiable copy */ + rawstring = pstrdup(output_plugin_libraries_string); + + if (!SplitGUCList(rawstring, ',', &elemlist)) + { + /* syntax error in list */ + ereport(LOG, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid list syntax in parameter \"%s\"", + "output_plugin_libraries"))); + + list_free(elemlist); + elemlist = NIL; + } + + foreach_ptr(char, allowed, elemlist) + { + if (strcmp(allowed, plugin) == 0) + { + plugin_allowed = true; + break; + } + } + + list_free(elemlist); + pfree(rawstring); + } + + if (!plugin_allowed) + { + /* + * Use the same error message as check_restricted_library_name(), + * but provide additional context for the DBA in the logs. (The + * HINT will be sent to the client, but that's not a secret.) + */ + ereport(ERROR, + errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("library \"%s\" may not be used as an output plugin", + plugin), + /*- translator: The second %s is the value of the output_plugin_libraries GUC, which may contain whitespace, commas, and double-quotes (") */ + errdetail_log("The configuration parameter \"%s\" (currently '%s') does not name this library as a trusted output plugin.", + "output_plugin_libraries", + output_plugin_libraries_string), + errhint("If it is safe for all REPLICATION users to use this library as an output plugin, add it to \"%s\" and reload the server configuration.", + "output_plugin_libraries")); + } + + LoadOutputPlugin(&ctx->callbacks, plugin); + } /* * Now that the slot's xmin has been set, we can announce ourselves as a @@ -729,7 +796,9 @@ OutputPluginUpdateProgress(struct LogicalDecodingContext *ctx, /* * Load the output plugin, lookup its output plugin init function, and check - * that it provides the required callbacks. + * that it provides the required callbacks. The caller must have checked that + * the current user has the necessary privileges to load the given plugin; + * standard LOAD restrictions are not applied here. */ static void LoadOutputPlugin(OutputPluginCallbacks *callbacks, const char *plugin) diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 11139a910b8..0330c6cea8f 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -2164,8 +2164,7 @@ static void ReorderBufferResetTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, Snapshot snapshot_now, CommandId command_id, - XLogRecPtr last_lsn, - ReorderBufferChange *specinsert) + XLogRecPtr last_lsn) { /* Discard the changes that we just streamed */ ReorderBufferTruncateTXN(rb, txn, rbtxn_is_prepared(txn)); @@ -2173,13 +2172,6 @@ ReorderBufferResetTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, /* Free all resources allocated for toast reconstruction */ ReorderBufferToastReset(rb, txn); - /* Return the spec insert change if it is not NULL */ - if (specinsert != NULL) - { - ReorderBufferFreeChange(rb, specinsert, true); - specinsert = NULL; - } - /* * For the streaming case, stop the stream and remember the command ID and * snapshot for the streaming run. @@ -2443,7 +2435,7 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, * CheckTableNotInUse() and locking. */ - /* clear out a pending (and thus failed) speculation */ + /* clear out a pending (= failed) speculative insertion */ if (specinsert != NULL) { ReorderBufferFreeChange(rb, specinsert, true); @@ -2753,6 +2745,13 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, if (using_subtxn) RollbackAndReleaseCurrentSubTransaction(); + /* Free the specinsert change before freeing the ReorderBufferTXN */ + if (specinsert != NULL) + { + ReorderBufferFreeChange(rb, specinsert, true); + specinsert = NULL; + } + /* * The error code ERRCODE_TRANSACTION_ROLLBACK indicates a concurrent * abort of the (sub)transaction we are streaming or preparing. We @@ -2786,8 +2785,7 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, /* Reset the TXN so that it is allowed to stream remaining data. */ ReorderBufferResetTXN(rb, txn, snapshot_now, - command_id, prev_lsn, - specinsert); + command_id, prev_lsn); } else { @@ -2973,11 +2971,18 @@ ReorderBufferPrepare(ReorderBuffer *rb, TransactionId xid, txn->xact_time.prepare_time, txn->origin_id, txn->origin_lsn); /* - * Send a prepare if not already done so. This might occur if we have - * detected a concurrent abort while replaying the non-streaming - * transaction. + * Send a prepare if not already done so. The "not already sent" case can + * occur if we have detected a concurrent abort while replaying the + * non-streaming transaction; we still send the prepare so that later when + * rollback prepared is decoded and sent, the downstream should be able to + * rollback such a xact. See comments atop DecodePrepare. + * + * Skip this for a transaction that made no changes to the database (i.e. + * has no base snapshot), as we haven't sent any changes for it. Such a + * transaction is cleaned up without invoking the commit/rollback prepared + * callbacks in ReorderBufferFinishPrepared(). */ - if (!rbtxn_sent_prepare(txn)) + if (!rbtxn_sent_prepare(txn) && txn->base_snapshot != NULL) { rb->prepare(rb, txn, txn->final_lsn); txn->txn_flags |= RBTXN_SENT_PREPARE; @@ -3044,6 +3049,25 @@ ReorderBufferFinishPrepared(ReorderBuffer *rb, TransactionId xid, txn->xact_time.prepare_time, txn->origin_id, txn->origin_lsn); } + /* + * If this transaction has no snapshot, it didn't make any changes to the + * database, so there's nothing to decode. Note that + * ReorderBufferCommitChild will have transferred any snapshots from + * subtransactions if there were any. + */ + if (txn->base_snapshot == NULL) + { + Assert(txn->ninvalidations == 0); + Assert(!rbtxn_sent_prepare(txn)); + + /* + * Removing this txn before a commit might result in the computation + * of an incorrect restart_lsn. See SnapBuildProcessRunningXacts. + */ + ReorderBufferCleanupTXN(rb, txn); + return; + } + txn->final_lsn = commit_lsn; txn->end_lsn = end_lsn; txn->xact_time.commit_time = commit_time; diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c index 3cbcd77d12f..c4dda8aa5f1 100644 --- a/src/backend/replication/logical/slotsync.c +++ b/src/backend/replication/logical/slotsync.c @@ -282,7 +282,7 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid, { XLogRecPtr old_confirmed_lsn = slot->data.confirmed_flush; XLogRecPtr old_restart_lsn = slot->data.restart_lsn; - XLogRecPtr old_catalog_xmin = slot->data.catalog_xmin; + TransactionId old_catalog_xmin = slot->data.catalog_xmin; LogicalSlotAdvanceAndCheckSnapState(remote_slot->confirmed_lsn, found_consistent_snapshot); @@ -463,6 +463,7 @@ drop_local_obsolete_slots(List *remote_slot_list) /* Drop the local slot if it is not required to be retained. */ if (!local_sync_slot_required(local_slot, remote_slot_list)) { + Oid slot_database = local_slot->data.database; bool synced_slot; /* @@ -470,8 +471,8 @@ drop_local_obsolete_slots(List *remote_slot_list) * ReplicationSlotsDropDBSlots(), trying to drop the same slot * during a drop-database operation. */ - LockSharedObject(DatabaseRelationId, local_slot->data.database, - 0, AccessShareLock); + LockSharedObject(DatabaseRelationId, slot_database, 0, + AccessShareLock); /* * In the small window between getting the slot to drop and @@ -488,17 +489,19 @@ drop_local_obsolete_slots(List *remote_slot_list) if (synced_slot) { - ReplicationSlotAcquire(NameStr(local_slot->data.name), true, false); + NameData slot_name = local_slot->data.name; + + ReplicationSlotAcquire(NameStr(slot_name), true, false); ReplicationSlotDropAcquired(); - } - UnlockSharedObject(DatabaseRelationId, local_slot->data.database, - 0, AccessShareLock); + ereport(LOG, + errmsg("dropped replication slot \"%s\" of database with OID %u", + NameStr(slot_name), + slot_database)); + } - ereport(LOG, - errmsg("dropped replication slot \"%s\" of database with OID %u", - NameStr(local_slot->data.name), - local_slot->data.database)); + UnlockSharedObject(DatabaseRelationId, slot_database, 0, + AccessShareLock); } } } diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 49d4ec3bee4..92e4e383d77 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -1277,6 +1277,7 @@ copy_table(Relation rel) /* Do the copy */ (void) CopyFrom(cstate); + EndCopyFrom(cstate); logicalrep_rel_close(relmapentry, NoLock); } diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 2d39a8812f1..bb40dbb45f7 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -805,9 +805,15 @@ slot_store_data(TupleTableSlot *slot, LogicalRepRelMapEntry *rel, if (!att->attisdropped && remoteattnum >= 0) { - StringInfo colvalue = &tupleData->colvalues[remoteattnum]; + StringInfo colvalue; + + if (remoteattnum >= tupleData->ncols) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("logical replication column %d not found in tuple: only %d column(s) received", + remoteattnum + 1, tupleData->ncols))); - Assert(remoteattnum < tupleData->ncols); + colvalue = &tupleData->colvalues[remoteattnum]; /* Set attnum for error callback */ apply_error_callback_arg.remote_attnum = remoteattnum; @@ -918,7 +924,11 @@ slot_modify_data(TupleTableSlot *slot, TupleTableSlot *srcslot, if (remoteattnum < 0) continue; - Assert(remoteattnum < tupleData->ncols); + if (remoteattnum >= tupleData->ncols) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("logical replication column %d not found in tuple: only %d column(s) received", + remoteattnum + 1, tupleData->ncols))); if (tupleData->colstatus[remoteattnum] != LOGICALREP_COLUMN_UNCHANGED) { @@ -2618,7 +2628,12 @@ apply_handle_update(StringInfo s) if (!att->attisdropped && remoteattnum >= 0) { - Assert(remoteattnum < newtup.ncols); + if (remoteattnum >= newtup.ncols) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("logical replication column %d not found in tuple: only %d column(s) received", + remoteattnum + 1, newtup.ncols))); + if (newtup.colstatus[remoteattnum] != LOGICALREP_COLUMN_UNCHANGED) target_perminfo->updatedCols = bms_add_member(target_perminfo->updatedCols, @@ -4800,10 +4815,6 @@ SetupApplyOrSyncWorker(int worker_slot) InitializeLogRepWorker(); - /* Connect to the origin and start the replication. */ - elog(DEBUG1, "connecting to publisher using connection string \"%s\"", - MySubscription->conninfo); - /* * Setup callback for syscache so that we know when something changes in * the subscription relation state. diff --git a/src/backend/replication/repl_scanner.l b/src/backend/replication/repl_scanner.l index 014ea8d25c6..03a34a39f4d 100644 --- a/src/backend/replication/repl_scanner.l +++ b/src/backend/replication/repl_scanner.l @@ -197,6 +197,10 @@ UPLOAD_MANIFEST { return K_UPLOAD_MANIFEST; } return IDENT; } +{xddouble} { + addlitchar('"', yyscanner); + } + {xdinside} { addlit(yytext, yyleng, yyscanner); } diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 4246d0a51e1..e60ccc424dd 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -737,44 +737,46 @@ ReplicationSlotRelease(void) */ ReplicationSlotDropAcquired(); } - - /* - * If slot needed to temporarily restrain both data and catalog xmin to - * create the catalog snapshot, remove that temporary constraint. - * Snapshots can only be exported while the initial snapshot is still - * acquired. - */ - if (!TransactionIdIsValid(slot->data.xmin) && - TransactionIdIsValid(slot->effective_xmin)) + else { - SpinLockAcquire(&slot->mutex); - slot->effective_xmin = InvalidTransactionId; - SpinLockRelease(&slot->mutex); - ReplicationSlotsComputeRequiredXmin(false); - } - - /* - * Set the time since the slot has become inactive. We get the current - * time beforehand to avoid system call while holding the spinlock. - */ - now = GetCurrentTimestamp(); + /* + * If slot needed to temporarily restrain both data and catalog xmin + * to create the catalog snapshot, remove that temporary constraint. + * Snapshots can only be exported while the initial snapshot is still + * acquired. + */ + if (!TransactionIdIsValid(slot->data.xmin) && + TransactionIdIsValid(slot->effective_xmin)) + { + SpinLockAcquire(&slot->mutex); + slot->effective_xmin = InvalidTransactionId; + SpinLockRelease(&slot->mutex); + ReplicationSlotsComputeRequiredXmin(false); + } - if (slot->data.persistency == RS_PERSISTENT) - { /* - * Mark persistent slot inactive. We're not freeing it, just - * disconnecting, but wake up others that may be waiting for it. + * Set the time since the slot has become inactive. We get the current + * time beforehand to avoid system call while holding the spinlock. */ - SpinLockAcquire(&slot->mutex); - slot->active_pid = 0; - ReplicationSlotSetInactiveSince(slot, now, false); - SpinLockRelease(&slot->mutex); - ConditionVariableBroadcast(&slot->active_cv); - } - else - ReplicationSlotSetInactiveSince(slot, now, true); + now = GetCurrentTimestamp(); - MyReplicationSlot = NULL; + if (slot->data.persistency == RS_PERSISTENT) + { + /* + * Mark persistent slot inactive. We're not freeing it, just + * disconnecting, but wake up others that may be waiting for it. + */ + SpinLockAcquire(&slot->mutex); + slot->active_pid = 0; + ReplicationSlotSetInactiveSince(slot, now, false); + SpinLockRelease(&slot->mutex); + ConditionVariableBroadcast(&slot->active_cv); + } + else + ReplicationSlotSetInactiveSince(slot, now, true); + + MyReplicationSlot = NULL; + } /* might not have been set when we've been a plain slot */ LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index 8c4d0fd9aed..49bf48a3064 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -54,6 +54,7 @@ #include "access/htup_details.h" #include "access/timeline.h" #include "access/transam.h" +#include "access/xlog.h" #include "access/xlog_internal.h" #include "access/xlogarchive.h" #include "access/xlogrecovery.h" @@ -93,6 +94,12 @@ bool hot_standby_feedback; static WalReceiverConn *wrconn = NULL; WalReceiverFunctionsType *WalReceiverFunctions = NULL; +/* + * Server's WAL flush position from the last IDENTIFY_SYSTEM call. + * Written by libpqwalreceiver, read by walreceiver main loop. + */ +XLogRecPtr WalRcvIdentifySystemLsn = InvalidXLogRecPtr; + /* * These variables are used similarly to openLogFile/SegNo, * but for walreceiver to write the XLOG. recvFileTLI is the TimeLineID @@ -159,6 +166,8 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len) TimeLineID startpointTLI; TimeLineID primaryTLI; bool first_stream; + bool upstream_catchup_logged = false; + TimestampTz upstream_catchup_deadline = 0; WalRcvData *walrcv; TimestampTz now; char *err; @@ -311,8 +320,10 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len) /* * Check that we're connected to a valid server using the - * IDENTIFY_SYSTEM replication command. + * IDENTIFY_SYSTEM replication command. Reset the global LSN + * first so we don't act on a stale value if the call fails. */ + WalRcvIdentifySystemLsn = InvalidXLogRecPtr; primary_sysid = walrcv_identify_system(wrconn, &primaryTLI); snprintf(standby_sysid, sizeof(standby_sysid), UINT64_FORMAT, @@ -336,6 +347,72 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len) errmsg("highest timeline %u of the primary is behind recovery timeline %u", primaryTLI, startpointTLI))); + /* + * If our requested startpoint is ahead of the upstream server's + * current WAL flush position, we cannot start streaming yet. (We say + * "upstream" here and not "primary" because this condition can only + * happen on a cascading standby.) This can happen when such a + * cascading standby has advanced past the upstream via archive + * recovery but the intermediate standby has not caught up with that + * yet. In this case, wait for the upstream to catch up before + * attempting START_REPLICATION, because that would fail with + * "requested starting point is ahead of the WAL flush position". + * + * We only perform this check when we're on the same timeline as the + * primary; when timelines differ, let START_REPLICATION handle the + * timeline negotiation. + * + * We also only wait if the gap is within one WAL segment. This is + * the expected case because archive recovery processes whole segment + * files: the cascade's next read position lands at the start of the + * following segment while the upstream's flush position is still + * inside the just-replayed one, producing at most a sub-segment gap. + * A larger gap means the upstream is genuinely behind, so we let + * START_REPLICATION fail normally and allow the startup process to + * fall back to other WAL sources. + * + * Honor wal_receiver_timeout so the walreceiver doesn't wait + * indefinitely: if the upstream hasn't caught up within the timeout, + * exit and let the startup process retry normally. + */ + if (startpointTLI == primaryTLI && + XLogRecPtrIsValid(WalRcvIdentifySystemLsn) && + startpoint > WalRcvIdentifySystemLsn && + startpoint - WalRcvIdentifySystemLsn <= wal_segment_size) + { + /* Set deadline on first iteration */ + if (!upstream_catchup_logged && wal_receiver_timeout > 0) + upstream_catchup_deadline = + TimestampTzPlusMilliseconds(GetCurrentTimestamp(), + wal_receiver_timeout); + + ereport(upstream_catchup_logged ? DEBUG1 : LOG, + errmsg("walreceiver requested start point %X/%08X on timeline %u is ahead of the upstream server's flush position %X/%08X, waiting", + LSN_FORMAT_ARGS(startpoint), startpointTLI, + LSN_FORMAT_ARGS(WalRcvIdentifySystemLsn))); + upstream_catchup_logged = true; + + (void) WaitLatch(MyLatch, + WL_EXIT_ON_PM_DEATH | WL_TIMEOUT | WL_LATCH_SET, + wal_retrieve_retry_interval, + WAIT_EVENT_WAL_RECEIVER_UPSTREAM_CATCHUP); + ResetLatch(MyLatch); + + if (upstream_catchup_deadline > 0 && + GetCurrentTimestamp() >= upstream_catchup_deadline) + ereport(ERROR, + (errcode(ERRCODE_CONNECTION_FAILURE), + errmsg("terminating walreceiver due to timeout while waiting for upstream to catch up"))); + + CHECK_FOR_INTERRUPTS(); + continue; + } + else + { + upstream_catchup_logged = false; + upstream_catchup_deadline = 0; + } + /* * Get any missing history files. We do this always, even when we're * not interested in that timeline, so that if we're promoted to @@ -931,9 +1008,6 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli) byteswritten = pg_pwrite(recvFile, buf, segbytes, (off_t) startoff); pgstat_report_wait_end(); - pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_NORMAL, - IOOP_WRITE, start, 1, byteswritten); - if (byteswritten <= 0) { char xlogfname[MAXFNAMELEN]; @@ -953,6 +1027,9 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli) xlogfname, startoff, (unsigned long) segbytes))); } + pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_NORMAL, + IOOP_WRITE, start, 1, byteswritten); + /* Update state for write */ recptr += byteswritten; diff --git a/src/backend/replication/walreceiverfuncs.c b/src/backend/replication/walreceiverfuncs.c index 8de2886ff0b..7ef07fb4712 100644 --- a/src/backend/replication/walreceiverfuncs.c +++ b/src/backend/replication/walreceiverfuncs.c @@ -266,11 +266,6 @@ RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr, const char *conninfo, Assert(walrcv->walRcvState == WALRCV_STOPPED || walrcv->walRcvState == WALRCV_WAITING); - if (conninfo != NULL) - strlcpy(walrcv->conninfo, conninfo, MAXCONNINFO); - else - walrcv->conninfo[0] = '\0'; - /* * Use configured replication slot if present, and ignore the value of * create_temp_slot as the slot name should be persistent. Otherwise, use @@ -288,10 +283,19 @@ RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr, const char *conninfo, walrcv->is_temp_slot = create_temp_slot; } + /* + * While waiting for instructions, the WAL receiver uses the same + * connection, so do not clobber the user-visible conninfo already saved. + */ if (walrcv->walRcvState == WALRCV_STOPPED) { launch = true; walrcv->walRcvState = WALRCV_STARTING; + + if (conninfo != NULL) + strlcpy(walrcv->conninfo, conninfo, MAXCONNINFO); + else + walrcv->conninfo[0] = '\0'; } else walrcv->walRcvState = WALRCV_RESTARTING; diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 70d90699cc6..47aec4cd2b2 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1068,7 +1068,29 @@ logical_read_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int req am_cascading_walsender = RecoveryInProgress(); if (am_cascading_walsender) - GetXLogReplayRecPtr(&currTLI); + { + TimeLineID insertTLI; + + /* + * If the insertion timeline has already been set, use it. + * InsertTimeLineID is set before the WAL segments of the old timeline + * are removed, before SharedRecoveryState switches to + * RECOVERY_STATE_DONE. + * + * There is a window where RecoveryInProgress() still returns true but + * the old timeline's WAL segments have already been removed or + * recycled. Using the WAL insertion timeline avoids attempting to + * read from those removed segments, improving availability, and is a + * safe thing to do as promotion copies the contents in the last + * segment of the old timeline to the first segment of the new + * timeline, up to the switchpoint. + */ + insertTLI = GetWALInsertionTimeLineIfSet(); + if (insertTLI != 0) + currTLI = insertTLI; + else + GetXLogReplayRecPtr(&currTLI); + } else currTLI = GetWALInsertionTimeLine(); diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 8aa90b0d6fb..49ce335146d 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -161,6 +161,7 @@ InsertRule(const char *rulname, /* * Also install dependencies on objects referenced in action and qual. */ + CheckUsageOnTypesInExpr((Node *) action, NIL, GetUserId()); recordDependencyOnExpr(&myself, (Node *) action, NIL, DEPENDENCY_NORMAL); @@ -170,6 +171,7 @@ InsertRule(const char *rulname, Query *qry = linitial_node(Query, action); qry = getInsertSelectQuery(qry, NULL); + CheckUsageOnTypesInExpr(event_qual, qry->rtable, GetUserId()); recordDependencyOnExpr(&myself, event_qual, qry->rtable, DEPENDENCY_NORMAL); } @@ -390,26 +392,11 @@ DefineQueryRewrite(const char *rulename, * ... and finally the rule must be named _RETURN. */ if (strcmp(rulename, ViewSelectRuleName) != 0) - { - /* - * In versions before 7.3, the expected name was _RETviewname. For - * backwards compatibility with old pg_dump output, accept that - * and silently change it to _RETURN. Since this is just a quick - * backwards-compatibility hack, limit the number of characters - * checked to a few less than NAMEDATALEN; this saves having to - * worry about where a multibyte character might have gotten - * truncated. - */ - if (strncmp(rulename, "_RET", 4) != 0 || - strncmp(rulename + 4, RelationGetRelationName(event_relation), - NAMEDATALEN - 4 - 4) != 0) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("view rule for \"%s\" must be named \"%s\"", - RelationGetRelationName(event_relation), - ViewSelectRuleName))); - rulename = pstrdup(ViewSelectRuleName); - } + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("view rule for \"%s\" must be named \"%s\"", + RelationGetRelationName(event_relation), + ViewSelectRuleName))); } else { @@ -844,6 +831,17 @@ RenameRewriteRule(RangeVar *relation, const char *oldName, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("renaming an ON SELECT rule is not allowed"))); + /* + * Conversely, if it's not an ON SELECT rule then it must *not* be named + * _RETURN. + */ + if (strcmp(newName, ViewSelectRuleName) == 0) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("non-view rule for \"%s\" must not be named \"%s\"", + RelationGetRelationName(targetrel), + ViewSelectRuleName))); + /* OK, do the update */ namestrcpy(&(ruleform->rulename), newName); diff --git a/src/backend/statistics/attribute_stats.c b/src/backend/statistics/attribute_stats.c index 5c1c5749ad4..50f89ff0ac3 100644 --- a/src/backend/statistics/attribute_stats.c +++ b/src/backend/statistics/attribute_stats.c @@ -93,8 +93,8 @@ enum clear_attribute_stats_argnum static struct StatsArgInfo cleararginfo[] = { - [C_ATTRELSCHEMA_ARG] = {"relation", TEXTOID}, - [C_ATTRELNAME_ARG] = {"relation", TEXTOID}, + [C_ATTRELSCHEMA_ARG] = {"schemaname", TEXTOID}, + [C_ATTRELNAME_ARG] = {"relname", TEXTOID}, [C_ATTNAME_ARG] = {"attname", TEXTOID}, [C_INHERITED_ARG] = {"inherited", BOOLOID}, [C_NUM_ATTRIBUTE_STATS_ARGS] = {0} @@ -492,11 +492,19 @@ attribute_statistics_update(FunctionCallInfo fcinfo) { bool converted = false; Datum stavalues; + Oid bounds_typid = atttypid; + + /* + * If it's a multirange, step down to the range type, as is done by + * multirange_typanalyze(). + */ + if (type_is_multirange(atttypid)) + bounds_typid = get_multirange_range(atttypid); stavalues = text_to_stavalues("range_bounds_histogram", &array_in_fn, PG_GETARG_DATUM(RANGE_BOUNDS_HISTOGRAM_ARG), - atttypid, atttypmod, + bounds_typid, atttypmod, &converted); if (converted) @@ -647,13 +655,6 @@ get_attr_stat_type(Oid reloid, AttrNumber attnum, } ReleaseSysCache(atup); - /* - * If it's a multirange, step down to the range type, as is done by - * multirange_typanalyze(). - */ - if (type_is_multirange(*atttypid)) - *atttypid = get_multirange_range(*atttypid); - /* finds the right operators even if atttypid is a domain */ typcache = lookup_type_cache(*atttypid, TYPECACHE_LT_OPR | TYPECACHE_EQ_OPR); *atttyptype = typcache->typtype; diff --git a/src/backend/statistics/dependencies.c b/src/backend/statistics/dependencies.c index eb2fc4366b4..fc605aa7526 100644 --- a/src/backend/statistics/dependencies.c +++ b/src/backend/statistics/dependencies.c @@ -536,7 +536,7 @@ statext_dependencies_deserialize(bytea *data) elog(ERROR, "invalid zero-length item array in MVDependencies"); /* what minimum bytea size do we expect for those parameters */ - min_expected_size = SizeOfItem(dependencies->ndeps); + min_expected_size = MinSizeOfItems(dependencies->ndeps); if (VARSIZE_ANY_EXHDR(data) < min_expected_size) elog(ERROR, "invalid dependencies size %zu (expected at least %zu)", diff --git a/src/backend/statistics/relation_stats.c b/src/backend/statistics/relation_stats.c index 174da7d93a5..4b85207260b 100644 --- a/src/backend/statistics/relation_stats.c +++ b/src/backend/statistics/relation_stats.c @@ -17,6 +17,8 @@ #include "postgres.h" +#include + #include "access/heapam.h" #include "catalog/indexing.h" #include "catalog/namespace.h" @@ -110,7 +112,14 @@ relation_statistics_update(FunctionCallInfo fcinfo) if (!PG_ARGISNULL(RELTUPLES_ARG)) { reltuples = PG_GETARG_FLOAT4(RELTUPLES_ARG); - if (reltuples < -1.0) + if (isnan(reltuples) || isinf(reltuples)) + { + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("argument \"%s\" must be a finite value", "reltuples"))); + result = false; + } + else if (reltuples < -1.0) { ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), diff --git a/src/backend/storage/aio/read_stream.c b/src/backend/storage/aio/read_stream.c index 6ab2e5a53f4..7f79514e962 100644 --- a/src/backend/storage/aio/read_stream.c +++ b/src/backend/storage/aio/read_stream.c @@ -555,6 +555,16 @@ read_stream_begin_impl(int flags, uint32 max_possible_buffer_limit; Oid tablespace_id; + /* + * Reject attempts to read non-local temporary relations; we would be + * likely to get wrong data since we have no visibility into the owning + * session's local buffers. + */ + if (rel && RELATION_IS_OTHER_TEMP(rel)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot access temporary tables of other sessions"))); + /* * Decide how many I/Os we will allow to run at the same time. This * number also affects how far we look ahead for opportunities to start @@ -1033,6 +1043,28 @@ read_stream_next_block(ReadStream *stream, BufferAccessStrategy *strategy) return read_stream_get_block(stream, NULL); } + +/* + * Stop using a buffer access strategy for reads from this stream. + * + * This clears the strategy for all of the stream's ReadBuffersOperations, + * including those with in-progress IOs. The completion of an IO whose + * strategy was cleared while it was in flight may have a small amount of its + * read time attributed to IOCONTEXT_NORMAL instead of the strategy's + * IOContext, because WaitReadBuffers() derives the IOContext from the (now + * cleared) strategy. This is bounded by the stream's look-ahead window and + * happens at most once, when the strategy is first cleared, so it is not worth + * the complexity of preserving the original IOContext for those IOs. + * + * Note that the caller is responsible for freeing the strategy's memory. + */ +void +read_stream_clear_strategy(ReadStream *stream) +{ + for (int i = 0; i < stream->max_ios; ++i) + stream->ios[i].op.strategy = NULL; +} + /* * Reset a read stream by releasing any queued up buffers, allowing the stream * to be used again for different blocks. This can be used to clear an diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 0212cab1026..9a771c81cb1 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -655,7 +655,7 @@ PrefetchBuffer(Relation reln, ForkNumber forkNum, BlockNumber blockNum) if (RelationUsesLocalBuffers(reln)) { - /* see comments in ReadBufferExtended */ + /* see comments in ReadBuffer_common */ if (RELATION_IS_OTHER_TEMP(reln)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -807,19 +807,10 @@ ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, { Buffer buf; - /* - * Reject attempts to read non-local temporary relations; we would be - * likely to get wrong data since we have no visibility into the owning - * session's local buffers. - */ - if (RELATION_IS_OTHER_TEMP(reln)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot access temporary tables of other sessions"))); - /* * Read the buffer, and update pgstat counters to reflect a cache hit or - * miss. + * miss. The other-session temp-relation check is enforced by + * ReadBuffer_common(). */ buf = ReadBuffer_common(reln, RelationGetSmgr(reln), 0, forkNum, blockNum, mode, strategy); @@ -1106,7 +1097,7 @@ ZeroAndLockBuffer(Buffer buffer, ReadBufferMode mode, bool already_valid) * already present, or false if more work is required to either read it in or * zero it. */ -static pg_attribute_always_inline Buffer +static pg_always_inline Buffer PinBufferForBlock(Relation rel, SMgrRelation smgr, char persistence, @@ -1189,7 +1180,7 @@ PinBufferForBlock(Relation rel, * * smgr is required, rel is optional unless using P_NEW. */ -static pg_attribute_always_inline Buffer +static pg_always_inline Buffer ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, @@ -1200,6 +1191,18 @@ ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence, int flags; char persistence; + /* + * Reject attempts to read non-local temporary relations; we would be + * likely to get wrong data since we have no visibility into the owning + * session's local buffers. This is the canonical place for the check, + * covering the ReadBufferExtended() entry point and any other caller that + * supplies a Relation. + */ + if (rel && RELATION_IS_OTHER_TEMP(rel)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot access temporary tables of other sessions"))); + /* * Backward compatibility path, most code should use ExtendBufferedRel() * instead, as acquiring the extension lock inside ExtendBufferedRel() @@ -1258,7 +1261,7 @@ ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence, return buffer; } -static pg_attribute_always_inline bool +static pg_always_inline bool StartReadBuffersImpl(ReadBuffersOperation *operation, Buffer *buffers, BlockNumber blockNum, @@ -1274,6 +1277,12 @@ StartReadBuffersImpl(ReadBuffersOperation *operation, Assert(*nblocks > 0); Assert(*nblocks <= MAX_IO_COMBINE_LIMIT); + /* see comments in ReadBuffer_common */ + if (operation->rel && RELATION_IS_OTHER_TEMP(operation->rel)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot access temporary tables of other sessions"))); + for (int i = 0; i < actual_nblocks; ++i) { bool found; @@ -1996,7 +2005,7 @@ AsyncReadBuffers(ReadBuffersOperation *operation, int *nblocks_progress) * * No locks are held either at entry or exit. */ -static pg_attribute_always_inline BufferDesc * +static pg_always_inline BufferDesc * BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, BlockNumber blockNum, BufferAccessStrategy strategy, @@ -2577,9 +2586,23 @@ ExtendBufferedRelCommon(BufferManagerRelation bmr, extend_by); if (bmr.relpersistence == RELPERSISTENCE_TEMP) + { + /* + * Reject attempts to extend non-local temporary relations; we have no + * ability to transfer about-to-be-created local buffers into the + * owning session's local buffers. This is the canonical place for + * the check, covering any attempt to extend a non-local temporary + * relation. + */ + if (bmr.rel && RELATION_IS_OTHER_TEMP(bmr.rel)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot access temporary tables of other sessions"))); + first_block = ExtendBufferedRelLocal(bmr, fork, flags, extend_by, extend_upto, buffers, &extend_by); + } else first_block = ExtendBufferedRelShared(bmr, fork, strategy, flags, extend_by, extend_upto, @@ -6780,7 +6803,7 @@ EvictRelUnpinnedBuffers(Relation rel, int32 *buffers_evicted, * part of error handling, which in turn could lead to the buffer being * replaced while IO is ongoing. */ -static pg_attribute_always_inline void +static pg_always_inline void buffer_stage_common(PgAioHandle *ioh, bool is_write, bool is_temp) { uint64 *io_data; @@ -7026,7 +7049,7 @@ buffer_readv_encode_error(PgAioResult *result, * Helper for AIO readv completion callbacks, supporting both shared and temp * buffers. Gets called once for each buffer in a multi-page read. */ -static pg_attribute_always_inline void +static pg_always_inline void buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer, uint8 flags, bool failed, bool is_temp, bool *buffer_invalid, @@ -7170,7 +7193,7 @@ buffer_readv_complete_one(PgAioTargetData *td, uint8 buf_off, Buffer buffer, * * Shared between shared and local buffers, to reduce code duplication. */ -static pg_attribute_always_inline PgAioResult +static pg_always_inline PgAioResult buffer_readv_complete(PgAioHandle *ioh, PgAioResult prior_result, uint8 cb_data, bool is_temp) { diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c index ba26627f7b0..bda2bc97945 100644 --- a/src/backend/storage/buffer/localbuf.c +++ b/src/backend/storage/buffer/localbuf.c @@ -305,16 +305,24 @@ GetLocalVictimBuffer(void) uint32 GetLocalPinLimit(void) { - /* Every backend has its own temporary buffers, and can pin them all. */ - return num_temp_buffers; + /* + * Every backend has its own temporary buffers, but we leave headroom for + * concurrent pin-holders -- like multiple scans in the same query. + */ + return num_temp_buffers / 4; } /* see GetAdditionalPinLimit() */ uint32 GetAdditionalLocalPinLimit(void) { + uint32 total = GetLocalPinLimit(); + Assert(NLocalPinnedBuffers <= num_temp_buffers); - return num_temp_buffers - NLocalPinnedBuffers; + + if (NLocalPinnedBuffers >= total) + return 0; + return total - NLocalPinnedBuffers; } /* see LimitAdditionalPins() */ diff --git a/src/backend/storage/ipc/procsignal.c b/src/backend/storage/ipc/procsignal.c index 05d99b452c3..e7c9da2b940 100644 --- a/src/backend/storage/ipc/procsignal.c +++ b/src/backend/storage/ipc/procsignal.c @@ -185,6 +185,15 @@ ProcSignalInit(const uint8 *cancel_key, int cancel_key_len) /* Clear out any leftover signal reasons */ MemSet(slot->pss_signalFlags, 0, NUM_PROCSIGNALS * sizeof(sig_atomic_t)); + /* + * Publish the PID before reading the global barrier generation to ensure + * that EmitProcSignalBarrier() doesn't skip us while we are grabbing an + * older generation. We need a memory barrier here to make sure that the + * update of pss_pid is ordered before the subsequent load of + * psh_barrierGeneration. + */ + pg_atomic_write_membarrier_u32(&slot->pss_pid, MyProcPid); + /* * Initialize barrier state. Since we're a brand-new process, there * shouldn't be any leftover backend-private state that needs to be @@ -204,7 +213,6 @@ ProcSignalInit(const uint8 *cancel_key, int cancel_key_len) if (cancel_key_len > 0) memcpy(slot->pss_cancel_key, cancel_key, cancel_key_len); slot->pss_cancel_key_len = cancel_key_len; - pg_atomic_write_u32(&slot->pss_pid, MyProcPid); SpinLockRelease(&slot->pss_mutex); diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index 8f15d0c9b9e..b59e38adf87 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -919,7 +919,10 @@ static void ProcKill(int code, Datum arg) { PGPROC *proc; + PGPROC *leader; dlist_head *procgloballist; + bool push_leader; + bool push_self; Assert(MyProc != NULL); @@ -951,69 +954,99 @@ ProcKill(int code, Datum arg) ConditionVariableCancelSleep(); /* - * Detach from any lock group of which we are a member. If the leader - * exits before all other group members, its PGPROC will remain allocated - * until the last group process exits; that process must return the - * leader's PGPROC to the appropriate list. + * Reset MyLatch to the process local one and disown the shared latch, so + * that signal handlers et al can continue using the latch after the + * shared latch isn't ours anymore. + * + * DisownLatch() must happen before our PGPROC can appear on a freelist: a + * newly-forked backend that pops our slot and calls OwnLatch() would + * PANIC on a still-owned latch. + * + * pgstat_reset_wait_event_storage() is intentionally deferred until after + * the lock-group block so that wait_event_info remains visible in our + * PGPROC slot while we may be observed there. It is safe to defer + * because our slot is not yet on any freelist at this point, and useful + * for testing purposes. + */ + SwitchBackToLocalLatch(); + DisownLatch(&MyProc->procLatch); + + proc = MyProc; + procgloballist = proc->procgloballist; + + /* + * Detach from any lock group of which we are a member, deciding under + * leader_lwlock whether we (via push_self) and/or the leader (via + * push_leader) need to be pushed onto a freelist. The actual pushes + * happen after evaluating if any of these are required, under a single + * ProcGlobal->freeProcsLock. + * + * The decision whether any of the freelists needs to be updated is taken + * under a single leader_lwlock. */ - if (MyProc->lockGroupLeader != NULL) + push_leader = false; + push_self = true; + leader = NULL; + + if (proc->lockGroupLeader != NULL) { - PGPROC *leader = MyProc->lockGroupLeader; - LWLock *leader_lwlock = LockHashPartitionLockByProc(leader); + LWLock *leader_lwlock; + + leader = proc->lockGroupLeader; + leader_lwlock = LockHashPartitionLockByProc(leader); LWLockAcquire(leader_lwlock, LW_EXCLUSIVE); Assert(!dlist_is_empty(&leader->lockGroupMembers)); - dlist_delete(&MyProc->lockGroupLink); + dlist_delete(&proc->lockGroupLink); if (dlist_is_empty(&leader->lockGroupMembers)) { leader->lockGroupLeader = NULL; - if (leader != MyProc) + if (leader != proc) { - procgloballist = leader->procgloballist; - - /* Leader exited first; return its PGPROC. */ - SpinLockAcquire(ProcStructLock); - dlist_push_head(procgloballist, &leader->links); - SpinLockRelease(ProcStructLock); + /* + * We are the last follower and the leader exited earlier; its + * PGPROC is still allocated and must be pushed here. + */ + push_leader = true; + proc->lockGroupLeader = NULL; } } - else if (leader != MyProc) - MyProc->lockGroupLeader = NULL; + else if (leader != proc) + { + /* Non-last follower; leader still present in the group. */ + proc->lockGroupLeader = NULL; + } + else + { + /* + * We are the leader and followers remain. Skip our own push; the + * last follower to exit will push us back to the freelist. + */ + push_self = false; + } LWLockRelease(leader_lwlock); } - /* - * Reset MyLatch to the process local one. This is so that signal - * handlers et al can continue using the latch after the shared latch - * isn't ours anymore. - * - * Similarly, stop reporting wait events to MyProc->wait_event_info. - * - * After that clear MyProc and disown the shared latch. - */ - SwitchBackToLocalLatch(); + /* See comment above, close to DisownLatch() */ pgstat_reset_wait_event_storage(); - proc = MyProc; MyProc = NULL; MyProcNumber = INVALID_PROC_NUMBER; - DisownLatch(&proc->procLatch); /* Mark the proc no longer in use */ proc->pid = 0; proc->vxid.procNumber = INVALID_PROC_NUMBER; proc->vxid.lxid = InvalidTransactionId; - procgloballist = proc->procgloballist; SpinLockAcquire(ProcStructLock); - - /* - * If we're still a member of a locking group, that means we're a leader - * which has somehow exited before its children. The last remaining child - * will release our PGPROC. Otherwise, release it now. - */ - if (proc->lockGroupLeader == NULL) + if (push_leader) + { + /* Return leader PGPROC (and semaphore) to appropriate freelist */ + dlist_push_head(leader->procgloballist, &leader->links); + } + if (push_self) { + Assert(proc->lockGroupLeader == NULL); /* Since lockGroupLeader is NULL, lockGroupMembers should be empty. */ Assert(dlist_is_empty(&proc->lockGroupMembers)); diff --git a/src/backend/tcop/backend_startup.c b/src/backend/tcop/backend_startup.c index c89fe12825f..8ad4808e537 100644 --- a/src/backend/tcop/backend_startup.c +++ b/src/backend/tcop/backend_startup.c @@ -649,8 +649,13 @@ ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done) char GSSok = 'N'; #ifdef ENABLE_GSS - /* No GSSAPI encryption when on Unix socket */ - if (port->laddr.addr.ss_family != AF_UNIX) + + /* + * No GSSAPI encryption when on Unix socket. + * + * Also no GSS negotiation if we already have a direct SSL connection. + */ + if (port->laddr.addr.ss_family != AF_UNIX && !port->ssl_in_use) GSSok = 'G'; #endif diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 08791b8f75e..340e2daf222 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -1004,8 +1004,8 @@ FillPortalStore(Portal portal, bool isTopLevel) portal->holdStore, portal->holdContext, false, - NULL, - NULL); + portal->tupDesc, + gettext_noop("query result type does not match portal result type")); switch (portal->strategy) { diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 4b8d877842b..6dabd7e1560 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1367,7 +1367,8 @@ ProcessUtilitySlow(ParseState *pstate, address = AlterDomainAddConstraint(stmt->typeName, stmt->def, - &secondaryObject); + &secondaryObject, + false); break; case 'X': /* DROP CONSTRAINT */ address = @@ -1878,7 +1879,21 @@ ProcessUtilitySlow(ParseState *pstate, { Oid relid; CreateStatsStmt *stmt = (CreateStatsStmt *) parsetree; - RangeVar *rel = (RangeVar *) linitial(stmt->relations); + RangeVar *rel; + + /* + * Examine the FROM clause. Currently, we only allow it + * to be a single simple table, but later we'll probably + * allow multiple tables and JOIN syntax. The grammar is + * already prepared for that, so we have to check here + * that what we got is what we can support. + */ + if (list_length(stmt->relations) != 1) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("only a single relation is allowed in CREATE STATISTICS"))); + + rel = (RangeVar *) linitial(stmt->relations); if (!IsA(rel, RangeVar)) ereport(ERROR, @@ -1901,7 +1916,8 @@ ProcessUtilitySlow(ParseState *pstate, /* Run parse analysis ... */ stmt = transformStatsStmt(relid, stmt, queryString); - address = CreateStatistics(stmt, true); + address = CreateStatistics(list_make1_oid(relid), stmt, + true); } break; diff --git a/src/backend/tsearch/dict_synonym.c b/src/backend/tsearch/dict_synonym.c index e44bf876f8b..fc39caaddca 100644 --- a/src/backend/tsearch/dict_synonym.c +++ b/src/backend/tsearch/dict_synonym.c @@ -24,7 +24,6 @@ typedef struct { char *in; char *out; - int outlen; uint16 flags; } Syn; @@ -189,7 +188,6 @@ dsynonym_init(PG_FUNCTION_ARGS) d->syn[cur].out = str_tolower(starto, strlen(starto), DEFAULT_COLLATION_OID); } - d->syn[cur].outlen = strlen(starto); d->syn[cur].flags = flags; cur++; @@ -236,7 +234,7 @@ dsynonym_lexize(PG_FUNCTION_ARGS) PG_RETURN_POINTER(NULL); res = palloc0(sizeof(TSLexeme) * 2); - res[0].lexeme = pnstrdup(found->out, found->outlen); + res[0].lexeme = pstrdup(found->out); res[0].flags = found->flags; PG_RETURN_POINTER(res); diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c index 7f8c677a438..e4393e35971 100644 --- a/src/backend/tsearch/spell.c +++ b/src/backend/tsearch/spell.c @@ -1182,12 +1182,18 @@ getAffixFlagSet(IspellDict *Conf, char *s) errmsg("invalid affix alias \"%s\"", s))); if (curaffix > 0 && curaffix < Conf->nAffixData) + { + if (Conf->AffixData[curaffix] == NULL) + ereport(ERROR, + (errcode(ERRCODE_CONFIG_FILE_ERROR), + errmsg("invalid affix alias \"%s\"", s))); /* * Do not subtract 1 from curaffix because empty string was added * in NIImportOOAffixes */ return Conf->AffixData[curaffix]; + } else if (curaffix > Conf->nAffixData) ereport(ERROR, (errcode(ERRCODE_CONFIG_FILE_ERROR), @@ -1422,6 +1428,13 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename) tsearch_readline_end(&trst); if (ptype) pfree(ptype); + + /* Reject incomplete AF alias table. */ + if (Conf->useFlagAliases && curaffix != naffix) + ereport(ERROR, + (errcode(ERRCODE_CONFIG_FILE_ERROR), + errmsg("number of aliases is less than specified number %d", + naffix - 1))); } /* @@ -1449,6 +1462,8 @@ NIImportAffixes(IspellDict *Conf, const char *filename) bool oldformat = false; char *recoded = NULL; + flag[0] = '\0'; /* no flag seen yet */ + if (!tsearch_readline_begin(&trst, filename)) ereport(ERROR, (errcode(ERRCODE_CONFIG_FILE_ERROR), @@ -1998,7 +2013,8 @@ NISortAffixes(IspellDict *Conf) /* Store compound affixes in the Conf->CompoundAffix array */ if (Conf->naffixes > 1) qsort(Conf->Affix, Conf->naffixes, sizeof(AFFIX), cmpaffix); - Conf->CompoundAffix = ptr = (CMPDAffix *) palloc(sizeof(CMPDAffix) * Conf->naffixes); + /* +1 for terminator */ + Conf->CompoundAffix = ptr = palloc_array(CMPDAffix, Conf->naffixes + 1); ptr->affix = NULL; for (i = 0; i < Conf->naffixes; i++) diff --git a/src/backend/tsearch/to_tsany.c b/src/backend/tsearch/to_tsany.c index 4dfcc2cd3bd..6b1b1c0ea36 100644 --- a/src/backend/tsearch/to_tsany.c +++ b/src/backend/tsearch/to_tsany.c @@ -165,8 +165,8 @@ TSVector make_tsvector(ParsedText *prs) { int i, - j, - lenstr = 0, + j; + size_t lenstr = 0, totallen; TSVector in; WordEntry *ptr; @@ -177,10 +177,22 @@ make_tsvector(ParsedText *prs) if (prs->curwords > 0) prs->curwords = uniqueWORD(prs->words, prs->curwords); - /* Determine space needed */ + /* + * Determine space needed. Since what we are calculating is equivalent to + * the size of a portion of the input data structure, lenstr surely can't + * overflow size_t. + */ for (i = 0; i < prs->curwords; i++) { - lenstr += prs->words[i].len; + int toklen = prs->words[i].len; + + /* Double-check that caller passed only lexemes of valid lengths */ + if (toklen <= 0 || toklen > MAXSTRLEN) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("lexeme is too long for tsvector (%zu bytes, max %zu bytes)", + (size_t) toklen, (size_t) MAXSTRLEN))); + lenstr += toklen; if (prs->words[i].alen) { lenstr = SHORTALIGN(lenstr); @@ -191,7 +203,8 @@ make_tsvector(ParsedText *prs) if (lenstr > MAXSTRPOS) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("string is too long for tsvector (%d bytes, max %d bytes)", lenstr, MAXSTRPOS))); + errmsg("string is too long for tsvector (%zu bytes, max %zu bytes)", + lenstr, (size_t) MAXSTRPOS))); totallen = CALCDATASIZE(prs->curwords, lenstr); in = (TSVector) palloc0(totallen); diff --git a/src/backend/tsearch/ts_parse.c b/src/backend/tsearch/ts_parse.c index e5da6cf17ec..6f04d1d25a6 100644 --- a/src/backend/tsearch/ts_parse.c +++ b/src/backend/tsearch/ts_parse.c @@ -401,12 +401,30 @@ parsetext(Oid cfgId, ParsedText *prs, char *buf, int buflen) while ((norms = LexizeExec(&ldata, NULL)) != NULL) { - TSLexeme *ptr = norms; - prs->pos++; /* set pos */ - while (ptr->lexeme) + for (TSLexeme *ptr = norms; ptr->lexeme; ptr++) { + size_t lexeme_len = strlen(ptr->lexeme); + + if (lexeme_len > MAXSTRLEN) + { +#ifdef IGNORE_LONGLEXEME + ereport(NOTICE, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("word is too long to be indexed"), + errdetail("Words longer than %d characters are ignored.", + MAXSTRLEN))); + continue; +#else + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("word is too long to be indexed"), + errdetail("Words longer than %d characters are ignored.", + MAXSTRLEN))); +#endif + } + if (prs->curwords == prs->lenwords) { prs->lenwords *= 2; @@ -415,13 +433,12 @@ parsetext(Oid cfgId, ParsedText *prs, char *buf, int buflen) if (ptr->flags & TSL_ADDPOS) prs->pos++; - prs->words[prs->curwords].len = strlen(ptr->lexeme); + prs->words[prs->curwords].len = lexeme_len; prs->words[prs->curwords].word = ptr->lexeme; prs->words[prs->curwords].nvariant = ptr->nvariant; prs->words[prs->curwords].flags = ptr->flags & TSL_PREFIX; prs->words[prs->curwords].alen = 0; prs->words[prs->curwords].pos.pos = LIMITPOS(prs->pos); - ptr++; prs->curwords++; } pfree(norms); diff --git a/src/backend/utils/activity/backend_progress.c b/src/backend/utils/activity/backend_progress.c index 99a8c73bf04..37caeb96fac 100644 --- a/src/backend/utils/activity/backend_progress.c +++ b/src/backend/utils/activity/backend_progress.c @@ -99,8 +99,6 @@ pgstat_progress_parallel_incr_param(int index, int64 incr) { static StringInfoData progress_message; - initStringInfo(&progress_message); - pq_beginmessage(&progress_message, PqMsg_Progress); pq_sendint32(&progress_message, index); pq_sendint64(&progress_message, incr); diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 9113ee9d6a9..99e537bc886 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -620,7 +620,7 @@ pgstat_shutdown_hook(int code, Datum arg) dlist_init(&pgStatPending); /* drop the backend stats entry */ - if (!pgstat_drop_entry(PGSTAT_KIND_BACKEND, InvalidOid, MyProcNumber)) + if (!pgstat_drop_entry_ext(PGSTAT_KIND_BACKEND, InvalidOid, MyProcNumber, false)) pgstat_request_entry_refs_gc(); pgstat_detach_shmem(); diff --git a/src/backend/utils/activity/pgstat_function.c b/src/backend/utils/activity/pgstat_function.c index 6214f93d36e..eaeb0dcb1de 100644 --- a/src/backend/utils/activity/pgstat_function.c +++ b/src/backend/utils/activity/pgstat_function.c @@ -112,8 +112,8 @@ pgstat_init_function_usage(FunctionCallInfo fcinfo, AcceptInvalidationMessages(); if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(fcinfo->flinfo->fn_oid))) { - pgstat_drop_entry(PGSTAT_KIND_FUNCTION, MyDatabaseId, - fcinfo->flinfo->fn_oid); + pgstat_drop_entry_ext(PGSTAT_KIND_FUNCTION, MyDatabaseId, + fcinfo->flinfo->fn_oid, true); ereport(ERROR, errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("function call to dropped function")); } diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c index ccfb11c49bf..675c535266c 100644 --- a/src/backend/utils/activity/pgstat_replslot.c +++ b/src/backend/utils/activity/pgstat_replslot.c @@ -157,8 +157,8 @@ pgstat_drop_replslot(ReplicationSlot *slot) { Assert(LWLockHeldByMeInMode(ReplicationSlotAllocationLock, LW_EXCLUSIVE)); - if (!pgstat_drop_entry(PGSTAT_KIND_REPLSLOT, InvalidOid, - ReplicationSlotIndex(slot))) + if (!pgstat_drop_entry_ext(PGSTAT_KIND_REPLSLOT, InvalidOid, + ReplicationSlotIndex(slot), false)) pgstat_request_entry_refs_gc(); } diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index 2b7f783ef7c..8889e4cac26 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -525,9 +525,12 @@ pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, uint64 objid, bool create, if (shheader == NULL) { /* - * Failed the allocation of a new entry, so clean up the - * shared hashtable before giving up. + * Failed the allocation of a new entry, so clean up both the + * local reference and the shared hashtable before giving up. + * Clean the local state first, since releasing the dshash + * lock can process a pending interrupt. */ + pgstat_release_entry_ref(key, entry_ref, false); dshash_delete_entry(pgStatLocal.shared_hash, shhashent); ereport(ERROR, @@ -880,7 +883,7 @@ pgstat_free_entry(PgStatShared_HashEntry *shent, dshash_seq_status *hstat) /* * Helper for both pgstat_drop_database_and_contents() and - * pgstat_drop_entry(). If hstat is non-null delete the shared entry using + * pgstat_drop_entry_ext(). If hstat is non-null delete the shared entry using * dshash_delete_current(), otherwise use dshash_delete_entry(). In either * case the entry needs to be already locked. */ @@ -898,14 +901,7 @@ pgstat_drop_entry_internal(PgStatShared_HashEntry *shent, * Signal that the entry is dropped - this will eventually cause other * backends to release their references. */ - if (shent->dropped) - elog(ERROR, - "trying to drop stats entry already dropped: kind=%s dboid=%u objid=%" PRIu64 " refcount=%u generation=%u", - pgstat_get_kind_info(shent->key.kind)->name, - shent->key.dboid, - shent->key.objid, - pg_atomic_read_u32(&shent->refcount), - pg_atomic_read_u32(&shent->generation)); + Assert(!shent->dropped); shent->dropped = true; /* release refcount marking entry as not dropped */ @@ -975,19 +971,33 @@ pgstat_drop_database_and_contents(Oid dboid) pgstat_request_entry_refs_gc(); } +/* + * ABI-preserving wrapper around pgstat_drop_entry_ext(). + * + * The original routine introduced in v15 did not include "missing_ok". + */ +bool +pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid) +{ + return pgstat_drop_entry_ext(kind, dboid, objid, false); +} + /* * Drop a single stats entry. * * This routine returns false if the stats entry of the dropped object could * not be freed, true otherwise. * + * If missing_ok is true, skip entries that have been concurrently dropped. + * * The callers of this function should call pgstat_request_entry_refs_gc() * if the stats entry could not be freed, to ensure that this entry's memory * can be reclaimed later by a different backend calling * pgstat_gc_entry_refs(). */ bool -pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid) +pgstat_drop_entry_ext(PgStat_Kind kind, Oid dboid, uint64 objid, + bool missing_ok) { PgStat_HashKey key; PgStatShared_HashEntry *shent; @@ -1015,6 +1025,20 @@ pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid) shent = dshash_find(pgStatLocal.shared_hash, &key, true); if (shent) { + if (shent->dropped) + { + if (!missing_ok) + elog(ERROR, + "trying to drop stats entry already dropped: kind=%s dboid=%u objid=%" PRIu64 " refcount=%u generation=%u", + pgstat_get_kind_info(shent->key.kind)->name, + shent->key.dboid, + shent->key.objid, + pg_atomic_read_u32(&shent->refcount), + pg_atomic_read_u32(&shent->generation)); + dshash_release_lock(pgStatLocal.shared_hash, shent); + return true; + } + freed = pgstat_drop_entry_internal(shent, NULL); /* diff --git a/src/backend/utils/activity/pgstat_xact.c b/src/backend/utils/activity/pgstat_xact.c index bc9864bd8d9..fbbf2844a58 100644 --- a/src/backend/utils/activity/pgstat_xact.c +++ b/src/backend/utils/activity/pgstat_xact.c @@ -85,7 +85,7 @@ AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit) * Transaction that dropped an object committed. Drop the stats * too. */ - if (!pgstat_drop_entry(it->kind, it->dboid, objid)) + if (!pgstat_drop_entry_ext(it->kind, it->dboid, objid, true)) not_freed_count++; } else if (!isCommit && pending->is_create) @@ -94,7 +94,7 @@ AtEOXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, bool isCommit) * Transaction that created an object aborted. Drop the stats * associated with the object. */ - if (!pgstat_drop_entry(it->kind, it->dboid, objid)) + if (!pgstat_drop_entry_ext(it->kind, it->dboid, objid, true)) not_freed_count++; } @@ -160,7 +160,7 @@ AtEOSubXact_PgStat_DroppedStats(PgStat_SubXactStatus *xact_state, * Subtransaction creating a new stats object aborted. Drop the * stats object. */ - if (!pgstat_drop_entry(it->kind, it->dboid, objid)) + if (!pgstat_drop_entry_ext(it->kind, it->dboid, objid, true)) not_freed_count++; pfree(pending); } @@ -323,7 +323,7 @@ pgstat_execute_transactional_drops(int ndrops, struct xl_xact_stats_item *items, xl_xact_stats_item *it = &items[i]; uint64 objid = ((uint64) it->objid_hi) << 32 | it->objid_lo; - if (!pgstat_drop_entry(it->kind, it->dboid, objid)) + if (!pgstat_drop_entry_ext(it->kind, it->dboid, objid, true)) not_freed_count++; } diff --git a/src/backend/utils/activity/wait_event_names.txt b/src/backend/utils/activity/wait_event_names.txt index b9c1e6900ec..6f15bd6978c 100644 --- a/src/backend/utils/activity/wait_event_names.txt +++ b/src/backend/utils/activity/wait_event_names.txt @@ -162,6 +162,7 @@ WAL_SUMMARY_READY "Waiting for a new WAL summary to be generated." XACT_GROUP_UPDATE "Waiting for the group leader to update transaction status at transaction end." ABI_compatibility: +WAL_RECEIVER_UPSTREAM_CATCHUP "Waiting for upstream server WAL flush position to catch up to requested start point." # # Wait Events - Timeout diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 1213f9106d5..0ec8c19d64b 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -80,7 +80,7 @@ enum RoleRecurseType }; static Oid cached_role[] = {InvalidOid, InvalidOid, InvalidOid}; static List *cached_roles[] = {NIL, NIL, NIL}; -static uint32 cached_db_hash; +uint32 cached_db_hash; /* * If the list of roles gathered by roles_is_member_of() grows larger than the diff --git a/src/backend/utils/adt/cash.c b/src/backend/utils/adt/cash.c index 611d23f3cb0..935ae3c2ebf 100644 --- a/src/backend/utils/adt/cash.c +++ b/src/backend/utils/adt/cash.c @@ -160,6 +160,22 @@ cash_div_int64(Cash c, int64 i) (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); + /* + * INT64_MIN / -1 is problematic, since the result can't be represented on + * a two's-complement machine. Some machines produce INT64_MIN, some + * produce zero, some throw an exception. We can dodge the problem by + * recognizing that division by -1 is the same as negation. + */ + if (i == -1) + { + if (unlikely(c == PG_INT64_MIN)) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("money out of range"))); + return -c; + } + + /* No overflow is possible */ return c / i; } diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 295e55ccd8b..9460ee1b7c6 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -114,6 +114,7 @@ #define DCH_MAX_ITEM_SIZ 12 /* max localized day name */ #define NUM_MAX_ITEM_SIZ 8 /* roman number (RN has 15 chars) */ +#define MAX_L10N_DATA 80 /* max localized day or month name */ /* ---------- * Format parser structs @@ -1097,8 +1098,8 @@ static int from_char_parse_int_len(int *dest, const char **src, const int len, FormatNode *node, Node *escontext); static int from_char_parse_int(int *dest, const char **src, FormatNode *node, Node *escontext); -static int seq_search_ascii(const char *name, const char *const *array, int *len); -static int seq_search_localized(const char *name, char **array, int *len, +static int seq_search_ascii(const char *name, const char *const *array, size_t *len); +static int seq_search_localized(const char *name, char **array, size_t *len, Oid collid); static bool from_char_seq_search(int *dest, const char **src, const char *const *array, @@ -2317,7 +2318,7 @@ from_char_parse_int(int *dest, const char **src, FormatNode *node, * suitable for comparisons to ASCII strings. */ static int -seq_search_ascii(const char *name, const char *const *array, int *len) +seq_search_ascii(const char *name, const char *const *array, size_t *len) { unsigned char firstc; const char *const *a; @@ -2362,6 +2363,41 @@ seq_search_ascii(const char *name, const char *const *array, int *len) return -1; } +/* + * Compare 'name' with 'element' in a case-insensitive way, by first + * converting 'name' to upper case, then lower case. ('element' is already + * case-folded that way.) + * + * A helper function for seq_search_localized(). + */ +static bool +casefold_str_cmp(const char *name, size_t name_len, + const char *element, size_t element_len, + pg_locale_t mylocale) +{ + /* + * 'name' is expected to fit in MAX_L10N_DATA, even with the case + * conversions. + */ + char upper_substr[MAX_L10N_DATA]; + size_t upper_substr_len; + char lower_substr[MAX_L10N_DATA]; + size_t lower_substr_len; + + upper_substr_len = pg_strupper(upper_substr, sizeof(upper_substr), + name, name_len, + mylocale); + if (upper_substr_len > sizeof(upper_substr) - 1) + return false; /* shouldn't happen */ + lower_substr_len = pg_strlower(lower_substr, sizeof(lower_substr), + upper_substr, upper_substr_len, + mylocale); + if (lower_substr_len > sizeof(lower_substr) - 1) + return false; /* shouldn't happen */ + + return strcmp(lower_substr, element) == 0; +} + /* * Sequentially search an array of possibly non-English words for * a case-insensitive match to the initial character(s) of "name". @@ -2374,11 +2410,13 @@ seq_search_ascii(const char *name, const char *const *array, int *len) * the arrays exported by pg_locale.c aren't const. */ static int -seq_search_localized(const char *name, char **array, int *len, Oid collid) +seq_search_localized(const char *name, char **array, size_t *len, Oid collid) { - char **a; + size_t name_len = strlen(name); + const char *name_end = name + name_len; char *upper_name; char *lower_name; + pg_locale_t mylocale; *len = 0; @@ -2390,9 +2428,9 @@ seq_search_localized(const char *name, char **array, int *len, Oid collid) * The case-folding processing done below is fairly expensive, so before * doing that, make a quick pass to see if there is an exact match. */ - for (a = array; *a != NULL; a++) + for (char **a = array; *a != NULL; a++) { - int element_len = strlen(*a); + size_t element_len = strlen(*a); if (strncmp(name, *a, element_len) == 0) { @@ -2401,36 +2439,109 @@ seq_search_localized(const char *name, char **array, int *len, Oid collid) } } + mylocale = pg_newlocale_from_collation(collid); + /* * Fold to upper case, then to lower case, so that we can match reliably * even in languages in which case conversions are not injective. */ - upper_name = str_toupper(name, strlen(name), collid); + upper_name = str_toupper(name, name_len, collid); lower_name = str_tolower(upper_name, strlen(upper_name), collid); pfree(upper_name); - for (a = array; *a != NULL; a++) + for (char **a = array; *a != NULL; a++) { - char *upper_element; - char *lower_element; - int element_len; + char upper_element[MAX_L10N_DATA]; + size_t upper_element_len; + char lower_element[MAX_L10N_DATA]; + size_t lower_element_len; /* Likewise upper/lower-case array element */ - upper_element = str_toupper(*a, strlen(*a), collid); - lower_element = str_tolower(upper_element, strlen(upper_element), - collid); - pfree(upper_element); - element_len = strlen(lower_element); - - /* Match? */ - if (strncmp(lower_name, lower_element, element_len) == 0) + upper_element_len = pg_strupper(upper_element, sizeof(upper_element), + *a, strlen(*a), + mylocale); + if (upper_element_len > sizeof(upper_element) - 1) + continue; /* shouldn't happen */ + lower_element_len = pg_strlower(lower_element, sizeof(lower_element), + upper_element, upper_element_len, + mylocale); + if (lower_element_len > sizeof(lower_element) - 1) + continue; /* shouldn't happen */ + + /* Is 'lower_element' a prefix of 'lower_name' ? */ + if (strncmp(lower_name, lower_element, lower_element_len) == 0) { - *len = element_len; - pfree(lower_element); - pfree(lower_name); - return a - array; + /* + * We have a match, but we still need to figure out how long the + * match is. The case conversions could have changed the lengths + * of either string, or both. + */ + const char *ep; + const char *element_end; + size_t element_nchars; + size_t substr_len; + size_t substr_nchars; + + /* + * First, check the easy case that the string matches as whole. + */ + if (strlen(lower_name) == lower_element_len) + { + *len = name_len; + pfree(lower_name); + return a - array; + } + + /* + * Another good guess is that the case conversions did not change + * the number of characters. + */ + + /* count characters in the element */ + ep = lower_element; + element_end = lower_element + lower_element_len; + for (element_nchars = 0; ep < element_end; element_nchars++) + ep += pg_mblen_range(ep, element_end); + + /* + * count the byte length of a substring of 'name' having the same + * character count as the element + */ + substr_len = 0; + for (substr_nchars = 0; + substr_nchars < element_nchars && substr_len < name_len; + substr_nchars++) + { + substr_len += pg_mblen_range(name + substr_len, name_end); + } + + if (casefold_str_cmp(name, substr_len, lower_element, lower_element_len, mylocale)) + { + *len = substr_len; + pfree(lower_name); + return a - array; + } + + /* + * As last resort, try the case conversion and comparison for + * every substring from the beginning of the original string until + * we find a match. + */ + substr_len = 0; + while (substr_len < name_len) + { + substr_len += pg_mblen_range(name + substr_len, name_end); + + if (casefold_str_cmp(name, substr_len, + lower_element, lower_element_len, + mylocale)) + { + *len = substr_len; + pfree(lower_name); + return a - array; + } + } } - pfree(lower_element); } pfree(lower_name); @@ -2462,7 +2573,7 @@ from_char_seq_search(int *dest, const char **src, const char *const *array, char **localized_array, Oid collid, FormatNode *node, Node *escontext) { - int len; + size_t len; if (localized_array == NULL) *dest = seq_search_ascii(*src, array, &len); @@ -2627,10 +2738,18 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col INVALID_FOR_INTERVAL; if (tmtcTzn(in)) { - /* We assume here that timezone names aren't localized */ + /* + * We assume here that timezone abbreviations aren't + * localized, so ASCII-only downcasing is sufficient. + */ char *p = asc_tolower_z(tmtcTzn(in)); - strcpy(s, p); + if (strlen(p) <= n->key->len * DCH_MAX_ITEM_SIZ) + strcpy(s, p); + else + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("time zone format value too long"))); pfree(p); s += strlen(s); } @@ -2639,7 +2758,14 @@ DCH_to_char(FormatNode *node, bool is_interval, TmToChar *in, char *out, Oid col INVALID_FOR_INTERVAL; if (tmtcTzn(in)) { - strcpy(s, tmtcTzn(in)); + const char *p = tmtcTzn(in); + + if (strlen(p) <= n->key->len * DCH_MAX_ITEM_SIZ) + strcpy(s, p); + else + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("time zone format value too long"))); s += strlen(s); } break; diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c index 9dd5889f34c..ad6a56b4688 100644 --- a/src/backend/utils/adt/int8.c +++ b/src/backend/utils/adt/int8.c @@ -24,7 +24,7 @@ #include "nodes/supportnodes.h" #include "optimizer/optimizer.h" #include "utils/builtins.h" - +#include "utils/fmgroids.h" typedef struct { @@ -833,8 +833,38 @@ int8inc_support(PG_FUNCTION_ARGS) MonotonicFunction monotonic = MONOTONICFUNC_NONE; int frameOptions = req->window_clause->frameOptions; - /* No ORDER BY clause then all rows are peers */ - if (req->window_clause->orderClause == NIL) + /* + * Because an EXCLUDE clauses in the window definition can exclude + * rows that have previously been included in the aggregate result for + * prior rows, this can break the monotonic properties that might + * otherwise be guaranteed. There's a narrow set of circumstances + * that can be guaranteed, which we check for below. + */ + if (frameOptions & FRAMEOPTION_EXCLUSION) + { + WindowFunc *wfunc = req->window_func; + + /* + * To add handling for all valid monotonic cases with an EXCLUDE + * clause is complex and likely not worth troubling over. For + * now, just bail unless we see EXCLUDE CURRENT ROW with COUNT(*) + * and no FILTER. Excluding the current row is fine when using + * COUNT(*) as this always reduces the count by 1. The same isn't + * true for COUNY(ANY) as a NULL won't be counted, and a + * subsequent non-NULL could make the count decrease. + */ + if ((frameOptions & FRAMEOPTION_EXCLUDE_CURRENT_ROW) == 0 || + wfunc->winfnoid != F_COUNT_ || + wfunc->aggfilter != NULL) + { + req->monotonic = MONOTONICFUNC_NONE; + PG_RETURN_POINTER(req); + } + } + + /* No ORDER BY clause and RANGE mode means all rows are peers. */ + if (req->window_clause->orderClause == NIL && + (frameOptions & FRAMEOPTION_RANGE)) monotonic = MONOTONICFUNC_BOTH; else { diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 51452755f58..c1d3de602ae 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -1558,7 +1558,7 @@ json_object_two_arg(PG_FUNCTION_ARGS) * escape_json_char * Inline helper function for escape_json* functions */ -static pg_attribute_always_inline void +static pg_always_inline void escape_json_char(StringInfo buf, char c) { switch (c) diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index eedc5c87b05..4be288c23eb 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -1463,15 +1463,11 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, if (jsp->type == jpiDecimal && jsp->content.args.left) { Datum numdatum; - Datum dtypmod; + int32 dtypmod; int32 precision; int32 scale = 0; bool have_error; bool noerr; - ArrayType *arrtypmod; - Datum datums[2]; - char pstr[12]; /* sign, 10 digits and '\0' */ - char sstr[12]; /* sign, 10 digits and '\0' */ ErrorSaveContext escontext = {T_ErrorSaveContext}; jspGetLeftArg(jsp, &elem); @@ -1501,18 +1497,11 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, jspOperationName(jsp->type))))); } - /* - * numerictypmodin() takes the precision and scale in the - * form of CString arrays. - */ - pg_ltoa(precision, pstr); - datums[0] = CStringGetDatum(pstr); - pg_ltoa(scale, sstr); - datums[1] = CStringGetDatum(sstr); - arrtypmod = construct_array_builtin(datums, 2, CSTRINGOID); - - dtypmod = DirectFunctionCall1(numerictypmodin, - PointerGetDatum(arrtypmod)); + /* Pack the precision and scale into a numeric typmod */ + dtypmod = make_numeric_typmod_safe(precision, scale, + jspThrowErrors(cxt) ? NULL : (Node *) &escontext); + if (escontext.error_occurred) + return jperError; /* Convert numstr to Numeric with typmod */ Assert(numstr != NULL); @@ -1528,7 +1517,6 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, numstr, jspOperationName(jsp->type), "numeric")))); num = DatumGetNumeric(numdatum); - pfree(arrtypmod); } jb = &jbv; diff --git a/src/backend/utils/adt/levenshtein.c b/src/backend/utils/adt/levenshtein.c index 2cc6a13b245..89419554397 100644 --- a/src/backend/utils/adt/levenshtein.c +++ b/src/backend/utils/adt/levenshtein.c @@ -9,7 +9,7 @@ * Levenshtein distance with custom costings, and (2) Levenshtein distance with * custom costings and a "max" value above which exact distances are not * interesting. Before the inclusion, we rely on the presence of the inline - * function rest_of_char_same(). + * functions rest_of_char_same() and levenshtein_result(). * * Written based on a description of the algorithm by Michael Gilleland found * at http://www.merriampark.com/ld.htm. Also looked at levenshtein.c in the @@ -78,13 +78,16 @@ varstr_levenshtein(const char *source, int slen, { int m, n; - int *prev; - int *curr; + int64 *prev; + int64 *curr; int *s_char_len = NULL; int j; const char *y; const char *send = source + slen; const char *tend = target + tlen; + int64 ins_c_64 = ins_c; + int64 del_c_64 = del_c; + int64 sub_c_64 = sub_c; /* * For varstr_levenshtein_less_equal, we have real variables called @@ -115,9 +118,9 @@ varstr_levenshtein(const char *source, int slen, * into an empty s with m deletions. */ if (!m) - return n * ins_c; + return levenshtein_result(n * ins_c_64); if (!n) - return m * del_c; + return levenshtein_result(m * del_c_64); /* * For security concerns, restrict excessive CPU+RAM usage. (This @@ -147,20 +150,20 @@ varstr_levenshtein(const char *source, int slen, */ if (max_d >= 0) { - int min_theo_d; /* Theoretical minimum distance. */ - int max_theo_d; /* Theoretical maximum distance. */ + int64 min_theo_d; /* Theoretical minimum distance. */ + int64 max_theo_d; /* Theoretical maximum distance. */ int net_inserts = n - m; min_theo_d = net_inserts < 0 ? - -net_inserts * del_c : net_inserts * ins_c; + -net_inserts * del_c_64 : net_inserts * ins_c_64; if (min_theo_d > max_d) - return max_d + 1; - if (ins_c + del_c < sub_c) - sub_c = ins_c + del_c; - max_theo_d = min_theo_d + sub_c * Min(m, n); + return levenshtein_result((int64) max_d + 1); + if (ins_c_64 + del_c_64 < sub_c_64) + sub_c_64 = ins_c_64 + del_c_64; + max_theo_d = min_theo_d + sub_c_64 * Min(m, n); if (max_d >= max_theo_d) max_d = -1; - else if (ins_c + del_c > 0) + else if (ins_c_64 + del_c_64 > 0) { /* * Figure out how much of the first row of the notional matrix we @@ -174,12 +177,12 @@ varstr_levenshtein(const char *source, int slen, * column n - m. If we do start further right, the best-case * total cost increases by ins_c + del_c for each move right. */ - int slack_d = max_d - min_theo_d; + int64 slack_d = max_d - min_theo_d; int best_column = net_inserts < 0 ? -net_inserts : 0; + int64 tmp; - stop_column = best_column + (slack_d / (ins_c + del_c)) + 1; - if (stop_column > m) - stop_column = m + 1; + tmp = best_column + (slack_d / (ins_c_64 + del_c_64)) + 1; + stop_column = Min(tmp, m + 1); } } #endif @@ -211,7 +214,7 @@ varstr_levenshtein(const char *source, int slen, ++n; /* Previous and current rows of notional array. */ - prev = (int *) palloc(2 * m * sizeof(int)); + prev = (int64 *) palloc(2 * m * sizeof(int64)); curr = prev + m; /* @@ -219,12 +222,12 @@ varstr_levenshtein(const char *source, int slen, * t, we must perform i deletions. */ for (int i = START_COLUMN; i < STOP_COLUMN; i++) - prev[i] = i * del_c; + prev[i] = i * del_c_64; /* Loop through rows of the notional array */ for (y = target, j = 1; j < n; j++) { - int *temp; + int64 *temp; const char *x = source; int y_char_len = n != tlen + 1 ? pg_mblen_range(y, tend) : 1; int i; @@ -239,7 +242,7 @@ varstr_levenshtein(const char *source, int slen, */ if (stop_column < m) { - prev[stop_column] = max_d + 1; + prev[stop_column] = (int64) max_d + 1; ++stop_column; } @@ -251,13 +254,13 @@ varstr_levenshtein(const char *source, int slen, */ if (start_column == 0) { - curr[0] = j * ins_c; + curr[0] = j * ins_c_64; i = 1; } else i = start_column; #else - curr[0] = j * ins_c; + curr[0] = j * ins_c_64; i = 1; #endif @@ -272,9 +275,9 @@ varstr_levenshtein(const char *source, int slen, { for (; i < STOP_COLUMN; i++) { - int ins; - int del; - int sub; + int64 ins; + int64 del; + int64 sub; int x_char_len = s_char_len[i - 1]; /* @@ -286,14 +289,14 @@ varstr_levenshtein(const char *source, int slen, * get past that test, then we compare the lengths and the * remaining bytes. */ - ins = prev[i] + ins_c; - del = curr[i - 1] + del_c; + ins = prev[i] + ins_c_64; + del = curr[i - 1] + del_c_64; if (x[x_char_len - 1] == y[y_char_len - 1] && x_char_len == y_char_len && (x_char_len == 1 || rest_of_char_same(x, y, x_char_len))) sub = prev[i - 1]; else - sub = prev[i - 1] + sub_c; + sub = prev[i - 1] + sub_c_64; /* Take the one with minimum cost. */ curr[i] = Min(ins, del); @@ -307,14 +310,14 @@ varstr_levenshtein(const char *source, int slen, { for (; i < STOP_COLUMN; i++) { - int ins; - int del; - int sub; + int64 ins; + int64 del; + int64 sub; /* Calculate costs for insertion, deletion, and substitution. */ - ins = prev[i] + ins_c; - del = curr[i - 1] + del_c; - sub = prev[i - 1] + ((*x == *y) ? 0 : sub_c); + ins = prev[i] + ins_c_64; + del = curr[i - 1] + del_c_64; + sub = prev[i - 1] + ((*x == *y) ? 0 : sub_c_64); /* Take the one with minimum cost. */ curr[i] = Min(ins, del); @@ -360,8 +363,8 @@ varstr_levenshtein(const char *source, int slen, int ii = stop_column - 1; int net_inserts = ii - zp; - if (prev[ii] + (net_inserts > 0 ? net_inserts * ins_c : - -net_inserts * del_c) <= max_d) + if (prev[ii] + (net_inserts > 0 ? net_inserts * ins_c_64 : + -net_inserts * del_c_64) <= max_d) break; stop_column--; } @@ -372,8 +375,8 @@ varstr_levenshtein(const char *source, int slen, int net_inserts = start_column - zp; if (prev[start_column] + - (net_inserts > 0 ? net_inserts * ins_c : - -net_inserts * del_c) <= max_d) + (net_inserts > 0 ? net_inserts * ins_c_64 : + -net_inserts * del_c_64) <= max_d) break; /* @@ -381,8 +384,8 @@ varstr_levenshtein(const char *source, int slen, * there's nothing here that could confuse any future * iteration of the outer loop. */ - prev[start_column] = max_d + 1; - curr[start_column] = max_d + 1; + prev[start_column] = (int64) max_d + 1; + curr[start_column] = (int64) max_d + 1; if (start_column != 0) source += (s_char_len != NULL) ? s_char_len[start_column - 1] : 1; start_column++; @@ -390,7 +393,7 @@ varstr_levenshtein(const char *source, int slen, /* If they cross, we're going to exceed the bound. */ if (start_column >= stop_column) - return max_d + 1; + return levenshtein_result((int64) max_d + 1); } #endif } @@ -399,5 +402,5 @@ varstr_levenshtein(const char *source, int slen, * Because the final value was swapped from the previous row to the * current row, that's where we'll find it. */ - return prev[m - 1]; + return levenshtein_result(prev[m - 1]); } diff --git a/src/backend/utils/adt/like_match.c b/src/backend/utils/adt/like_match.c index bac6c182467..6735d7fa775 100644 --- a/src/backend/utils/adt/like_match.c +++ b/src/backend/utils/adt/like_match.c @@ -79,6 +79,8 @@ static int MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) { + bool nondeterministic = (locale && !locale->deterministic); + /* Fast path for match-everything pattern */ if (plen == 1 && *p == '%') return LIKE_TRUE; @@ -92,23 +94,16 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) * occasions it is safe to advance by byte, as the text and pattern will * be in lockstep. This allows us to perform all comparisons between the * text and pattern on a byte by byte basis, even for multi-byte - * encodings. + * encodings. (But that doesn't work in a nondeterministic locale, so the + * nondeterministic case below has to advance the text by chars.) */ while (tlen > 0 && plen > 0) { - if (*p == '\\') - { - /* Next pattern byte must match literally, whatever it is */ - NextByte(p, plen); - /* ... and there had better be one, per SQL standard */ - if (plen <= 0) - ereport(ERROR, - (errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE), - errmsg("LIKE pattern must not end with escape character"))); - if (GETCHAR(*p, locale) != GETCHAR(*t, locale)) - return LIKE_FALSE; - } - else if (*p == '%') + /* + * At the top of this loop, we are not positioned immediately after an + * escape, so we may take wildcards at face value. + */ + if (*p == '%') { char firstpat; @@ -157,9 +152,9 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) * the first pattern byte to each text byte to avoid recursing * more than we have to. This fact also guarantees that we don't * have to consider a match to the zero-length substring at the - * end of the text. With a nondeterministic collation, we can't - * rely on the first bytes being equal, so we have to recurse in - * any case. + * end of the text. But with a nondeterministic locale, we can't + * rely on the first byte of a match being equal, so we have to + * recurse in any case. */ if (*p == '\\') { @@ -174,7 +169,7 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) while (tlen > 0) { - if (GETCHAR(*t, locale) == firstpat || (locale && !locale->deterministic)) + if (GETCHAR(*t, locale) == firstpat || nondeterministic) { int matched = MatchText(t, tlen, p, plen, locale); @@ -198,7 +193,7 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) NextByte(p, plen); continue; } - else if (locale && !locale->deterministic) + else if (nondeterministic) { /* * For nondeterministic locales, we find the next substring of the @@ -218,9 +213,9 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) char *buf = NULL; /* - * Determine next substring of pattern without wildcards. p is - * the start of the subpattern, p1 is one past the last byte. Also - * track if we found an escape character. + * Determine length of substring of pattern without wildcards. p + * is the start of the subpattern, p1 will advance to one past its + * last byte. Also track if we found an escape character. */ p1 = p; p1len = plen; @@ -238,12 +233,15 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) } else if (*p1 == '_' || *p1 == '%') break; + /* Advance over regular or escaped character */ NextByte(p1, p1len); } /* - * If we found an escape character, then make an unescaped copy of - * the subpattern. + * If we found an escape character, then make a de-escaped copy of + * the subpattern that we can use to match literally. Otherwise + * we can use the subpattern in-place. (buf holds the de-escaped + * copy; be sure to pfree it before returning.) */ if (found_escape) { @@ -253,9 +251,8 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) for (const char *c = p; c < p1; c++) { if (*c == '\\') - ; - else - *(b++) = *c; + c++; /* we already checked this isn't the end */ + *(b++) = *c; } subpat = buf; @@ -286,9 +283,10 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) } /* - * Now build a substring of the text and try to match it against - * the subpattern. t is the start of the text, t1 is one past the - * last byte. We start with a zero-length string. + * Consider each successively-longer substring of the remaining + * text and try to match it against the subpattern. t is the + * start of the substring, t1 is one past its last byte. We start + * with a zero-length substring. */ t1 = t; t1len = tlen; @@ -296,16 +294,16 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) { int cmp; + /* This could be slow, so allow interrupts */ CHECK_FOR_INTERRUPTS(); cmp = pg_strncoll(subpat, subpatlen, t, (t1 - t), locale); /* * If we found a match, we have to test if the rest of pattern - * can match against the rest of the string. Otherwise we - * have to continue here try matching with a longer substring. - * (This is similar to the recursion for the '%' wildcard - * above.) + * can match against the rest of the text. If not, we have to + * continue and try the next longer substring. (This is + * similar to the recursion for the '%' wildcard above.) * * Note that we can't just wind forward p and t and continue * with the main loop. This would fail for example with @@ -340,7 +338,20 @@ MatchText(const char *t, int tlen, const char *p, int plen, pg_locale_t locale) } else NextChar(t1, t1len); - } + } /* end loop over substrings starting at t */ + } + /* the rest of this loop considers only deterministic cases */ + else if (*p == '\\') + { + /* Next pattern byte must match literally, whatever it is */ + NextByte(p, plen); + /* ... and there had better be one, per SQL standard */ + if (plen <= 0) + ereport(ERROR, + (errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE), + errmsg("LIKE pattern must not end with escape character"))); + if (GETCHAR(*p, locale) != GETCHAR(*t, locale)) + return LIKE_FALSE; } else if (GETCHAR(*p, locale) != GETCHAR(*t, locale)) { diff --git a/src/backend/utils/adt/like_support.c b/src/backend/utils/adt/like_support.c index 8fdc677371f..eb1dcc12dfe 100644 --- a/src/backend/utils/adt/like_support.c +++ b/src/backend/utils/adt/like_support.c @@ -69,6 +69,10 @@ typedef enum Pattern_Prefix_None, Pattern_Prefix_Partial, Pattern_Prefix_Exact, } Pattern_Prefix_Status; +/* non-collatable comparisons, eg for bytea, are always deterministic */ +#define NONDETERMINISTIC(coll) \ + (OidIsValid(coll) && !get_collation_isdeterministic(coll)) + static Node *like_regex_support(Node *rawreq, Pattern_Type ptype); static List *match_pattern_prefix(Node *leftop, Node *rightop, @@ -383,12 +387,22 @@ match_pattern_prefix(Node *leftop, * us to not be concerned with specific opclasses (except for the legacy * "pattern" cases); any index that correctly implements the operators * will work. + * + * This case will work for LIKE/regex expressions with nondeterministic + * collation, so long as the index's collation is the same. If the + * expression's collation is deterministic, we can even use an index whose + * collation differs from the expression's. All deterministic collations + * agree on equality (it's bitwise), while we assume that an index with + * nondeterministic collation will return a superset of the bitwise-equal + * entries. Since the "=" indexqual is marked as lossy by default, we'll + * apply the LIKE/regex operator as a recheck, and that will filter out + * any non-matching entries. */ if (pstatus == Pattern_Prefix_Exact) { if (!op_in_opfamily(eqopr, opfamily)) return NIL; - if (indexcollation != expr_coll) + if (indexcollation != expr_coll && NONDETERMINISTIC(expr_coll)) return NIL; expr = make_opclause(eqopr, BOOLOID, false, (Expr *) leftop, (Expr *) prefix, @@ -402,10 +416,8 @@ match_pattern_prefix(Node *leftop, * expression collation is nondeterministic. The optimized equality or * prefix tests use bytewise comparisons, which is not consistent with * nondeterministic collations. - * - * expr_coll is not set for a non-collation-aware data type such as bytea. */ - if (expr_coll && !get_collation_isdeterministic(expr_coll)) + if (NONDETERMINISTIC(expr_coll)) return NIL; /* diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 58ad1a65ef7..a372237cf65 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -1320,6 +1320,29 @@ numeric (PG_FUNCTION_ARGS) PG_RETURN_NUMERIC(new); } +/* + * make_numeric_typmod_safe() - + * + * Validate a numeric precision/scale and pack them into a typmod value, + * with soft error handling. + */ +int32 +make_numeric_typmod_safe(int32 precision, int32 scale, Node *escontext) +{ + if (precision < 1 || precision > NUMERIC_MAX_PRECISION) + ereturn(escontext, -1, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("NUMERIC precision %d must be between 1 and %d", + precision, NUMERIC_MAX_PRECISION))); + if (scale < NUMERIC_MIN_SCALE || scale > NUMERIC_MAX_SCALE) + ereturn(escontext, -1, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("NUMERIC scale %d must be between %d and %d", + scale, NUMERIC_MIN_SCALE, NUMERIC_MAX_SCALE))); + + return make_numeric_typmod(precision, scale); +} + Datum numerictypmodin(PG_FUNCTION_ARGS) { @@ -1331,28 +1354,11 @@ numerictypmodin(PG_FUNCTION_ARGS) tl = ArrayGetIntegerTypmods(ta, &n); if (n == 2) - { - if (tl[0] < 1 || tl[0] > NUMERIC_MAX_PRECISION) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("NUMERIC precision %d must be between 1 and %d", - tl[0], NUMERIC_MAX_PRECISION))); - if (tl[1] < NUMERIC_MIN_SCALE || tl[1] > NUMERIC_MAX_SCALE) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("NUMERIC scale %d must be between %d and %d", - tl[1], NUMERIC_MIN_SCALE, NUMERIC_MAX_SCALE))); - typmod = make_numeric_typmod(tl[0], tl[1]); - } + typmod = make_numeric_typmod_safe(tl[0], tl[1], NULL); else if (n == 1) { - if (tl[0] < 1 || tl[0] > NUMERIC_MAX_PRECISION) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("NUMERIC precision %d must be between 1 and %d", - tl[0], NUMERIC_MAX_PRECISION))); /* scale defaults to zero */ - typmod = make_numeric_typmod(tl[0], 0); + typmod = make_numeric_typmod_safe(tl[0], 0, NULL); } else { @@ -5170,7 +5176,15 @@ numeric_combine(PG_FUNCTION_ARGS) state2 = PG_ARGISNULL(1) ? NULL : (NumericAggState *) PG_GETARG_POINTER(1); if (state2 == NULL) + { + /* + * NULL state2 is easy, just return state1, which we know is already + * in the agg_context + */ + if (state1 == NULL) + PG_RETURN_NULL(); PG_RETURN_POINTER(state1); + } /* manually copy all fields from state2 to state1 */ if (state1 == NULL) @@ -5262,7 +5276,15 @@ numeric_avg_combine(PG_FUNCTION_ARGS) state2 = PG_ARGISNULL(1) ? NULL : (NumericAggState *) PG_GETARG_POINTER(1); if (state2 == NULL) + { + /* + * NULL state2 is easy, just return state1, which we know is already + * in the agg_context + */ + if (state1 == NULL) + PG_RETURN_NULL(); PG_RETURN_POINTER(state1); + } /* manually copy all fields from state2 to state1 */ if (state1 == NULL) @@ -5746,7 +5768,15 @@ numeric_poly_combine(PG_FUNCTION_ARGS) state2 = PG_ARGISNULL(1) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(1); if (state2 == NULL) + { + /* + * NULL state2 is easy, just return state1, which we know is already + * in the agg_context + */ + if (state1 == NULL) + PG_RETURN_NULL(); PG_RETURN_POINTER(state1); + } /* manually copy all fields from state2 to state1 */ if (state1 == NULL) @@ -5949,7 +5979,15 @@ int8_avg_combine(PG_FUNCTION_ARGS) state2 = PG_ARGISNULL(1) ? NULL : (PolyNumAggState *) PG_GETARG_POINTER(1); if (state2 == NULL) + { + /* + * NULL state2 is easy, just return state1, which we know is already + * in the agg_context + */ + if (state1 == NULL) + PG_RETURN_NULL(); PG_RETURN_POINTER(state1); + } /* manually copy all fields from state2 to state1 */ if (state1 == NULL) diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c index 70f7531fb50..13476102dc1 100644 --- a/src/backend/utils/adt/oracle_compat.c +++ b/src/backend/utils/adt/oracle_compat.c @@ -952,8 +952,10 @@ ascii(PG_FUNCTION_ARGS) text *string = PG_GETARG_TEXT_PP(0); int encoding = GetDatabaseEncoding(); unsigned char *data; + int len; - if (VARSIZE_ANY_EXHDR(string) <= 0) + len = VARSIZE_ANY_EXHDR(string); + if (len <= 0) PG_RETURN_INT32(0); data = (unsigned char *) VARDATA_ANY(string); @@ -976,18 +978,31 @@ ascii(PG_FUNCTION_ARGS) result = *data & 0x0F; tbytes = 2; } - else + else if (*data > 0xC0) { - Assert(*data > 0xC0); result = *data & 0x1f; tbytes = 1; } + else + ereport(ERROR, + (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), + errmsg("invalid byte sequence for encoding \"%s\"", + GetDatabaseEncodingName()))); - Assert(tbytes > 0); + /* All continuation bytes are present in the input */ + if (tbytes >= len) + ereport(ERROR, + (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), + errmsg("invalid byte sequence for encoding \"%s\"", + GetDatabaseEncodingName()))); for (i = 1; i <= tbytes; i++) { - Assert((data[i] & 0xC0) == 0x80); + if (unlikely((data[i] & 0xC0) != 0x80)) + ereport(ERROR, + (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), + errmsg("invalid byte sequence for encoding \"%s\"", + GetDatabaseEncodingName()))); result = (result << 6) + (data[i] & 0x3f); } diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index cb1744f4d69..2f8d5fea8f2 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -1199,7 +1199,13 @@ pg_newlocale_from_collation(Oid collid) bool found; if (collid == DEFAULT_COLLATION_OID) + { + /* should not happen: init_database_collation() not yet run */ + if (default_locale == NULL) + elog(ERROR, "default locale not initialized"); + return default_locale; + } /* * Some callers expect C_COLLATION_OID to succeed even without catalog @@ -1267,11 +1273,64 @@ get_collation_actual_version(char collprovider, const char *collcollate) return collversion; } +/* lowercasing/casefolding in C locale */ +static size_t +strlower_c(char *dst, size_t dstsize, const char *src, size_t srclen) +{ + int i; + + for (i = 0; i < srclen && i < dstsize; i++) + dst[i] = pg_ascii_tolower(src[i]); + if (i < dstsize) + dst[i] = '\0'; + return srclen; +} + +/* titlecasing in C locale */ +static size_t +strtitle_c(char *dst, size_t dstsize, const char *src, size_t srclen) +{ + bool wasalnum = false; + int i; + + for (i = 0; i < srclen && i < dstsize; i++) + { + char c = src[i]; + + if (wasalnum) + dst[i] = pg_ascii_tolower(c); + else + dst[i] = pg_ascii_toupper(c); + + wasalnum = ((c >= '0' && c <= '9') || + (c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z')); + } + if (i < dstsize) + dst[i] = '\0'; + return srclen; +} + +/* uppercasing in C locale */ +static size_t +strupper_c(char *dst, size_t dstsize, const char *src, size_t srclen) +{ + int i; + + for (i = 0; i < srclen && i < dstsize; i++) + dst[i] = pg_ascii_toupper(src[i]); + if (i < dstsize) + dst[i] = '\0'; + return srclen; +} + size_t pg_strlower(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale) { - if (locale->provider == COLLPROVIDER_BUILTIN) + if (locale->ctype_is_c) + return strlower_c(dst, dstsize, src, srclen); + else if (locale->provider == COLLPROVIDER_BUILTIN) return strlower_builtin(dst, dstsize, src, srclen, locale); #ifdef USE_ICU else if (locale->provider == COLLPROVIDER_ICU) @@ -1290,7 +1349,9 @@ size_t pg_strtitle(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale) { - if (locale->provider == COLLPROVIDER_BUILTIN) + if (locale->ctype_is_c) + return strtitle_c(dst, dstsize, src, srclen); + else if (locale->provider == COLLPROVIDER_BUILTIN) return strtitle_builtin(dst, dstsize, src, srclen, locale); #ifdef USE_ICU else if (locale->provider == COLLPROVIDER_ICU) @@ -1309,7 +1370,9 @@ size_t pg_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale) { - if (locale->provider == COLLPROVIDER_BUILTIN) + if (locale->ctype_is_c) + return strupper_c(dst, dstsize, src, srclen); + else if (locale->provider == COLLPROVIDER_BUILTIN) return strupper_builtin(dst, dstsize, src, srclen, locale); #ifdef USE_ICU else if (locale->provider == COLLPROVIDER_ICU) @@ -1328,7 +1391,10 @@ size_t pg_strfold(char *dst, size_t dstsize, const char *src, ssize_t srclen, pg_locale_t locale) { - if (locale->provider == COLLPROVIDER_BUILTIN) + /* in the C locale, casefolding is the same as lowercasing */ + if (locale->ctype_is_c) + return strlower_c(dst, dstsize, src, srclen); + else if (locale->provider == COLLPROVIDER_BUILTIN) return strfold_builtin(dst, dstsize, src, srclen, locale); #ifdef USE_ICU else if (locale->provider == COLLPROVIDER_ICU) diff --git a/src/backend/utils/adt/pg_locale_builtin.c b/src/backend/utils/adt/pg_locale_builtin.c index df5612b5a2d..faf71d129d7 100644 --- a/src/backend/utils/adt/pg_locale_builtin.c +++ b/src/backend/utils/adt/pg_locale_builtin.c @@ -57,21 +57,33 @@ initcap_wbnext(void *state) while (wbstate->offset < wbstate->len && wbstate->str[wbstate->offset] != '\0') { - pg_wchar u = utf8_to_unicode((unsigned char *) wbstate->str + + int ulen = pg_utf_mblen((const unsigned char *) wbstate->str + wbstate->offset); - bool curr_alnum = pg_u_isalnum(u, wbstate->posix); + pg_wchar u; + bool curr_alnum; + size_t prev_offset = wbstate->offset; - if (!wbstate->init || curr_alnum != wbstate->prev_alnum) + /* invalid UTF8 */ + if (wbstate->offset + ulen > wbstate->len) { - size_t prev_offset = wbstate->offset; + wbstate->init = true; + wbstate->offset = wbstate->len; + return prev_offset; + } + u = utf8_to_unicode((const unsigned char *) wbstate->str + + wbstate->offset); + curr_alnum = pg_u_isalnum(u, wbstate->posix); + + if (!wbstate->init || curr_alnum != wbstate->prev_alnum) + { wbstate->init = true; - wbstate->offset += unicode_utf8len(u); + wbstate->offset += ulen; wbstate->prev_alnum = curr_alnum; return prev_offset; } - wbstate->offset += unicode_utf8len(u); + wbstate->offset += ulen; } return wbstate->len; diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c index 9ff72dc9226..894d9bc0de9 100644 --- a/src/backend/utils/adt/regexp.c +++ b/src/backend/utils/adt/regexp.c @@ -1512,7 +1512,7 @@ setup_regexp_matches(text *orig_str, text *pattern, pg_re_flags *re_flags, /* convert string to pg_wchar form for matching */ orig_len = VARSIZE_ANY_EXHDR(orig_str); - wide_str = (pg_wchar *) palloc(sizeof(pg_wchar) * (orig_len + 1)); + wide_str = palloc_array(pg_wchar, orig_len + 1); wide_len = pg_mb2wchar_with_len(VARDATA_ANY(orig_str), wide_str, orig_len); /* set up the compiled pattern */ @@ -1648,23 +1648,24 @@ setup_regexp_matches(text *orig_str, text *pattern, pg_re_flags *re_flags, if (eml > 1) { - int64 maxsiz = eml * (int64) maxlen; int conv_bufsiz; /* * Make the conversion buffer large enough for any substring of - * interest. + * interest. We can't use the original string's byte length as a + * tighter bound, because that assumes the input is validly encoded; + * but pg_mb2wchar_with_len() can accept strings that are invalid in + * the database encoding, and converting such a character back to + * multibyte form can take more bytes than it did in the input. * - * Worst case: assume we need the maximum size (maxlen*eml), but take - * advantage of the fact that the original string length in bytes is - * an upper bound on the byte length of any fetched substring (and we - * know that len+1 is safe to allocate because the varlena header is - * longer than 1 byte). + * This can't overflow, nor exceed what palloc will accept: maxlen is + * at most wide_len, which is at most orig_len, and we have already + * successfully allocated (orig_len + 1) * sizeof(pg_wchar) bytes for + * wide_str. That relies on eml being no more than sizeof(pg_wchar), + * which is true of all supported encodings. */ - if (maxsiz > orig_len) - conv_bufsiz = orig_len + 1; - else - conv_bufsiz = maxsiz + 1; /* safe since maxsiz < 2^30 */ + Assert(eml <= sizeof(pg_wchar)); + conv_bufsiz = maxlen * eml + 1; matchctx->conv_buf = palloc(conv_bufsiz); matchctx->conv_bufsiz = conv_bufsiz; diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c index fe5edc0027d..0e8305f6b7d 100644 --- a/src/backend/utils/adt/rowtypes.c +++ b/src/backend/utils/adt/rowtypes.c @@ -2030,7 +2030,7 @@ hash_record_extended(PG_FUNCTION_ARGS) locfcinfo->args[0].value = values[i]; locfcinfo->args[0].isnull = false; locfcinfo->args[1].value = Int64GetDatum(seed); - locfcinfo->args[0].isnull = false; + locfcinfo->args[1].isnull = false; element_hash = DatumGetUInt64(FunctionCallInvoke(locfcinfo)); /* We don't expect hash support functions to return null */ diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 3d6e6bdbfd2..507fa69860d 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -503,6 +503,8 @@ static void get_json_agg_constructor(JsonConstructorExpr *ctor, deparse_context *context, const char *funcname, bool is_json_objectagg); +static void get_json_agg_constructor_expr(Node *node, deparse_context *context, + void *callback_arg); static void simple_quote_literal(StringInfo buf, const char *val); static void get_sublink_expr(SubLink *sublink, deparse_context *context); static void get_tablefunc(TableFunc *tf, deparse_context *context, @@ -11218,7 +11220,7 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context) Assert(IsA(con, Const) && con->consttype == TEXTOID && !con->constisnull); - appendStringInfoString(buf, TextDatumGetCString(con->constvalue)); + appendStringInfoString(buf, quote_identifier(TextDatumGetCString(con->constvalue))); } appendStringInfoString(buf, " FROM "); get_rule_expr((Node *) lsecond(expr->args), context, false); @@ -11238,6 +11240,7 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context) Assert(IsA(con, Const) && con->consttype == TEXTOID && !con->constisnull); + /* NB: safe because no allowed words need quoted/escaped */ appendStringInfo(buf, " %s", TextDatumGetCString(con->constvalue)); } @@ -11781,11 +11784,41 @@ get_json_agg_constructor(JsonConstructorExpr *ctor, deparse_context *context, get_windowfunc_expr_helper((WindowFunc *) ctor->func, context, funcname, options.data, is_json_objectagg); + else if (IsA(ctor->func, Var)) + { + /* + * If the aggregate is computed by a lower plan node, setrefs.c will + * have replaced the Aggref or WindowFunc with a Var referencing that + * node's output. Chase the Var back to it so we can still print the + * original JSON aggregate syntax. This only happens in EXPLAIN. + */ + resolve_special_varno((Node *) ctor->func, context, + get_json_agg_constructor_expr, ctor); + } else elog(ERROR, "invalid JsonConstructorExpr underlying node type: %d", nodeTag(ctor->func)); } +/* + * Deparse a JsonConstructorExpr whose aggregate is computed by a lower plan + * node; resolve_special_varno has located the underlying Aggref/WindowFunc. + */ +static void +get_json_agg_constructor_expr(Node *node, deparse_context *context, + void *callback_arg) +{ + JsonConstructorExpr ctor; + + if (!IsA(node, Aggref) && !IsA(node, WindowFunc)) + elog(ERROR, "JSON aggregate constructor does not point to an Aggref or WindowFunc"); + + /* Flat copy suffices; we only replace func. */ + ctor = *(JsonConstructorExpr *) callback_arg; + ctor.func = (Expr *) node; + get_json_constructor(&ctor, context, false); +} + /* * simple_quote_literal - Format a string as a SQL literal, append to buf */ diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index c9ff71844e7..3abc6c1ca7d 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -604,7 +604,8 @@ scalarineqsel(PlannerInfo *root, Oid operator, bool isgt, bool iseq, * make an estimate based on comparing the constant to the table size. */ if (vardata->var && IsA(vardata->var, Var) && - ((Var *) vardata->var)->varattno == SelfItemPointerAttributeNumber) + ((Var *) vardata->var)->varattno == SelfItemPointerAttributeNumber && + consttype == TIDOID) { ItemPointer itemptr; double block; @@ -4956,6 +4957,14 @@ convert_string_datum(Datum value, Oid typid, Oid collid, bool *failure) return NULL; } + /* + * If we don't have a collation, act as though it's "C". This would + * normally happen only for the "char" type, but perhaps there are other + * cases. + */ + if (!OidIsValid(collid)) + return val; + mylocale = pg_newlocale_from_collation(collid); if (!mylocale->collate_is_c) diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 6efc29c2040..72775924bb7 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -4094,7 +4094,15 @@ interval_avg_combine(PG_FUNCTION_ARGS) state2 = PG_ARGISNULL(1) ? NULL : (IntervalAggState *) PG_GETARG_POINTER(1); if (state2 == NULL) + { + /* + * NULL state2 is easy, just return state1, which we know is already + * in the agg_context + */ + if (state1 == NULL) + PG_RETURN_NULL(); PG_RETURN_POINTER(state1); + } if (state1 == NULL) { diff --git a/src/backend/utils/adt/tsquery_util.c b/src/backend/utils/adt/tsquery_util.c index 1c24b041aa2..56af4e627ad 100644 --- a/src/backend/utils/adt/tsquery_util.c +++ b/src/backend/utils/adt/tsquery_util.c @@ -289,7 +289,7 @@ QTNBinary(QTNode *in) * Caller must initialize *sumlen and *nnode to zeroes. */ static void -cntsize(QTNode *in, int *sumlen, int *nnode) +cntsize(QTNode *in, size_t *sumlen, size_t *nnode) { /* since this function recurses, it could be driven to stack overflow. */ check_stack_depth(); @@ -327,10 +327,17 @@ fillQT(QTN2QTState *state, QTNode *in) if (in->valnode->type == QI_VAL) { + size_t distance; + memcpy(state->curitem, in->valnode, sizeof(QueryOperand)); memcpy(state->curoperand, in->word, in->valnode->qoperand.length); - state->curitem->qoperand.distance = state->curoperand - state->operand; + distance = state->curoperand - state->operand; + if (distance > MAXSTRPOS) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("tsquery is too large"))); + state->curitem->qoperand.distance = distance; state->curoperand[in->valnode->qoperand.length] = '\0'; state->curoperand += in->valnode->qoperand.length + 1; state->curitem++; @@ -364,7 +371,7 @@ QTN2QT(QTNode *in) { TSQuery out; int len; - int sumlen = 0, + size_t sumlen = 0, nnode = 0; QTN2QTState state; diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c index e7ac7725233..dae8b577cfa 100644 --- a/src/backend/utils/adt/tsvector.c +++ b/src/backend/utils/adt/tsvector.c @@ -217,8 +217,8 @@ tsvectorin(PG_FUNCTION_ARGS) if (cur - tmpbuf > MAXSTRPOS) ereturn(escontext, (Datum) 0, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("string is too long for tsvector (%ld bytes, max %ld bytes)", - (long) (cur - tmpbuf), (long) MAXSTRPOS))); + errmsg("string is too long for tsvector (%zu bytes, max %zu bytes)", + (size_t) (cur - tmpbuf), (size_t) MAXSTRPOS))); /* * Enlarge buffers if needed @@ -271,7 +271,8 @@ tsvectorin(PG_FUNCTION_ARGS) if (buflen > MAXSTRPOS) ereturn(escontext, (Datum) 0, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("string is too long for tsvector (%d bytes, max %d bytes)", buflen, MAXSTRPOS))); + errmsg("string is too long for tsvector (%zu bytes, max %zu bytes)", + (size_t) buflen, (size_t) MAXSTRPOS))); totallen = CALCDATASIZE(len, buflen); in = (TSVector) palloc0(totallen); @@ -316,8 +317,8 @@ tsvectorout(PG_FUNCTION_ARGS) TSVector out = PG_GETARG_TSVECTOR(0); char *outbuf; int32 i, - lenbuf = 0, pp; + size_t lenbuf; WordEntry *ptr = ARRPTR(out); char *curin, *curout; @@ -326,7 +327,7 @@ tsvectorout(PG_FUNCTION_ARGS) lenbuf = out->size * 2 /* '' */ + out->size - 1 /* space */ + 2 /* \0 */ ; for (i = 0; i < out->size; i++) { - lenbuf += ptr[i].len * 2 * pg_database_encoding_max_length() /* for escape */ ; + lenbuf += ptr[i].len * 2 /* allow for escapes */ ; if (ptr[i].haspos) lenbuf += 1 /* : */ + 7 /* int2 + , + weight */ * POSDATALEN(out, &(ptr[i])); } @@ -458,12 +459,14 @@ tsvectorrecv(PG_FUNCTION_ARGS) bool needSort = false; nentries = pq_getmsgint(buf, sizeof(int32)); - if (nentries < 0 || nentries > (MaxAllocSize / sizeof(WordEntry))) + + /* We disallow empty lexemes, so more than MAXSTRPOS of them can't fit */ + if (nentries < 0 || nentries > MAXSTRPOS) elog(ERROR, "invalid size of tsvector"); hdrlen = DATAHDRSIZE + sizeof(WordEntry) * nentries; - len = hdrlen * 2; /* times two to make room for lexemes */ + len = hdrlen * 2; /* times two to make some room for lexemes */ vec = (TSVector) palloc0(len); vec->size = nentries; @@ -480,6 +483,8 @@ tsvectorrecv(PG_FUNCTION_ARGS) /* sanity checks */ lex_len = strlen(lexeme); + if (lex_len == 0) + elog(ERROR, "invalid tsvector: empty lexeme"); if (lex_len > MAXSTRLEN) elog(ERROR, "invalid tsvector: lexeme too long"); @@ -545,6 +550,15 @@ tsvectorrecv(PG_FUNCTION_ARGS) } } + /* + * Enforce that datalen is still within MAXSTRPOS, ie the last lexeme + * didn't go past that. We could allow that, since no "pos" field + * overflowed, but tsvectorrecv shouldn't accept values that other + * tsvector-constructing routines wouldn't. + */ + if (datalen > MAXSTRPOS) + elog(ERROR, "invalid tsvector: maximum total lexeme length exceeded"); + SET_VARSIZE(vec, hdrlen + datalen); if (needSort) diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c index ea84e1cf123..1c46cfde0ac 100644 --- a/src/backend/utils/adt/tsvector_op.c +++ b/src/backend/utils/adt/tsvector_op.c @@ -175,6 +175,7 @@ tsvector_strip(PG_FUNCTION_ARGS) *arrout; char *cur; + /* Output can't be bigger than input, so no need for overflow checks */ for (i = 0; i < in->size; i++) len += arrin[i].len; @@ -207,17 +208,10 @@ tsvector_length(PG_FUNCTION_ARGS) PG_RETURN_INT32(ret); } -Datum -tsvector_setweight(PG_FUNCTION_ARGS) +static int +parse_weight(char cw) { - TSVector in = PG_GETARG_TSVECTOR(0); - char cw = PG_GETARG_CHAR(1); - TSVector out; - int i, - j; - WordEntry *entry; - WordEntryPos *p; - int w = 0; + int w; switch (cw) { @@ -238,9 +232,32 @@ tsvector_setweight(PG_FUNCTION_ARGS) w = 0; break; default: - /* internal error */ - elog(ERROR, "unrecognized weight: %d", cw); + /* Avoid printing non-ASCII bytes, else we have encoding issues */ + if (cw >= ' ' && cw < 0x7f) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized weight: \"%c\"", cw))); + else /* use \ooo format, like charout() */ + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized weight: \"\\%03o\"", + (unsigned char) cw))); } + return w; +} + + +Datum +tsvector_setweight(PG_FUNCTION_ARGS) +{ + TSVector in = PG_GETARG_TSVECTOR(0); + char cw = PG_GETARG_CHAR(1); + TSVector out; + int i, + j; + WordEntry *entry; + WordEntryPos *p; + int w = parse_weight(cw); out = (TSVector) palloc(VARSIZE(in)); memcpy(out, in, VARSIZE(in)); @@ -285,28 +302,7 @@ tsvector_setweight_by_filter(PG_FUNCTION_ARGS) Datum *dlexemes; bool *nulls; - switch (char_weight) - { - case 'A': - case 'a': - weight = 3; - break; - case 'B': - case 'b': - weight = 2; - break; - case 'C': - case 'c': - weight = 1; - break; - case 'D': - case 'd': - weight = 0; - break; - default: - /* internal error */ - elog(ERROR, "unrecognized weight: %c", char_weight); - } + weight = parse_weight(char_weight); tsout = (TSVector) palloc(VARSIZE(tsin)); memcpy(tsout, tsin, VARSIZE(tsin)); @@ -497,6 +493,8 @@ tsvector_delete_by_indices(TSVector tsv, int *indices_to_delete, /* * Copy tsv to tsout, skipping lexemes listed in indices_to_delete. + * + * Output can't be bigger than input, so no need for overflow checks. */ arrout = ARRPTR(tsout); dataout = STRPTR(tsout); @@ -725,7 +723,7 @@ tsvector_to_array(PG_FUNCTION_ARGS) int i; ArrayType *array; - elements = palloc(tsin->size * sizeof(Datum)); + elements = palloc_array(Datum, tsin->size); for (i = 0; i < tsin->size; i++) { @@ -760,20 +758,29 @@ array_to_tsvector(PG_FUNCTION_ARGS) deconstruct_array_builtin(v, TEXTOID, &dlexemes, &nulls, &nitems); /* - * Reject nulls and zero length strings (maybe we should just ignore them, - * instead?) + * Reject nulls and zero-length or over-length strings (maybe we should + * just ignore them, instead?) */ for (i = 0; i < nitems; i++) { + int toklen; + if (nulls[i]) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("lexeme array may not contain nulls"))); - if (VARSIZE(dlexemes[i]) - VARHDRSZ == 0) + toklen = VARSIZE(dlexemes[i]) - VARHDRSZ; + if (toklen == 0) ereport(ERROR, (errcode(ERRCODE_ZERO_LENGTH_CHARACTER_STRING), errmsg("lexeme array may not contain empty strings"))); + if (toklen >= MAXSTRLEN) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("word is too long (%d bytes, max %d bytes)", + toklen, + MAXSTRLEN - 1))); } /* Sort and de-dup, because this is required for a valid tsvector. */ @@ -787,6 +794,11 @@ array_to_tsvector(PG_FUNCTION_ARGS) /* Calculate space needed for surviving lexemes. */ for (i = 0; i < nitems; i++) datalen += VARSIZE(dlexemes[i]) - VARHDRSZ; + if (datalen > MAXSTRPOS) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("string is too long for tsvector (%zu bytes, max %zu bytes)", + (size_t) datalen, (size_t) MAXSTRPOS))); tslen = CALCDATASIZE(nitems, datalen); /* Allocate and fill tsvector. */ @@ -845,34 +857,18 @@ tsvector_filter(PG_FUNCTION_ARGS) errmsg("weight array may not contain nulls"))); char_weight = DatumGetChar(dweights[i]); - switch (char_weight) - { - case 'A': - case 'a': - mask = mask | 8; - break; - case 'B': - case 'b': - mask = mask | 4; - break; - case 'C': - case 'c': - mask = mask | 2; - break; - case 'D': - case 'd': - mask = mask | 1; - break; - default: - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("unrecognized weight: \"%c\"", char_weight))); - } + mask |= 1 << parse_weight(char_weight); } + /* + * The output tsvector might be smaller than the input, but it can't be + * bigger, so VARSIZE(tsin) is surely enough space. Also, we don't need + * to worry about overflows below. + */ tsout = (TSVector) palloc0(VARSIZE(tsin)); tsout->size = tsin->size; arrout = ARRPTR(tsout); + /* worst-case location of output's lexemes; we may need to adjust below */ dataout = STRPTR(tsout); for (i = j = 0; i < tsin->size; i++) @@ -972,6 +968,12 @@ tsvector_concat(PG_FUNCTION_ARGS) * Conservative estimate of space needed. We might need all the data in * both inputs, and conceivably add a pad byte before position data for * each item where there was none before. + * + * Note: since the MAXSTRPOS limit constrains each input tsvector to be + * considerably less than MaxAllocSize, we don't need to worry about + * integer overflow here, nor in the data-copying steps below. We do need + * to enforce that the result meets the MAXSTRPOS limit, but we check that + * once at the end. */ output_bytes = VARSIZE(in1) + VARSIZE(in2) + i1 + i2; @@ -1123,7 +1125,8 @@ tsvector_concat(PG_FUNCTION_ARGS) if (dataoff > MAXSTRPOS) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("string is too long for tsvector (%d bytes, max %d bytes)", dataoff, MAXSTRPOS))); + errmsg("string is too long for tsvector (%zu bytes, max %zu bytes)", + (size_t) dataoff, (size_t) MAXSTRPOS))); /* * Adjust sizes (asserting that we didn't overrun the original estimates) diff --git a/src/backend/utils/adt/uuid.c b/src/backend/utils/adt/uuid.c index a746388b073..c910836da06 100644 --- a/src/backend/utils/adt/uuid.c +++ b/src/backend/utils/adt/uuid.c @@ -33,6 +33,23 @@ #define NS_PER_US INT64CONST(1000) #define US_PER_MS INT64CONST(1000) +/* + * The offset between the PostgreSQL epoch (2000-01-01) and the Unix epoch + * (1970-01-01) in microseconds. Subtract this from a Unix-epoch microseconds + * to get a TimestampTz. + */ +#define PG_UNIX_EPOCH_OFFSET_US \ + ((int64) (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY * USECS_PER_SEC) + +/* + * Valid timestamp range for UUID version 7, expressed in PostgreSQL-epoch + * microseconds. UUIDv7 uses a 48-bit unsigned millisecond field relative + * to the Unix epoch, so the representable window is [1970-01-01, ~10889]. + */ +#define UUIDV7_MIN_TIMESTAMP (-PG_UNIX_EPOCH_OFFSET_US) +#define UUIDV7_MAX_TIMESTAMP \ + (((INT64CONST(1) << 48) - 1) * US_PER_MS - PG_UNIX_EPOCH_OFFSET_US) + /* * UUID version 7 uses 12 bits in "rand_a" to store 1/4096 (or 2^12) fractions of * sub-millisecond. While most Unix-like platforms provide nanosecond-precision @@ -676,6 +693,13 @@ uuidv7_interval(PG_FUNCTION_ARGS) int64 ns = get_real_time_ns_ascending(); int64 us; + /* Reject infinite intervals before any arithmetic */ + if (INTERVAL_NOT_FINITE(shift)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range for UUID version 7"), + errdetail("UUID version 7 does not support infinite intervals."))); + /* * Shift the current timestamp by the given interval. To calculate time * shift correctly, we convert the UNIX epoch to TimestampTz and use @@ -683,16 +707,26 @@ uuidv7_interval(PG_FUNCTION_ARGS) * precision. */ - ts = (TimestampTz) (ns / NS_PER_US) - - (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY * USECS_PER_SEC; + ts = (TimestampTz) (ns / NS_PER_US) - PG_UNIX_EPOCH_OFFSET_US; /* Compute time shift */ ts = DatumGetTimestampTz(DirectFunctionCall2(timestamptz_pl_interval, TimestampTzGetDatum(ts), IntervalPGetDatum(shift))); - /* Convert a TimestampTz value back to an UNIX epoch timestamp */ - us = ts + (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY * USECS_PER_SEC; + /* + * Reject timestamps outside the range representable by UUID version 7's + * 48-bit millisecond field. We compare in PostgreSQL-epoch units so that + * the subsequent conversion to Unix-epoch microseconds cannot overflow. + */ + if (ts < UUIDV7_MIN_TIMESTAMP || ts > UUIDV7_MAX_TIMESTAMP) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range for UUID version 7"), + errdetail("UUID version 7 supports timestamps from 1970-01-01 to approximately year 10889."))); + + /* Convert the TimestampTz value to a Unix-epoch timestamp in usec */ + us = ts + PG_UNIX_EPOCH_OFFSET_US; /* Generate an UUIDv7 */ uuid = generate_uuidv7(us / US_PER_MS, (us % US_PER_MS) * NS_PER_US + ns % NS_PER_US); @@ -752,8 +786,7 @@ uuid_extract_timestamp(PG_FUNCTION_ARGS) + (((uint64) uuid->data[0]) << 40); /* convert ms to us, then adjust */ - ts = (TimestampTz) (tms * US_PER_MS) - - (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY * USECS_PER_SEC; + ts = (TimestampTz) (tms * US_PER_MS) - PG_UNIX_EPOCH_OFFSET_US; PG_RETURN_TIMESTAMPTZ(ts); } diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 55fab176485..6a589fc096b 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -3810,7 +3810,7 @@ SplitDirectoriesString(char *rawstring, char separator, * However, it's not clear that having one function with a bunch of option * flags would be much better. * - * XXX there is a version of this function in src/bin/pg_dump/dumputils.c. + * XXX there is a version of this function in src/fe_utils/string_utils.c. * Be sure to update that if you have to change this. * * Inputs: @@ -6421,6 +6421,20 @@ rest_of_char_same(const char *s1, const char *s2, int len) return true; } +/* + * Helper function for checking return value of Levenshtein distance functions. + * We calculate it as an int64, but the distance functions return an int32. + */ +static inline int +levenshtein_result(int64 res) +{ + if (unlikely(res < PG_INT32_MIN || res > PG_INT32_MAX)) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("levenshtein distance out of range"))); + return res; +} + /* Expand each Levenshtein distance variant */ #include "levenshtein.c" #define LEVENSHTEIN_LESS_EQUAL diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 66803e7058d..02ab4b0da0d 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -4156,7 +4156,9 @@ xml_xmlnodetoxmltype(xmlNodePtr cur, PgXmlErrorContext *xmlerrcxt) { xmltype *result = NULL; - if (cur->type != XML_ATTRIBUTE_NODE && cur->type != XML_TEXT_NODE) + if (cur->type != XML_ATTRIBUTE_NODE && + cur->type != XML_TEXT_NODE && + cur->type != XML_NAMESPACE_DECL) { void (*volatile nodefree) (xmlNodePtr) = NULL; volatile xmlBufferPtr buf = NULL; diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index c1bca66a092..a2253e5209e 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -1070,7 +1070,7 @@ RehashCatCacheLists(CatCache *cp) * * Call CatalogCacheInitializeCache() if not yet done. */ -pg_attribute_always_inline +pg_always_inline static void ConditionalCatalogCacheInitializeCache(CatCache *cache) { diff --git a/src/backend/utils/cache/funccache.c b/src/backend/utils/cache/funccache.c index afc048a051e..1495af131e8 100644 --- a/src/backend/utils/cache/funccache.c +++ b/src/backend/utils/cache/funccache.c @@ -294,6 +294,20 @@ compute_function_hashkey(FunctionCallInfo fcinfo, */ if (procStruct->pronargs > 0) { + /* + * Protect against overrun of fixed-size hashkey->argtypes array. This + * also protects later code in places such as PL/pgSQL. Ordinarily the + * parser would have checked this long since, but it's possible that + * we are looking at a pg_proc entry that was made by a server + * executable with a different value of FUNC_MAX_ARGS. + */ + if (procStruct->pronargs > FUNC_MAX_ARGS) + ereport(ERROR, + (errcode(ERRCODE_TOO_MANY_ARGUMENTS), + errmsg_plural("cannot pass more than %d argument to a function", + "cannot pass more than %d arguments to a function", + FUNC_MAX_ARGS, + FUNC_MAX_ARGS))); hashkey->nargs = procStruct->pronargs; memcpy(hashkey->argtypes, procStruct->proargtypes.values, procStruct->pronargs * sizeof(Oid)); diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index f88f53f5e58..11ccac505db 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -476,6 +476,12 @@ get_mergejoin_opfamilies(Oid opno) * * Returns true if able to find the requested operator(s), false if not. * (This indicates that the operator should not have been marked oprcanhash.) + * + * Callers must beware that for container types (arrays, records, ranges) + * this function will succeed for array_eq etc, but the hash function could + * fail at runtime if the contained type(s) are not hashable. If it is + * possible that the operator is one of these, precheck with op_hashjoinable + * or get_op_hash_functions_ext. */ bool get_compatible_hash_operators(Oid opno, @@ -576,6 +582,12 @@ get_compatible_hash_operators(Oid opno, * * Returns true if able to find the requested function(s), false if not. * (This indicates that the operator should not have been marked oprcanhash.) + * + * Callers must beware that for container types (arrays, records, ranges) + * this function will succeed for array_eq etc, but the hash function could + * fail at runtime if the contained type(s) are not hashable. If it is + * possible that the operator is one of these, use get_op_hash_functions_ext + * or precheck with op_hashjoinable. */ bool get_op_hash_functions(Oid opno, @@ -658,6 +670,55 @@ get_op_hash_functions(Oid opno, return result; } +/* + * get_op_hash_functions_ext + * As above, but verify hashability in container-type cases. + * + * As with op_hashjoinable, assume the left input type is sufficient + * to disambiguate container-type cases. + */ +bool +get_op_hash_functions_ext(Oid opno, Oid inputtype, + RegProcedure *lhs_procno, RegProcedure *rhs_procno) +{ + TypeCacheEntry *typentry; + + /* Ensure output args are initialized on failure */ + if (lhs_procno) + *lhs_procno = InvalidOid; + if (rhs_procno) + *rhs_procno = InvalidOid; + + /* As in op_hashjoinable, let the typcache handle the hard cases */ + if (opno == ARRAY_EQ_OP) + { + typentry = lookup_type_cache(inputtype, TYPECACHE_HASH_PROC); + if (typentry->hash_proc != F_HASH_ARRAY) + return false; + } + else if (opno == RECORD_EQ_OP) + { + typentry = lookup_type_cache(inputtype, TYPECACHE_HASH_PROC); + if (typentry->hash_proc != F_HASH_RECORD) + return false; + } + else if (opno == RANGE_EQ_OP) + { + typentry = lookup_type_cache(inputtype, TYPECACHE_HASH_PROC); + if (typentry->hash_proc != F_HASH_RANGE) + return false; + } + else if (opno == MULTIRANGE_EQ_OP) + { + typentry = lookup_type_cache(inputtype, TYPECACHE_HASH_PROC); + if (typentry->hash_proc != F_HASH_MULTIRANGE) + return false; + } + + /* OK, do the normal lookup */ + return get_op_hash_functions(opno, lhs_procno, rhs_procno); +} + /* * get_op_index_interpretation * Given an operator's OID, find out which amcanorder opfamilies it belongs to, @@ -765,15 +826,22 @@ get_op_index_interpretation(Oid opno) /* * equality_ops_are_compatible - * Return true if the two given equality operators have compatible + * Return true if the two given operators have compatible equality * semantics. * * This is trivially true if they are the same operator. Otherwise, - * Otherwise, we look to see if they both belong to an opfamily that - * guarantees compatible semantics for equality. Either finding allows us to - * assume that they have compatible notions of equality. (The reason we need - * to do these pushups is that one might be a cross-type operator; for - * instance int24eq vs int4eq.) + * we look to see if they both belong to an opfamily that guarantees + * compatible semantics for equality. Either finding allows us to assume + * that they have compatible notions of equality. + * + * The typical use is to compare two equality operators (for instance the + * cross-type operators int24eq vs int4eq), but the test is meaningful for + * any pair of operators in a btree/hash opfamily. Btree marks its + * opfamilies as amconsistentequality, which guarantees that every member + * of the family (=, <, <=, >, >=) agrees on the equivalence relation + * defined by the family's "=". So a non-equality operator and an + * equality operator from the same opfamily are also "compatible" in this + * sense. */ bool equality_ops_are_compatible(Oid opno1, Oid opno2) @@ -912,6 +980,48 @@ collations_agree_on_equality(Oid coll1, Oid coll2) return true; } +/* + * op_is_safe_index_member + * Check if the operator is a member of a B-tree or Hash operator family. + * + * Membership in such an opfamily has several useful implications: the operator + * returns non-null for non-null inputs (i.e. "null-safety", required so that + * the operator doesn't break index integrity), and it agrees with other + * members of the same opfamily on equality semantics. Callers use this check + * as a proxy for any of those properties. + */ +bool +op_is_safe_index_member(Oid opno) +{ + bool result = false; + CatCList *catlist; + int i; + + /* + * Search pg_amop to see if the target operator is registered for any + * btree or hash opfamily. + */ + catlist = SearchSysCacheList1(AMOPOPID, ObjectIdGetDatum(opno)); + + for (i = 0; i < catlist->n_members; i++) + { + HeapTuple tuple = &catlist->members[i]->tuple; + Form_pg_amop aform = (Form_pg_amop) GETSTRUCT(tuple); + + /* Check if the AM is B-tree or Hash */ + if (aform->amopmethod == BTREE_AM_OID || + aform->amopmethod == HASH_AM_OID) + { + result = true; + break; + } + } + + ReleaseSysCacheList(catlist); + + return result; +} + /* ---------- AMPROC CACHES ---------- */ @@ -1571,7 +1681,8 @@ op_mergejoinable(Oid opno, Oid inputtype) * For array_eq or record_eq, we can sort if the element or field types * are all sortable. We could implement all the checks for that here, but * the typcache already does that and caches the results too, so let's - * rely on the typcache. + * rely on the typcache. We do not need similar special cases for ranges + * or multiranges, because their subtypes are required to be sortable. */ if (opno == ARRAY_EQ_OP) { @@ -1606,10 +1717,11 @@ op_mergejoinable(Oid opno, Oid inputtype) * Returns true if the operator is hashjoinable. (There must be a suitable * hash opfamily entry for this operator if it is so marked.) * - * In some cases (currently only array_eq), hashjoinability depends on the - * specific input data type the operator is invoked for, so that must be - * passed as well. We currently assume that only one input's type is needed - * to check this --- by convention, pass the left input's data type. + * In some cases (currently array_eq, record_eq, range_eq, multirange_eq), + * hashjoinability depends on the specific input data type the operator is + * invoked for, so that must be passed as well. We currently assume that only + * one input's type is needed to check this --- by convention, pass the left + * input's data type. */ bool op_hashjoinable(Oid opno, Oid inputtype) @@ -1631,6 +1743,18 @@ op_hashjoinable(Oid opno, Oid inputtype) if (typentry->hash_proc == F_HASH_RECORD) result = true; } + else if (opno == RANGE_EQ_OP) + { + typentry = lookup_type_cache(inputtype, TYPECACHE_HASH_PROC); + if (typentry->hash_proc == F_HASH_RANGE) + result = true; + } + else if (opno == MULTIRANGE_EQ_OP) + { + typentry = lookup_type_cache(inputtype, TYPECACHE_HASH_PROC); + if (typentry->hash_proc == F_HASH_MULTIRANGE) + result = true; + } else { /* For all other operators, rely on pg_operator.oprcanhash */ diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c index 89a1c79e984..34adb0b411e 100644 --- a/src/backend/utils/cache/plancache.c +++ b/src/backend/utils/cache/plancache.c @@ -36,7 +36,10 @@ * certain other system catalogs, such as pg_namespace; but for them, our * response is just to invalidate all plans. We expect updates on those * catalogs to be infrequent enough that more-detailed tracking is not worth - * the effort. + * the effort. We likewise watch pg_authid, pg_auth_members, and + * pg_database, which can change which row-level security policies apply. + * Since those are shared catalogs whose inval events reach every backend + * in the cluster, we invalidate only the role-dependent plans. * * In addition to full-fledged query plans, we provide a facility for * detecting invalidations of simple scalar expressions. This is fairly @@ -67,6 +70,7 @@ #include "storage/lmgr.h" #include "tcop/pquery.h" #include "tcop/utility.h" +#include "utils/acl.h" #include "utils/inval.h" #include "utils/memutils.h" #include "utils/resowner.h" @@ -107,6 +111,7 @@ static bool ScanQueryWalker(Node *node, bool *acquire); static TupleDesc PlanCacheComputeResultDesc(List *stmt_list); static void PlanCacheRelCallback(Datum arg, Oid relid); static void PlanCacheObjectCallback(Datum arg, int cacheid, uint32 hashvalue); +static void PlanCacheRoleCallback(Datum arg, int cacheid, uint32 hashvalue); static void PlanCacheSysCallback(Datum arg, int cacheid, uint32 hashvalue); /* ResourceOwner callbacks to track plancache references */ @@ -153,6 +158,9 @@ InitPlanCache(void) CacheRegisterSyscacheCallback(AMOPOPID, PlanCacheSysCallback, (Datum) 0); CacheRegisterSyscacheCallback(FOREIGNSERVEROID, PlanCacheSysCallback, (Datum) 0); CacheRegisterSyscacheCallback(FOREIGNDATAWRAPPEROID, PlanCacheSysCallback, (Datum) 0); + CacheRegisterSyscacheCallback(AUTHMEMROLEMEM, PlanCacheRoleCallback, (Datum) 0); + CacheRegisterSyscacheCallback(AUTHOID, PlanCacheRoleCallback, (Datum) 0); + CacheRegisterSyscacheCallback(DATABASEOID, PlanCacheRoleCallback, (Datum) 0); } /* @@ -2281,6 +2289,56 @@ PlanCacheObjectCallback(Datum arg, int cacheid, uint32 hashvalue) } } +/* + * PlanCacheRoleCallback + * Syscache inval callback function for AUTHMEMROLEMEM, AUTHOID, and + * DATABASEOID caches + * + * Role membership, role attributes, and database ownership (which confers + * membership in pg_database_owner) affect planning by way of row-level + * security, so invalidate just the role-dependent plans. For DATABASEOID, we + * can ignore changes to other databases' pg_database rows. + */ +static void +PlanCacheRoleCallback(Datum arg, int cacheid, uint32 hashvalue) +{ + dlist_iter iter; + + if (cacheid == DATABASEOID && + hashvalue != cached_db_hash && + hashvalue != 0) + return; /* ignore pg_database changes for other DBs */ + + dlist_foreach(iter, &saved_plan_list) + { + CachedPlanSource *plansource = dlist_container(CachedPlanSource, + node, iter.cur); + + Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC); + + /* No work if it's already invalidated */ + if (!plansource->is_valid) + continue; + + /* Never invalidate if parse/plan would be a no-op anyway */ + if (!StmtPlanRequiresRevalidation(plansource)) + continue; + + if (plansource->dependsOnRLS) + { + /* Invalidate the querytree and generic plan */ + plansource->is_valid = false; + if (plansource->gplan) + plansource->gplan->is_valid = false; + } + else if (plansource->gplan && plansource->gplan->dependsOnRole) + { + /* Invalidate the generic plan only */ + plansource->gplan->is_valid = false; + } + } +} + /* * PlanCacheSysCallback * Syscache inval callback function for other caches diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 559ba9cdb2c..2186a6ffeba 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -982,6 +982,8 @@ equalPolicy(RowSecurityPolicy *policy1, RowSecurityPolicy *policy2) if (policy1->polcmd != policy2->polcmd) return false; + if (policy1->permissive != policy2->permissive) + return false; if (policy1->hassublinks != policy2->hassublinks) return false; if (strcmp(policy1->policy_name, policy2->policy_name) != 0) diff --git a/src/backend/utils/cache/ts_cache.c b/src/backend/utils/cache/ts_cache.c index 18cccd778fd..eec244fd16b 100644 --- a/src/backend/utils/cache/ts_cache.c +++ b/src/backend/utils/cache/ts_cache.c @@ -279,37 +279,50 @@ lookup_ts_dictionary_cache(Oid dictId) elog(ERROR, "text search template %u has no lexize method", template->tmpllexize); + /* + * OK, create or clear out the hashtable entry + */ if (entry == NULL) { bool found; - /* Now make the cache entry */ entry = (TSDictionaryCacheEntry *) hash_search(TSDictionaryCacheHash, &dictId, HASH_ENTER, &found); Assert(!found); /* it wasn't there a moment ago */ - /* Create private memory context the first time through */ + memset(entry, 0, sizeof(TSDictionaryCacheEntry)); + entry->dictId = dictId; + saveCtx = NULL; + } + else + { + saveCtx = entry->dictCtx; /* could be NULL if we failed before */ + memset(entry, 0, sizeof(TSDictionaryCacheEntry)); + entry->dictId = dictId; + entry->dictCtx = saveCtx; + } + + /* + * Create or clear the entry's private memory context + */ + if (saveCtx == NULL) + { saveCtx = AllocSetContextCreate(CacheMemoryContext, "TS dictionary", ALLOCSET_SMALL_SIZES); + entry->dictCtx = saveCtx; MemoryContextCopyAndSetIdentifier(saveCtx, NameStr(dict->dictname)); } else { - /* Clear the existing entry's private context */ - saveCtx = entry->dictCtx; /* Don't let context's ident pointer dangle while we reset it */ MemoryContextSetIdentifier(saveCtx, NULL); MemoryContextReset(saveCtx); MemoryContextCopyAndSetIdentifier(saveCtx, NameStr(dict->dictname)); } - MemSet(entry, 0, sizeof(TSDictionaryCacheEntry)); - entry->dictId = dictId; - entry->dictCtx = saveCtx; - entry->lexizeOid = template->tmpllexize; if (OidIsValid(template->tmplinit)) diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c index f9aec38a11f..32c912b82f6 100644 --- a/src/backend/utils/cache/typcache.c +++ b/src/backend/utils/cache/typcache.c @@ -776,8 +776,9 @@ lookup_type_cache(Oid type_id, int flags) HASHSTANDARD_PROC); /* - * As above, make sure hash_array, hash_record, or hash_range will - * succeed. + * As above, make sure hash_array, hash_record, hash_range, or + * hash_multirange will succeed. Here we do need to check the range + * cases. */ if (hash_proc == F_HASH_ARRAY && !array_element_has_hashing(typentry)) @@ -788,12 +789,8 @@ lookup_type_cache(Oid type_id, int flags) else if (hash_proc == F_HASH_RANGE && !range_element_has_hashing(typentry)) hash_proc = InvalidOid; - - /* - * Likewise for hash_multirange. - */ - if (hash_proc == F_HASH_MULTIRANGE && - !multirange_element_has_hashing(typentry)) + else if (hash_proc == F_HASH_MULTIRANGE && + !multirange_element_has_hashing(typentry)) hash_proc = InvalidOid; /* Force update of hash_proc_finfo only if we're changing state */ @@ -825,8 +822,8 @@ lookup_type_cache(Oid type_id, int flags) HASHEXTENDED_PROC); /* - * As above, make sure hash_array_extended, hash_record_extended, or - * hash_range_extended will succeed. + * As above, make sure hash_array_extended, hash_record_extended, + * hash_range_extended, or hash_multirange_extended will succeed. */ if (hash_extended_proc == F_HASH_ARRAY_EXTENDED && !array_element_has_extended_hashing(typentry)) @@ -837,12 +834,8 @@ lookup_type_cache(Oid type_id, int flags) else if (hash_extended_proc == F_HASH_RANGE_EXTENDED && !range_element_has_extended_hashing(typentry)) hash_extended_proc = InvalidOid; - - /* - * Likewise for hash_multirange_extended. - */ - if (hash_extended_proc == F_HASH_MULTIRANGE_EXTENDED && - !multirange_element_has_extended_hashing(typentry)) + else if (hash_extended_proc == F_HASH_MULTIRANGE_EXTENDED && + !multirange_element_has_extended_hashing(typentry)) hash_extended_proc = InvalidOid; /* Force update of proc finfo only if we're changing state */ diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c index 5f2317211c9..b07dcd51ac8 100644 --- a/src/backend/utils/fmgr/funcapi.c +++ b/src/backend/utils/fmgr/funcapi.c @@ -1410,7 +1410,7 @@ get_func_arg_info(HeapTuple procTup, ARR_ELEMTYPE(arr) != OIDOID) elog(ERROR, "proallargtypes is not a 1-D Oid array or it contains nulls"); Assert(numargs >= procStruct->pronargs); - *p_argtypes = (Oid *) palloc(numargs * sizeof(Oid)); + *p_argtypes = palloc_array(Oid, numargs); memcpy(*p_argtypes, ARR_DATA_PTR(arr), numargs * sizeof(Oid)); } @@ -1419,7 +1419,7 @@ get_func_arg_info(HeapTuple procTup, /* If no proallargtypes, use proargtypes */ numargs = procStruct->proargtypes.dim1; Assert(numargs == procStruct->pronargs); - *p_argtypes = (Oid *) palloc(numargs * sizeof(Oid)); + *p_argtypes = palloc_array(Oid, numargs); memcpy(*p_argtypes, procStruct->proargtypes.values, numargs * sizeof(Oid)); } @@ -1498,7 +1498,7 @@ get_func_trftypes(HeapTuple procTup, ARR_HASNULL(arr) || ARR_ELEMTYPE(arr) != OIDOID) elog(ERROR, "protrftypes is not a 1-D Oid array or it contains nulls"); - *p_trftypes = (Oid *) palloc(nelems * sizeof(Oid)); + *p_trftypes = palloc_array(Oid, nelems); memcpy(*p_trftypes, ARR_DATA_PTR(arr), nelems * sizeof(Oid)); diff --git a/src/backend/utils/init/usercontext.c b/src/backend/utils/init/usercontext.c index 2cc42ea1b77..7b6b272c5a7 100644 --- a/src/backend/utils/init/usercontext.c +++ b/src/backend/utils/init/usercontext.c @@ -70,6 +70,12 @@ SwitchToUntrustedUser(Oid userid, UserContext *context) * session state. Also set up a new GUC nest level, so that we can * roll back any GUC changes that may be made by code running as the * target user, inasmuch as they could be malicious. + * + * Unlike most use of SECURITY_RESTRICTED_OPERATION, this opts not to + * use RestrictSearchPath(). Calling it would just stop the current + * user from attacking "userid", but we've already established that + * the current user could just SET ROLE to "userid". Calling it would + * be a compatibility break. */ sec_context |= SECURITY_RESTRICTED_OPERATION; SetUserIdAndSecContext(userid, sec_context); diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index 6b82a23435e..7cab4c735c2 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -72,6 +72,7 @@ #include "postmaster/syslogger.h" #include "postmaster/walsummarizer.h" #include "postmaster/walwriter.h" +#include "replication/logical.h" #include "replication/logicallauncher.h" #include "replication/slot.h" #include "replication/slotsync.h" @@ -4982,6 +4983,18 @@ struct config_string ConfigureNamesString[] = NULL, NULL, NULL }, + { + {"output_plugin_libraries", PGC_SUSET, REPLICATION_SENDING, + gettext_noop("Lists libraries that may be named as logical decoding output plugins."), + gettext_noop("Users with REPLICATION privileges may only use plugins in this list when creating logical replication slots."), + /* note: src/bin/pg_upgrade/check.c assumes GUC_LIST_QUOTE here */ + GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY + }, + &output_plugin_libraries_string, + "pgoutput, test_decoding", + NULL, NULL, NULL + }, + { {"log_connections", PGC_SU_BACKEND, LOGGING_WHAT, gettext_noop("Logs specified aspects of connection establishment and setup."), diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index d91133dbd73..a39f9929ef4 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -250,7 +250,7 @@ #wal_log_hints = off # also do full page writes of non-critical updates # (change requires restart) #wal_compression = off # enables compression of full-page writes; - # off, pglz, lz4, zstd, or on + # off, pglz (or "on"), lz4, or zstd #wal_init_zero = on # zero-fill new WAL files #wal_recycle = on # recycle WAL files #wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers @@ -818,6 +818,7 @@ #dynamic_library_path = '$libdir' #extension_control_path = '$system' #gin_fuzzy_search_limit = 0 +#output_plugin_libraries = 'pgoutput, test_decoding' # approved plugins for logical decoding #------------------------------------------------------------------------------ diff --git a/src/backend/utils/misc/stack_depth.c b/src/backend/utils/misc/stack_depth.c index 8f7cf531fbc..2b976731880 100644 --- a/src/backend/utils/misc/stack_depth.c +++ b/src/backend/utils/misc/stack_depth.c @@ -53,7 +53,8 @@ set_stack_base(void) /* * Set up reference point for stack depth checking. On recent gcc we use * __builtin_frame_address() to avoid a warning about storing a local - * variable's address in a long-lived variable. + * variable's address in a long-lived variable. This is also important + * with address sanitizer, see comment in stack_is_too_deep(). */ #ifdef HAVE__BUILTIN_FRAME_ADDRESS stack_base_ptr = __builtin_frame_address(0); @@ -108,13 +109,28 @@ check_stack_depth(void) bool stack_is_too_deep(void) { +#ifndef HAVE__BUILTIN_FRAME_ADDRESS char stack_top_loc; +#endif ssize_t stack_depth; + char *stack_address; + + /* + * With address sanitizer's stack-use-after-return check, stack variables + * are moved to heap allocations, to allow to detect references to the + * memory at a later time. That would break our stack-depth check. Luckily + * __builtin_frame_address() works correctly, even under asan. + */ +#ifndef HAVE__BUILTIN_FRAME_ADDRESS + stack_address = &stack_top_loc; +#else + stack_address = (char *) __builtin_frame_address(0); +#endif /* - * Compute distance from reference point to my local variables + * Compute distance from reference point to my stack frame. */ - stack_depth = (ssize_t) (stack_base_ptr - &stack_top_loc); + stack_depth = (ssize_t) (stack_base_ptr - stack_address); /* * Take abs value, since stacks grow up on some machines, down on others diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c index 85ee9ad9029..3654b61e68d 100644 --- a/src/backend/utils/mmgr/mcxt.c +++ b/src/backend/utils/mmgr/mcxt.c @@ -1486,6 +1486,13 @@ MemoryContextAllocAligned(MemoryContext context, /* perform the actual allocation */ unaligned = MemoryContextAllocExtended(context, alloc_size, flags); + if (unlikely(unaligned == NULL)) + { + /* NULL can be returned only when using MCXT_ALLOC_NO_OOM */ + Assert(flags & MCXT_ALLOC_NO_OOM); + return NULL; + } + /* set the aligned pointer */ aligned = (void *) TYPEALIGN(alignto, (char *) unaligned + sizeof(MemoryChunk)); diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index d39f3e1b655..cd2155caabd 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -350,6 +350,7 @@ ResourceOwnerReleaseAll(ResourceOwner owner, ResourceReleasePhase phase, { ResourceElem *items; uint32 nitems; + bool using_arr; /* * ResourceOwnerSort must've been called already. All the resources are @@ -361,12 +362,14 @@ ResourceOwnerReleaseAll(ResourceOwner owner, ResourceReleasePhase phase, { items = owner->arr; nitems = owner->narr; + using_arr = true; } else { Assert(owner->narr == 0); items = owner->hash; nitems = owner->nhash; + using_arr = false; } /* @@ -395,13 +398,20 @@ ResourceOwnerReleaseAll(ResourceOwner owner, ResourceReleasePhase phase, elog(WARNING, "resource was not closed: %s", res_str); pfree(res_str); } - kind->ReleaseResource(value); + + /* + * Update stored count to forget the item before calling its + * ReleaseResource method. This avoids double-free crashes in case an + * error gets thrown within ReleaseResource. + */ nitems--; + if (using_arr) + owner->narr = nitems; + else + owner->nhash = nitems; + + kind->ReleaseResource(value); } - if (owner->nhash == 0) - owner->narr = nitems; - else - owner->nhash = nitems; } diff --git a/src/bin/initdb/po/de.po b/src/bin/initdb/po/de.po index 43ea62f1827..3f244d6ca91 100644 --- a/src/bin/initdb/po/de.po +++ b/src/bin/initdb/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-04-03 12:22+0000\n" +"POT-Creation-Date: 2026-08-04 08:44+0000\n" "PO-Revision-Date: 2025-04-03 16:13+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -82,17 +82,27 @@ msgstr "%s() fehlgeschlagen: %m" msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format @@ -281,7 +291,7 @@ msgstr "konnte alte Locale nicht wiederherstellen" msgid "failed to restore old locale \"%s\"" msgstr "konnte alte Locale »%s« nicht wiederherstellen" -#: initdb.c:685 initdb.c:1700 +#: initdb.c:685 initdb.c:1692 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" @@ -386,169 +396,164 @@ msgstr "konnte nicht auf Datei »%s« zugreifen: %m" msgid "file \"%s\" is not a regular file" msgstr "Datei »%s« ist keine normale Datei" -#: initdb.c:1158 +#: initdb.c:1157 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "wähle Implementierung von dynamischem Shared Memory ... " -#: initdb.c:1168 +#: initdb.c:1167 #, c-format msgid "selecting default \"max_connections\" ... " msgstr "wähle Vorgabewert für »max_connections« ... " -#: initdb.c:1193 -#, c-format -msgid "selecting default \"autovacuum_worker_slots\" ... %d\n" -msgstr "wähle Vorgabewert für »autovacuum_worker_slots« ... %d\n" - -#: initdb.c:1196 +#: initdb.c:1188 #, c-format msgid "selecting default \"shared_buffers\" ... " msgstr "wähle Vorgabewert für »shared_buffers« ... " -#: initdb.c:1219 +#: initdb.c:1211 #, c-format msgid "selecting default time zone ... " msgstr "wähle Vorgabewert für Zeitzone ... " -#: initdb.c:1299 +#: initdb.c:1291 msgid "creating configuration files ... " msgstr "erzeuge Konfigurationsdateien ... " -#: initdb.c:1451 initdb.c:1465 initdb.c:1532 initdb.c:1543 +#: initdb.c:1443 initdb.c:1457 initdb.c:1524 initdb.c:1535 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "konnte Zugriffsrechte von »%s« nicht ändern: %m" -#: initdb.c:1562 +#: initdb.c:1554 #, c-format msgid "running bootstrap script ... " msgstr "führe Bootstrap-Skript aus ... " -#: initdb.c:1574 +#: initdb.c:1566 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "Eingabedatei »%s« gehört nicht zu PostgreSQL %s" -#: initdb.c:1576 +#: initdb.c:1568 #, c-format msgid "Specify the correct path using the option -L." msgstr "Geben Sie den korrekten Pfad mit der Option -L an." -#: initdb.c:1678 +#: initdb.c:1670 msgid "Enter new superuser password: " msgstr "Geben Sie das neue Superuser-Passwort ein: " -#: initdb.c:1679 +#: initdb.c:1671 msgid "Enter it again: " msgstr "Geben Sie es noch einmal ein: " -#: initdb.c:1682 +#: initdb.c:1674 #, c-format msgid "Passwords didn't match.\n" msgstr "Passwörter stimmten nicht überein.\n" -#: initdb.c:1706 +#: initdb.c:1698 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "konnte Passwort nicht aus Datei »%s« lesen: %m" -#: initdb.c:1709 +#: initdb.c:1701 #, c-format msgid "password file \"%s\" is empty" msgstr "Passwortdatei »%s« ist leer" -#: initdb.c:2121 +#: initdb.c:2113 #, c-format msgid "caught signal\n" msgstr "Signal abgefangen\n" -#: initdb.c:2127 +#: initdb.c:2119 #, c-format msgid "could not write to child process: %s\n" msgstr "konnte nicht an Kindprozess schreiben: %s\n" -#: initdb.c:2135 +#: initdb.c:2127 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2217 initdb.c:2263 +#: initdb.c:2209 initdb.c:2255 #, c-format msgid "locale name \"%s\" contains non-ASCII characters" msgstr "Locale-Name »%s« enthält Nicht-ASCII-Zeichen" -#: initdb.c:2243 +#: initdb.c:2235 #, c-format msgid "invalid locale name \"%s\"" msgstr "ungültiger Locale-Name: »%s«" -#: initdb.c:2244 +#: initdb.c:2236 #, c-format msgid "If the locale name is specific to ICU, use --icu-locale." msgstr "Wenn der Locale-Name nur für ICU gültig ist, verwenden Sie --icu-locale." -#: initdb.c:2257 +#: initdb.c:2249 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "ungültige Locale-Einstellungen; prüfen Sie die Umgebungsvariablen LANG und LC_*" -#: initdb.c:2288 initdb.c:2312 +#: initdb.c:2280 initdb.c:2304 #, c-format msgid "encoding mismatch" msgstr "unpassende Kodierungen" -#: initdb.c:2289 +#: initdb.c:2281 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "Die von Ihnen gewählte Kodierung (%s) und die von der gewählten Locale verwendete Kodierung (%s) passen nicht zu einander. Das würde in verschiedenen Zeichenkettenfunktionen zu Fehlverhalten führen." -#: initdb.c:2294 initdb.c:2315 +#: initdb.c:2286 initdb.c:2307 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "Starten Sie %s erneut und geben Sie entweder keine Kodierung explizit an oder wählen Sie eine passende Kombination." -#: initdb.c:2313 +#: initdb.c:2305 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "Die von Ihnen gewählte Kodierung (%s) wird vom ICU-Provider nicht unterstützt." -#: initdb.c:2364 +#: initdb.c:2356 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "konnte Locale-Namen »%s« nicht in Sprach-Tag umwandeln: %s" -#: initdb.c:2370 initdb.c:2422 initdb.c:2516 +#: initdb.c:2362 initdb.c:2414 initdb.c:2508 #, c-format msgid "ICU is not supported in this build" msgstr "ICU wird in dieser Installation nicht unterstützt" -#: initdb.c:2393 +#: initdb.c:2385 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "konnte Sprache nicht aus Locale »%s« ermitteln: %s" -#: initdb.c:2419 +#: initdb.c:2411 #, c-format msgid "locale \"%s\" has unknown language \"%s\"" msgstr "Locale »%s« hat unbekannte Sprache »%s«" -#: initdb.c:2480 +#: initdb.c:2472 #, c-format msgid "locale must be specified if provider is %s" msgstr "Locale muss angegeben werden, wenn der Provider %s ist" -#: initdb.c:2493 +#: initdb.c:2485 #, c-format msgid "invalid locale name \"%s\" for builtin provider" msgstr "ungültiger Locale-Name »%s« für Provider »builtin«" -#: initdb.c:2504 +#: initdb.c:2496 #, c-format msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" msgstr "Verwende Sprach-Tag »%s« für ICU-Locale »%s«.\n" -#: initdb.c:2527 +#: initdb.c:2519 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -557,17 +562,17 @@ msgstr "" "%s initialisiert einen PostgreSQL-Datenbankcluster.\n" "\n" -#: initdb.c:2528 +#: initdb.c:2520 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: initdb.c:2529 +#: initdb.c:2521 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n" -#: initdb.c:2530 +#: initdb.c:2522 #, c-format msgid "" "\n" @@ -576,65 +581,65 @@ msgstr "" "\n" "Optionen:\n" -#: initdb.c:2531 +#: initdb.c:2523 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHODE vorgegebene Authentifizierungsmethode für lokale Verbindungen\n" -#: initdb.c:2532 +#: initdb.c:2524 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr "" " --auth-host=METHODE vorgegebene Authentifizierungsmethode für lokale\n" " TCP/IP-Verbindungen\n" -#: initdb.c:2533 +#: initdb.c:2525 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr "" " --auth-local=METHODE vorgegebene Authentifizierungsmethode für Verbindungen\n" " auf lokalen Sockets\n" -#: initdb.c:2534 +#: initdb.c:2526 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATENVERZ Datenverzeichnis für diesen Datenbankcluster\n" -#: initdb.c:2535 +#: initdb.c:2527 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=KODIERUNG setze Standardkodierung für neue Datenbanken\n" -#: initdb.c:2536 +#: initdb.c:2528 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr "" " -g, --allow-group-access Lese- und Ausführungsrechte am Datenverzeichnis\n" " für Gruppe setzen\n" -#: initdb.c:2537 +#: initdb.c:2529 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=LOCALE setze ICU-Locale-ID für neue Datenbanken\n" -#: initdb.c:2538 +#: initdb.c:2530 #, c-format msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" msgstr "" " --icu-rules=REGELN setze zusätzliche ICU-Sortierfolgenregeln für neue\n" " Datenbanken\n" -#: initdb.c:2539 +#: initdb.c:2531 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums Datenseitenprüfsummen verwenden\n" -#: initdb.c:2540 +#: initdb.c:2532 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE setze Standardlocale für neue Datenbanken\n" -#: initdb.c:2541 +#: initdb.c:2533 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -648,12 +653,12 @@ msgstr "" " für neue Datenbanken (Voreinstellung aus der\n" " Umgebung entnommen)\n" -#: initdb.c:2545 +#: initdb.c:2537 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale entspricht --locale=C\n" -#: initdb.c:2546 +#: initdb.c:2538 #, c-format msgid "" " --builtin-locale=LOCALE\n" @@ -662,7 +667,7 @@ msgstr "" " --builtin-locale=LOCALE\n" " setze Locale für Provider »builtin« für neue Datenbanken\n" -#: initdb.c:2548 +#: initdb.c:2540 #, c-format msgid "" " --locale-provider={builtin|libc|icu}\n" @@ -671,17 +676,17 @@ msgstr "" " --locale-provider={builtin|libc|icu}\n" " setze Standard-Locale-Provider für neue Datenbanken\n" -#: initdb.c:2550 +#: initdb.c:2542 #, c-format msgid " --no-data-checksums do not use data page checksums\n" msgstr " --no-data-checksums Datenseitenprüfsummen nicht verwenden\n" -#: initdb.c:2551 +#: initdb.c:2543 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=DATEI lese Passwort des neuen Superusers aus Datei\n" -#: initdb.c:2552 +#: initdb.c:2544 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -690,27 +695,27 @@ msgstr "" " -T, --text-search-config=KFG\n" " Standardtextsuchekonfiguration\n" -#: initdb.c:2554 +#: initdb.c:2546 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME Datenbank-Superusername\n" -#: initdb.c:2555 +#: initdb.c:2547 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt frage nach Passwort für neuen Superuser\n" -#: initdb.c:2556 +#: initdb.c:2548 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALVERZ Verzeichnis für das Write-Ahead-Log\n" -#: initdb.c:2557 +#: initdb.c:2549 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabyte\n" -#: initdb.c:2558 +#: initdb.c:2550 #, c-format msgid "" "\n" @@ -719,68 +724,68 @@ msgstr "" "\n" "Weniger häufig verwendete Optionen:\n" -#: initdb.c:2559 +#: initdb.c:2551 #, c-format msgid " -c, --set NAME=VALUE override default setting for server parameter\n" msgstr " -c, --set NAME=WERT Voreinstellung für Serverparameter setzen\n" -#: initdb.c:2560 +#: initdb.c:2552 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug erzeuge eine Menge Debug-Ausgaben\n" -#: initdb.c:2561 +#: initdb.c:2553 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches debug_discard_caches=1 setzen\n" -#: initdb.c:2562 +#: initdb.c:2554 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L VERZEICHNIS wo sind die Eingabedateien zu finden\n" -#: initdb.c:2563 +#: initdb.c:2555 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean nach Fehlern nicht aufräumen\n" -#: initdb.c:2564 +#: initdb.c:2556 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: initdb.c:2565 +#: initdb.c:2557 #, c-format msgid " --no-sync-data-files do not sync files within database directories\n" msgstr " --no-sync-data-files Dateien in Datenbankverzeichnissen nicht synchronisieren\n" -#: initdb.c:2566 +#: initdb.c:2558 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions Anleitung für nächste Schritte nicht ausgeben\n" -#: initdb.c:2567 +#: initdb.c:2559 #, c-format msgid " -s, --show show internal settings, then exit\n" msgstr " -s, --show interne Einstellungen zeigen, dann beenden\n" -#: initdb.c:2568 +#: initdb.c:2560 #, c-format msgid " --sync-method=METHOD set method for syncing files to disk\n" msgstr "" " --sync-method=METHODE Methode zum Synchronisieren vond Dateien auf\n" " Festplatte setzen\n" -#: initdb.c:2569 +#: initdb.c:2561 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr "" " -S, --sync-only nur Datenbankdateien auf Festplatte synchronisieren,\n" " dann beenden\n" -#: initdb.c:2570 +#: initdb.c:2562 #, c-format msgid "" "\n" @@ -789,17 +794,17 @@ msgstr "" "\n" "Weitere Optionen:\n" -#: initdb.c:2571 +#: initdb.c:2563 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: initdb.c:2572 +#: initdb.c:2564 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: initdb.c:2573 +#: initdb.c:2565 #, c-format msgid "" "\n" @@ -810,7 +815,7 @@ msgstr "" "Wenn kein Datenverzeichnis angegeben ist, dann wird die Umgebungsvariable\n" "PGDATA verwendet.\n" -#: initdb.c:2575 +#: initdb.c:2567 #, c-format msgid "" "\n" @@ -819,72 +824,72 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: initdb.c:2576 +#: initdb.c:2568 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: initdb.c:2600 +#: initdb.c:2592 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "ungültige Authentifizierungsmethode »%s« für »%s«-Verbindungen" -#: initdb.c:2614 +#: initdb.c:2606 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "Superuser-Passwort muss angegeben werden um Passwortauthentifizierung einzuschalten" -#: initdb.c:2633 +#: initdb.c:2625 #, c-format msgid "no data directory specified" msgstr "kein Datenverzeichnis angegeben" -#: initdb.c:2634 +#: initdb.c:2626 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "Sie müssen das Verzeichnis angeben, wo dieses Datenbanksystem abgelegt werden soll. Machen Sie dies entweder mit der Kommandozeilenoption -D oder mit der Umgebungsvariable PGDATA." -#: initdb.c:2651 +#: initdb.c:2643 #, c-format msgid "could not set environment" msgstr "konnte Umgebung nicht setzen" -#: initdb.c:2669 +#: initdb.c:2661 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: initdb.c:2672 +#: initdb.c:2664 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" -#: initdb.c:2687 +#: initdb.c:2679 #, c-format msgid "input file location must be an absolute path" msgstr "Eingabedatei muss absoluten Pfad haben" -#: initdb.c:2704 +#: initdb.c:2696 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "Der Datenbankcluster wird mit der Locale »%s« initialisiert werden.\n" -#: initdb.c:2707 +#: initdb.c:2699 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "Der Datenbankcluster wird mit dieser Locale-Konfiguration initialisiert werden:\n" -#: initdb.c:2708 +#: initdb.c:2700 #, c-format msgid " locale provider: %s\n" msgstr " Locale-Provider: %s\n" -#: initdb.c:2710 +#: initdb.c:2702 #, c-format msgid " default collation: %s\n" msgstr " Standardsortierfolge: %s\n" -#: initdb.c:2711 +#: initdb.c:2703 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -901,22 +906,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2741 +#: initdb.c:2733 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "konnte keine passende Kodierung für Locale »%s« finden" -#: initdb.c:2743 +#: initdb.c:2735 #, c-format msgid "Rerun %s with the -E option." msgstr "Führen Sie %s erneut mit der Option -E aus." -#: initdb.c:2744 initdb.c:3282 initdb.c:3408 initdb.c:3428 +#: initdb.c:2736 initdb.c:3274 initdb.c:3400 initdb.c:3420 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: initdb.c:2756 +#: initdb.c:2748 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -925,112 +930,112 @@ msgstr "" "Die von der Locale gesetzte Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt.\n" "Die Standarddatenbankkodierung wird stattdessen auf »%s« gesetzt.\n" -#: initdb.c:2761 +#: initdb.c:2753 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "Locale »%s« benötigt nicht unterstützte Kodierung »%s«" -#: initdb.c:2763 +#: initdb.c:2755 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt." -#: initdb.c:2765 +#: initdb.c:2757 #, c-format msgid "Rerun %s with a different locale selection." msgstr "Starten Sie %s erneut mit einer anderen Locale-Wahl." -#: initdb.c:2773 +#: initdb.c:2765 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "Die Standarddatenbankkodierung wurde entsprechend auf »%s« gesetzt.\n" -#: initdb.c:2789 +#: initdb.c:2781 #, c-format msgid "builtin provider locale \"%s\" requires encoding \"%s\"" msgstr "Locale »%s« vom Provider »builtin« benötigt Kodierung »%s«" -#: initdb.c:2851 +#: initdb.c:2843 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "konnte keine passende Textsuchekonfiguration für Locale »%s« finden" -#: initdb.c:2862 +#: initdb.c:2854 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "passende Textsuchekonfiguration für Locale »%s« ist unbekannt" -#: initdb.c:2867 +#: initdb.c:2859 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "angegebene Textsuchekonfiguration »%s« passt möglicherweise nicht zur Locale »%s«" -#: initdb.c:2872 +#: initdb.c:2864 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Die Standardtextsuchekonfiguration wird auf »%s« gesetzt.\n" -#: initdb.c:2906 initdb.c:2977 +#: initdb.c:2898 initdb.c:2969 #, c-format msgid "creating directory %s ... " msgstr "erzeuge Verzeichnis %s ... " -#: initdb.c:2911 initdb.c:2982 initdb.c:3030 initdb.c:3087 +#: initdb.c:2903 initdb.c:2974 initdb.c:3022 initdb.c:3079 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: initdb.c:2920 initdb.c:2992 +#: initdb.c:2912 initdb.c:2984 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "berichtige Zugriffsrechte des bestehenden Verzeichnisses %s ... " -#: initdb.c:2925 initdb.c:2997 +#: initdb.c:2917 initdb.c:2989 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "konnte Rechte des Verzeichnisses »%s« nicht ändern: %m" -#: initdb.c:2937 initdb.c:3009 +#: initdb.c:2929 initdb.c:3001 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "Verzeichnis »%s« existiert aber ist nicht leer" -#: initdb.c:2941 +#: initdb.c:2933 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "Wenn Sie ein neues Datenbanksystem erzeugen wollen, entfernen oder leeren Sie das Verzeichnis »%s« or führen Sie %s mit einem anderen Argument als »%s« aus." -#: initdb.c:2949 initdb.c:3019 initdb.c:3453 +#: initdb.c:2941 initdb.c:3011 initdb.c:3445 #, c-format msgid "could not access directory \"%s\": %m" msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" -#: initdb.c:2970 +#: initdb.c:2962 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL-Verzeichnis muss absoluten Pfad haben" -#: initdb.c:3013 +#: initdb.c:3005 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "Wenn Sie dort den WAL ablegen wollen, entfernen oder leeren Sie das Verzeichnis »%s«." -#: initdb.c:3023 +#: initdb.c:3015 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: initdb.c:3042 +#: initdb.c:3034 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "Es enthält eine unsichtbare Datei (beginnt mit Punkt), vielleicht weil es ein Einhängepunkt ist." -#: initdb.c:3044 +#: initdb.c:3036 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "Es enthält ein Verzeichnis »lost+found«, vielleicht weil es ein Einhängepunkt ist." -#: initdb.c:3046 +#: initdb.c:3038 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -1039,65 +1044,65 @@ msgstr "" "Einen Einhängepunkt direkt als Datenverzeichnis zu verwenden wird nicht empfohlen.\n" "Erzeugen Sie ein Unterverzeichnis unter dem Einhängepunkt." -#: initdb.c:3073 +#: initdb.c:3065 #, c-format msgid "creating subdirectories ... " msgstr "erzeuge Unterverzeichnisse ... " -#: initdb.c:3116 +#: initdb.c:3108 msgid "performing post-bootstrap initialization ... " msgstr "führe Post-Bootstrap-Initialisierung durch ... " -#: initdb.c:3281 +#: initdb.c:3273 #, c-format msgid "-c %s requires a value" msgstr "-c %s benötigt einen Wert" -#: initdb.c:3306 +#: initdb.c:3298 #, c-format msgid "Running in debug mode.\n" msgstr "Debug-Modus ist an.\n" -#: initdb.c:3310 +#: initdb.c:3302 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "No-Clean-Modus ist an. Bei Fehlern wird nicht aufgeräumt.\n" -#: initdb.c:3383 +#: initdb.c:3375 #, c-format msgid "unrecognized locale provider: %s" msgstr "unbekannter Locale-Provider: %s" -#: initdb.c:3426 +#: initdb.c:3418 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: initdb.c:3433 initdb.c:3437 initdb.c:3441 +#: initdb.c:3425 initdb.c:3429 initdb.c:3433 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s kann nur angegeben werden, wenn Locale-Provider »%s« gewählt ist" -#: initdb.c:3455 initdb.c:3518 +#: initdb.c:3447 initdb.c:3510 msgid "syncing data to disk ... " msgstr "synchronisiere Daten auf Festplatte ... " -#: initdb.c:3463 +#: initdb.c:3455 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "Passwortprompt und Passwortdatei können nicht zusammen angegeben werden" -#: initdb.c:3474 +#: initdb.c:3466 #, c-format msgid "argument of %s must be a power of two between 1 and 1024" msgstr "Argument von %s muss eine Zweierpotenz zwischen 1 und 1024 sein" -#: initdb.c:3487 +#: initdb.c:3479 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "Superuser-Name »%s« nicht erlaubt; Rollennamen können nicht mit »pg_« anfangen" -#: initdb.c:3489 +#: initdb.c:3481 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -1108,17 +1113,17 @@ msgstr "" "»%s« gehören. Diesem Benutzer muss auch der Serverprozess gehören.\n" "\n" -#: initdb.c:3505 +#: initdb.c:3497 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Datenseitenprüfsummen sind eingeschaltet.\n" -#: initdb.c:3507 +#: initdb.c:3499 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Datenseitenprüfsummen sind ausgeschaltet.\n" -#: initdb.c:3524 +#: initdb.c:3516 #, c-format msgid "" "\n" @@ -1129,22 +1134,22 @@ msgstr "" "Synchronisation auf Festplatte übersprungen.\n" "Das Datenverzeichnis könnte verfälscht werden, falls das Betriebssystem abstürzt.\n" -#: initdb.c:3529 +#: initdb.c:3521 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "Authentifizierung für lokale Verbindungen auf »trust« gesetzt" -#: initdb.c:3530 +#: initdb.c:3522 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "Sie können dies ändern, indem Sie pg_hba.conf bearbeiten oder beim nächsten Aufruf von initdb die Option -A, oder --auth-local und --auth-host, verwenden." #. translator: This is a placeholder in a shell command. -#: initdb.c:3560 +#: initdb.c:3552 msgid "logfile" msgstr "logdatei" -#: initdb.c:3562 +#: initdb.c:3554 #, c-format msgid "" "\n" diff --git a/src/bin/initdb/po/ja.po b/src/bin/initdb/po/ja.po index 62098fe2bba..dab39526360 100644 --- a/src/bin/initdb/po/ja.po +++ b/src/bin/initdb/po/ja.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: initdb (PostgreSQL 18)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-03-26 11:21+0900\n" -"PO-Revision-Date: 2025-03-31 16:23+0900\n" +"POT-Creation-Date: 2026-05-12 14:54+0900\n" +"PO-Revision-Date: 2026-05-14 16:21+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -83,17 +83,27 @@ msgstr "%s() が失敗しました: %m" msgid "out of memory" msgstr "メモリ不足です" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません(内部エラー)。\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "メモリ割り当て要求サイズ %zu * %zu が不正です\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format @@ -282,7 +292,7 @@ msgstr "古いロケールの復元に失敗しました" msgid "failed to restore old locale \"%s\"" msgstr "古いロケール\"%s\"を復元できませんでした" -#: initdb.c:685 initdb.c:1705 +#: initdb.c:685 initdb.c:1692 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m" @@ -387,186 +397,181 @@ msgstr "ファイル\"%s\"にアクセスできませんでした: %m" msgid "file \"%s\" is not a regular file" msgstr "ファイル\"%s\"は通常のファイルではありません" -#: initdb.c:1158 +#: initdb.c:1157 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "動的共有メモリの実装を選択しています ... " -#: initdb.c:1168 +#: initdb.c:1167 #, c-format msgid "selecting default \"max_connections\" ... " msgstr "デフォルトの\"max_connections\"を選択しています ... " -#: initdb.c:1193 -#, c-format -msgid "selecting default \"autovacuum_worker_slots\" ... %d\n" -msgstr "デフォルトの\"autovacuum_worker_slots\"を選択しています ... %d\n" - -#: initdb.c:1196 +#: initdb.c:1188 #, c-format msgid "selecting default \"shared_buffers\" ... " msgstr "デフォルトの\"shared_buffers\"を選択しています ... " -#: initdb.c:1219 +#: initdb.c:1211 #, c-format msgid "selecting default time zone ... " msgstr "デフォルトの時間帯を選択しています ... " -#: initdb.c:1299 +#: initdb.c:1291 msgid "creating configuration files ... " msgstr "設定ファイルを作成しています ... " -#: initdb.c:1456 initdb.c:1470 initdb.c:1537 initdb.c:1548 +#: initdb.c:1443 initdb.c:1457 initdb.c:1524 initdb.c:1535 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "\"%s\"の権限を変更できませんでした: %m" -#: initdb.c:1567 +#: initdb.c:1554 #, c-format msgid "running bootstrap script ... " msgstr "ブートストラップスクリプトを実行しています ... " -#: initdb.c:1579 +#: initdb.c:1566 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "入力ファイル\"%s\"は PostgreSQL %s のものではありません" -#: initdb.c:1581 +#: initdb.c:1568 #, c-format msgid "Specify the correct path using the option -L." msgstr "-Lオプションを使用して正しいパスを指定してください。" -#: initdb.c:1683 +#: initdb.c:1670 msgid "Enter new superuser password: " msgstr "新しいスーパーユーザーのパスワードを入力してください:" -#: initdb.c:1684 +#: initdb.c:1671 msgid "Enter it again: " msgstr "再入力してください:" -#: initdb.c:1687 +#: initdb.c:1674 #, c-format msgid "Passwords didn't match.\n" msgstr "パスワードが一致しません。\n" -#: initdb.c:1711 +#: initdb.c:1698 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "ファイル\"%s\"からパスワードを読み取ることができませんでした: %m" -#: initdb.c:1714 +#: initdb.c:1701 #, c-format msgid "password file \"%s\" is empty" msgstr "パスワードファイル\"%s\"が空です" -#: initdb.c:2126 +#: initdb.c:2113 #, c-format msgid "caught signal\n" msgstr "シグナルが発生しました\n" -#: initdb.c:2132 +#: initdb.c:2119 #, c-format msgid "could not write to child process: %s\n" msgstr "子プロセスへの書き込みができませんでした: %s\n" -#: initdb.c:2140 +#: initdb.c:2127 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2222 initdb.c:2268 +#: initdb.c:2209 initdb.c:2255 #, c-format msgid "locale name \"%s\" contains non-ASCII characters" msgstr "ロケール名\"%s\"は不正な非ASCII文字を含んでいます" -#: initdb.c:2248 +#: initdb.c:2235 #, c-format msgid "invalid locale name \"%s\"" msgstr "ロケール名\"%s\"は不正です" -#: initdb.c:2249 +#: initdb.c:2236 #, c-format msgid "If the locale name is specific to ICU, use --icu-locale." msgstr "ロケール名がICU特有のものである場合は、--icu-localeを使用してください。" -#: initdb.c:2262 +#: initdb.c:2249 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "不正なロケール設定; 環境変数LANGおよびLC_* を確認してください" -#: initdb.c:2293 initdb.c:2317 +#: initdb.c:2280 initdb.c:2304 #, c-format msgid "encoding mismatch" msgstr "符号化方式が合いません" -#: initdb.c:2294 +#: initdb.c:2281 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "選択した符号化方式(%s)と選択したロケールが使用する符号化方式(%s)が合っていません。これにより各種の文字列処理関数が間違った動作をすることになります。" -#: initdb.c:2299 initdb.c:2320 +#: initdb.c:2286 initdb.c:2307 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "%sを再度実行してください、その際にはエンコーディングを明示的に指定しないか、適合する組み合わせを選択してください。" -#: initdb.c:2318 +#: initdb.c:2305 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "指定された符号化方式(%s)はICUプロバイダではサポートされません。" -#: initdb.c:2369 +#: initdb.c:2356 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "ロケール名\"%s\"を、言語タグに変換できませんでした: %s" -#: initdb.c:2375 initdb.c:2427 initdb.c:2521 +#: initdb.c:2362 initdb.c:2414 initdb.c:2508 #, c-format msgid "ICU is not supported in this build" msgstr "このビルドではICUはサポートされていません" -#: initdb.c:2398 +#: initdb.c:2385 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "ロケール\"%s\"から言語を取得できませんでした: %s" -#: initdb.c:2424 +#: initdb.c:2411 #, c-format msgid "locale \"%s\" has unknown language \"%s\"" msgstr "ロケール\"%s\"は未知の言語\"%s\"を含んでいます" -#: initdb.c:2485 +#: initdb.c:2472 #, c-format msgid "locale must be specified if provider is %s" msgstr "ロケールプロバイダが%sの場合はロケールの指定が必須です" -#: initdb.c:2498 +#: initdb.c:2485 #, c-format msgid "invalid locale name \"%s\" for builtin provider" msgstr "ロケール名\"%s\"は組み込みプロバイダでは不正です" -#: initdb.c:2509 +#: initdb.c:2496 #, c-format msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" msgstr "ICUロケール\"%s\"に対して言語タグ\"%s\"を使用します。\n" -#: initdb.c:2532 +#: initdb.c:2519 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" "\n" msgstr "%sはPostgreSQLデータベースクラスタを初期化します。\n" -#: initdb.c:2533 +#: initdb.c:2520 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: initdb.c:2534 +#: initdb.c:2521 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: initdb.c:2535 +#: initdb.c:2522 #, c-format msgid "" "\n" @@ -575,57 +580,57 @@ msgstr "" "\n" "オプション:\n" -#: initdb.c:2536 +#: initdb.c:2523 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHOD ローカル接続のデフォルト認証方式\n" -#: initdb.c:2537 +#: initdb.c:2524 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=METHOD ローカルTCP/IP接続のデフォルト認証方式\n" -#: initdb.c:2538 +#: initdb.c:2525 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METHOD ローカルソケット接続のデフォルト認証方式\n" -#: initdb.c:2539 +#: initdb.c:2526 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATADIR データベースクラスタの場所\n" -#: initdb.c:2540 +#: initdb.c:2527 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING 新規データベースのデフォルト符号化方式\n" -#: initdb.c:2541 +#: initdb.c:2528 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access データディレクトリのグループ読み取り/実行を許可\n" -#: initdb.c:2542 +#: initdb.c:2529 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=LOCALE 新しいデータベースのICUロケールIDを設定\n" -#: initdb.c:2543 +#: initdb.c:2530 #, c-format msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" msgstr " --icu-rules=RULES 新しいデータベースに追加するICU照合順序ルール(群)\n" -#: initdb.c:2544 +#: initdb.c:2531 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums データページのチェックサムを使用\n" -#: initdb.c:2545 +#: initdb.c:2532 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE 新しいデータベースのデフォルトロケールをセット\n" -#: initdb.c:2546 +#: initdb.c:2533 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -639,12 +644,12 @@ msgstr "" " デフォルトロケールを設定(デフォルト値は環境変数から\n" " 取得)\n" -#: initdb.c:2550 +#: initdb.c:2537 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale --locale=C と同じ\n" -#: initdb.c:2551 +#: initdb.c:2538 #, c-format msgid "" " --builtin-locale=LOCALE\n" @@ -653,7 +658,7 @@ msgstr "" " --builtin-locale=LOCALE\n" " 新しいデータベースの組み込みロケールを指定\n" -#: initdb.c:2553 +#: initdb.c:2540 #, c-format msgid "" " --locale-provider={builtin|libc|icu}\n" @@ -663,19 +668,19 @@ msgstr "" " 新しいデータベースにおけるデフォルトのロケール\n" " プロバイダを設定\n" -#: initdb.c:2555 +#: initdb.c:2542 #, c-format msgid " --no-data-checksums do not use data page checksums\n" msgstr " --no-data-checksums データページのチェックサムを使用しない\n" -#: initdb.c:2556 +#: initdb.c:2543 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr "" " --pwfile=ファイル名 新しいスーパーユーザーのパスワードをファイルから\n" " 読み込む\n" -#: initdb.c:2557 +#: initdb.c:2544 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -684,27 +689,27 @@ msgstr "" " -T, --text-search-config=CFG\\\n" " デフォルトのテキスト検索設定\n" -#: initdb.c:2559 +#: initdb.c:2546 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME データベースのスーパーユーザーの名前\n" -#: initdb.c:2560 +#: initdb.c:2547 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt 新規スーパーユーザーに対してパスワード入力を促す\n" -#: initdb.c:2561 +#: initdb.c:2548 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR 先行書き込みログ用ディレクトリの位置\n" -#: initdb.c:2562 +#: initdb.c:2549 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE WALセグメントのサイズ、メガバイト単位\n" -#: initdb.c:2563 +#: initdb.c:2550 #, c-format msgid "" "\n" @@ -713,62 +718,62 @@ msgstr "" "\n" "使用頻度の低いオプション:\n" -#: initdb.c:2564 +#: initdb.c:2551 #, c-format msgid " -c, --set NAME=VALUE override default setting for server parameter\n" msgstr " -c, --set NAME=VALUE サーバーパラメータのデフォルト値を上書き設定\n" -#: initdb.c:2565 +#: initdb.c:2552 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug 多くのデバッグ用の出力を生成\n" -#: initdb.c:2566 +#: initdb.c:2553 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches debug_discard_cachesを1に設定する\n" -#: initdb.c:2567 +#: initdb.c:2554 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY 入力ファイルの場所を指定\n" -#: initdb.c:2568 +#: initdb.c:2555 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean エラー発生後のクリーンアップを行わない\n" -#: initdb.c:2569 +#: initdb.c:2556 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync 変更の安全なディスクへの書き出しを待機しない\n" -#: initdb.c:2570 +#: initdb.c:2557 #, c-format msgid " --no-sync-data-files do not sync files within database directories\n" msgstr " --no-sync-data-files データベースディレクトリ内のファイルを同期しない\n" -#: initdb.c:2571 +#: initdb.c:2558 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions 次の手順の指示を表示しない\n" -#: initdb.c:2572 +#: initdb.c:2559 #, c-format msgid " -s, --show show internal settings, then exit\n" msgstr " -s, --show 内部設定を表示して終了\n" -#: initdb.c:2573 +#: initdb.c:2560 #, c-format msgid " --sync-method=METHOD set method for syncing files to disk\n" msgstr " --sync-method=METHOD ファイルをディスクに同期させる方法を指定\n" -#: initdb.c:2574 +#: initdb.c:2561 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only データベースファイルのsyncのみを実行して終了\n" -#: initdb.c:2575 +#: initdb.c:2562 #, c-format msgid "" "\n" @@ -777,17 +782,17 @@ msgstr "" "\n" "その他のオプション:\n" -#: initdb.c:2576 +#: initdb.c:2563 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: initdb.c:2577 +#: initdb.c:2564 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: initdb.c:2578 +#: initdb.c:2565 #, c-format msgid "" "\n" @@ -797,7 +802,7 @@ msgstr "" "\n" "データディレクトリが指定されない場合、PGDATA環境変数が使用されます。\n" -#: initdb.c:2580 +#: initdb.c:2567 #, c-format msgid "" "\n" @@ -806,72 +811,72 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: initdb.c:2581 +#: initdb.c:2568 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: initdb.c:2605 +#: initdb.c:2592 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "\"%2$s\"接続では認証方式\"%1$s\"は無効です" -#: initdb.c:2619 +#: initdb.c:2606 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "パスワード認証を有効にするにはスーパーユーザーのパスワードを指定する必要があります" -#: initdb.c:2638 +#: initdb.c:2625 #, c-format msgid "no data directory specified" msgstr "データディレクトリが指定されていません" -#: initdb.c:2639 +#: initdb.c:2626 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "データベースシステムのデータを格納するディレクトリを指定する必要があります。実行時オプション -D、もしくは、PGDATA環境変数で指定してください。" -#: initdb.c:2656 +#: initdb.c:2643 #, c-format msgid "could not set environment" msgstr "環境を設定できません" -#: initdb.c:2674 +#: initdb.c:2661 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリにはありませんでした。" -#: initdb.c:2677 +#: initdb.c:2664 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした。" -#: initdb.c:2692 +#: initdb.c:2679 #, c-format msgid "input file location must be an absolute path" msgstr "入力ファイルの場所は絶対パスでなければなりません" -#: initdb.c:2709 +#: initdb.c:2696 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "データベースクラスタはロケール\"%s\"で初期化されます。\n" -#: initdb.c:2712 +#: initdb.c:2699 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "データベースクラスタは以下のロケール構成で初期化されます。\n" -#: initdb.c:2713 +#: initdb.c:2700 #, c-format msgid " locale provider: %s\n" msgstr " ロケールプロバイダ:%s\n" -#: initdb.c:2715 +#: initdb.c:2702 #, c-format msgid " default collation: %s\n" msgstr " デフォルト照合順序:%s\n" -#: initdb.c:2716 +#: initdb.c:2703 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -888,22 +893,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2746 +#: initdb.c:2733 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "ロケール\"%s\"に対して適切な符号化方式がありませんでした" -#: initdb.c:2748 +#: initdb.c:2735 #, c-format msgid "Rerun %s with the -E option." msgstr "-Eオプションを付けて%sを再実行してください。" -#: initdb.c:2749 initdb.c:3287 initdb.c:3413 initdb.c:3433 +#: initdb.c:2736 initdb.c:3274 initdb.c:3400 initdb.c:3420 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細は\"%s --help\"を実行してください。" -#: initdb.c:2761 +#: initdb.c:2748 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -913,112 +918,112 @@ msgstr "" "符号化方式として使用できません。\n" "デフォルトのデータベース符号化方式は代わりに\"%s\"に設定されます。\n" -#: initdb.c:2766 +#: initdb.c:2753 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "ロケール\"%s\"は非サポートの符号化方式\"%s\"を必要とします" -#: initdb.c:2768 +#: initdb.c:2755 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "符号化方式\"%s\"はサーバー側の符号化方式として使用できません。" -#: initdb.c:2770 +#: initdb.c:2757 #, c-format msgid "Rerun %s with a different locale selection." msgstr "別のローケルを選択して%sを再実行してください。" -#: initdb.c:2778 +#: initdb.c:2765 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "デフォルトのデータベース符号化方式はそれに対応して%sに設定されました。\n" -#: initdb.c:2794 +#: initdb.c:2781 #, c-format msgid "builtin provider locale \"%s\" requires encoding \"%s\"" msgstr "組み込みプロバイダロケール\"%s\"は符号化方式\"%s\"を必要とします" -#: initdb.c:2856 +#: initdb.c:2843 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "ロケール\"%s\"用の適切なテキスト検索設定が見つかりませんでした" -#: initdb.c:2867 +#: initdb.c:2854 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "ロケール\"%s\"に適したテキスト検索設定が不明です" -#: initdb.c:2872 +#: initdb.c:2859 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "指定したテキスト検索設定\"%s\"がロケール\"%s\"に合わない可能性があります" -#: initdb.c:2877 +#: initdb.c:2864 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "デフォルトのテキスト検索構成は %s に設定されます。\n" -#: initdb.c:2911 initdb.c:2982 +#: initdb.c:2898 initdb.c:2969 #, c-format msgid "creating directory %s ... " msgstr "ディレクトリ%sを作成しています ... " -#: initdb.c:2916 initdb.c:2987 initdb.c:3035 initdb.c:3092 +#: initdb.c:2903 initdb.c:2974 initdb.c:3022 initdb.c:3079 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" -#: initdb.c:2925 initdb.c:2997 +#: initdb.c:2912 initdb.c:2984 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "ディレクトリ%sの権限を設定しています ... " -#: initdb.c:2930 initdb.c:3002 +#: initdb.c:2917 initdb.c:2989 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を変更できませんでした: %m" -#: initdb.c:2942 initdb.c:3014 +#: initdb.c:2929 initdb.c:3001 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "ディレクトリ\"%s\"は存在しますが、空ではありません" -#: initdb.c:2946 +#: initdb.c:2933 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "新規にデータベースシステムを作成したいのであれば、ディレクトリ\"%s\"を削除あるいは空にする、または%sを\"%s\"以外の引数で実行してください。" -#: initdb.c:2954 initdb.c:3024 initdb.c:3458 +#: initdb.c:2941 initdb.c:3011 initdb.c:3445 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" -#: initdb.c:2975 +#: initdb.c:2962 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL ディレクトリの位置は、絶対パスでなければなりません" -#: initdb.c:3018 +#: initdb.c:3005 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "そこにWALを格納したい場合は、ディレクトリ\"%s\"を削除するか空にしてください。" -#: initdb.c:3028 +#: initdb.c:3015 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を作成できませんでした: %m" -#: initdb.c:3047 +#: initdb.c:3034 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "おそらくマウントポイントであることに起因した先頭がドットであるファイル、または不可視なファイルが含まれています。" -#: initdb.c:3049 +#: initdb.c:3036 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "おそらくマウントポイントであることに起因したlost+foundディレクトリが含まれています。" -#: initdb.c:3051 +#: initdb.c:3038 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -1027,65 +1032,65 @@ msgstr "" "マウントポイントであるディレクトリをデータディレクトリとして使用することはお勧めしません。\n" "この下にサブディレクトリを作成してください。" -#: initdb.c:3078 +#: initdb.c:3065 #, c-format msgid "creating subdirectories ... " msgstr "サブディレクトリを作成しています ... " -#: initdb.c:3121 +#: initdb.c:3108 msgid "performing post-bootstrap initialization ... " msgstr "ブートストラップ後の初期化を実行しています ... " -#: initdb.c:3286 +#: initdb.c:3273 #, c-format msgid "-c %s requires a value" msgstr "-c %sは値が必要です" -#: initdb.c:3311 +#: initdb.c:3298 #, c-format msgid "Running in debug mode.\n" msgstr "デバッグモードで実行しています。\n" -#: initdb.c:3315 +#: initdb.c:3302 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "no-clean モードで実行しています。失敗した状況は削除されません。\n" -#: initdb.c:3388 +#: initdb.c:3375 #, c-format msgid "unrecognized locale provider: %s" msgstr "認識できない照合順序プロバイダ: %s" -#: initdb.c:3431 +#: initdb.c:3418 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" -#: initdb.c:3438 initdb.c:3442 initdb.c:3446 +#: initdb.c:3425 initdb.c:3429 initdb.c:3433 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "ロケールプロバイダ\"%2$s\"が選択されていなければ%1$sは指定できません" -#: initdb.c:3460 initdb.c:3523 +#: initdb.c:3447 initdb.c:3510 msgid "syncing data to disk ... " msgstr "データをディスクに同期しています ... " -#: initdb.c:3468 +#: initdb.c:3455 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "パスワードプロンプトとパスワードファイルは同時に指定できません" -#: initdb.c:3479 +#: initdb.c:3466 #, c-format msgid "argument of %s must be a power of two between 1 and 1024" msgstr "%sの引数は1から1024までの間の2の累乗でなければなりません" -#: initdb.c:3492 +#: initdb.c:3479 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "スーパーユーザー名\"%s\"は許可されません; ロール名は\"pg_\"で始めることはできません" -#: initdb.c:3494 +#: initdb.c:3481 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -1096,17 +1101,17 @@ msgstr "" "このユーザーをサーバープロセスの所有者とする必要があります。\n" "\n" -#: initdb.c:3510 +#: initdb.c:3497 #, c-format msgid "Data page checksums are enabled.\n" msgstr "データページのチェックサムは有効です。\n" -#: initdb.c:3512 +#: initdb.c:3499 #, c-format msgid "Data page checksums are disabled.\n" msgstr "データベージのチェックサムは無効です。\n" -#: initdb.c:3529 +#: initdb.c:3516 #, c-format msgid "" "\n" @@ -1117,22 +1122,22 @@ msgstr "" "ディスクへの同期がスキップされました。\n" "オペレーティングシステムがクラッシュした場合データディレクトリは破損されるかもしれません。\n" -#: initdb.c:3534 +#: initdb.c:3521 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "ローカル接続に対して\"trust\"認証を有効にします " -#: initdb.c:3535 +#: initdb.c:3522 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "pg_hba.confを編集する、もしくは、次回initdbを実行する時に -A オプション、あるいは --auth-local および --auth-host オプションを使用することで変更できます。" #. translator: This is a placeholder in a shell command. -#: initdb.c:3565 +#: initdb.c:3552 msgid "logfile" msgstr "ログファイル" -#: initdb.c:3567 +#: initdb.c:3554 #, c-format msgid "" "\n" @@ -1146,3 +1151,6 @@ msgstr "" "\n" " %s\n" "\n" + +#~ msgid "selecting default \"autovacuum_worker_slots\" ... %d\n" +#~ msgstr "デフォルトの\"autovacuum_worker_slots\"を選択しています ... %d\n" diff --git a/src/bin/initdb/po/ru.po b/src/bin/initdb/po/ru.po index d97f5a0d232..0a146253ec7 100644 --- a/src/bin/initdb/po/ru.po +++ b/src/bin/initdb/po/ru.po @@ -6,13 +6,13 @@ # Sergey Burladyan , 2009. # Andrey Sudnik , 2010. # Dmitriy Olshevskiy , 2014. -# SPDX-FileCopyrightText: 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Alexander Lakhin +# SPDX-FileCopyrightText: 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: initdb (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2025-09-13 16:55+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:32+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -88,17 +88,27 @@ msgstr "ошибка в %s(): %m" msgid "out of memory" msgstr "нехватка памяти" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format diff --git a/src/bin/initdb/po/sv.po b/src/bin/initdb/po/sv.po index ac9aea5cf97..0891de4bdcb 100644 --- a/src/bin/initdb/po/sv.po +++ b/src/bin/initdb/po/sv.po @@ -1,5 +1,5 @@ # Swedish message translation file for initdb -# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. +# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026. # Magnus Hagander , 2007. # Peter Eisentraut , 2009. # Mats Erik Andersson , 2014. @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-05-11 00:51+0000\n" -"PO-Revision-Date: 2025-05-11 14:26+0200\n" +"POT-Creation-Date: 2026-08-09 17:53+0000\n" +"PO-Revision-Date: 2026-08-09 22:15+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -86,17 +86,27 @@ msgstr "%s() misslyckades: %m" msgid "out of memory" msgstr "slut på minne" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "slut på minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ogiltig storlek %zu + %zu för minnesallokering\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ogiltig storlek %zu * %zu för minnesallokering\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format diff --git a/src/bin/pg_amcheck/po/de.po b/src/bin/pg_amcheck/po/de.po index 5dd59927472..73eaca9e28c 100644 --- a/src/bin/pg_amcheck/po/de.po +++ b/src/bin/pg_amcheck/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_amcheck (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-08-28 04:23+0000\n" +"POT-Creation-Date: 2026-08-08 06:23+0000\n" "PO-Revision-Date: 2024-08-28 07:51+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -15,75 +15,85 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:276 +#: ../../../src/common/logging.c:279 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:283 +#: ../../../src/common/logging.c:286 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../../src/common/logging.c:294 +#: ../../../src/common/logging.c:297 #, c-format msgid "detail: " msgstr "Detail: " -#: ../../../src/common/logging.c:301 +#: ../../../src/common/logging.c:304 #, c-format msgid "hint: " msgstr "Tipp: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" -#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 -#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + +#: ../../common/file_utils.c:69 ../../common/file_utils.c:370 +#: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../../common/file_utils.c:76 +#: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" -#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../common/file_utils.c:123 ../../common/file_utils.c:588 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../common/file_utils.c:133 ../../common/file_utils.c:243 #: ../../fe_utils/option_utils.c:99 #, c-format msgid "this build does not support sync method \"%s\"" msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" -#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" -#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#: ../../common/file_utils.c:440 ../../common/file_utils.c:510 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../../common/file_utils.c:498 +#: ../../common/file_utils.c:520 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" @@ -156,188 +166,188 @@ msgid "processing of database \"%s\" failed: %s" msgstr "Verarbeitung der Datenbank »%s« fehlgeschlagen: %s" #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1693 pg_amcheck.c:2138 +#: pg_amcheck.c:1695 pg_amcheck.c:2155 #, c-format msgid "query failed: %s" msgstr "Anfrage fehlgeschlagen: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 +#: pg_amcheck.c:579 pg_amcheck.c:1149 pg_amcheck.c:1696 pg_amcheck.c:2156 #, c-format msgid "Query was: %s" msgstr "Anfrage war: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../fe_utils/string_utils.c:587 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"\n" msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«\n" -#: ../../fe_utils/string_utils.c:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" -#: pg_amcheck.c:403 +#: pg_amcheck.c:404 #, c-format msgid "invalid argument for option %s" msgstr "ungültiges Argument für Option %s" -#: pg_amcheck.c:409 +#: pg_amcheck.c:410 #, c-format msgid "invalid start block" msgstr "ungültiger Startblock" -#: pg_amcheck.c:411 +#: pg_amcheck.c:412 #, c-format msgid "start block out of bounds" msgstr "Startblock außerhalb des gültigen Bereichs" -#: pg_amcheck.c:418 +#: pg_amcheck.c:419 #, c-format msgid "invalid end block" msgstr "ungültiger Endblock" -#: pg_amcheck.c:420 +#: pg_amcheck.c:421 #, c-format msgid "end block out of bounds" msgstr "Endblock außerhalb des gültigen Bereichs" -#: pg_amcheck.c:446 pg_amcheck.c:468 +#: pg_amcheck.c:447 pg_amcheck.c:469 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_amcheck.c:452 +#: pg_amcheck.c:453 #, c-format msgid "end block precedes start block" msgstr "Endblock kommt vor dem Startblock" -#: pg_amcheck.c:466 +#: pg_amcheck.c:467 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_amcheck.c:486 +#: pg_amcheck.c:487 #, c-format msgid "cannot specify a database name with --all" msgstr "ein Datenbankname kann nicht mit --all angegeben werden" -#: pg_amcheck.c:492 +#: pg_amcheck.c:493 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "Datenbankname und Datenbankmuster können nicht zusammen angegeben werden" -#: pg_amcheck.c:520 +#: pg_amcheck.c:521 #, c-format msgid "no databases to check" msgstr "keine zu prüfenden Datenbanken" -#: pg_amcheck.c:576 +#: pg_amcheck.c:577 #, c-format msgid "database \"%s\": %s" msgstr "Datenbank »%s«: %s" -#: pg_amcheck.c:587 +#: pg_amcheck.c:588 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "Datenbank »%s« übersprungen: amcheck nicht installiert" -#: pg_amcheck.c:595 +#: pg_amcheck.c:597 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "in Datenbank »%s«: verwende amcheck Version »%s« in Schema »%s«" -#: pg_amcheck.c:624 +#: pg_amcheck.c:626 #, c-format msgid "option %s is not supported by amcheck version %s" msgstr "Option %s wird von amcheck Version %s nicht unterstützt" -#: pg_amcheck.c:650 +#: pg_amcheck.c:652 #, c-format msgid "no heap tables to check matching \"%s\"" msgstr "keine zu prüfenden Tabellen, die mit »%s« übereinstimmen" -#: pg_amcheck.c:653 +#: pg_amcheck.c:655 #, c-format msgid "no btree indexes to check matching \"%s\"" msgstr "keine zu prüfenden B-Tree-Indexe, die mit »%s« übereinstimmen" -#: pg_amcheck.c:656 +#: pg_amcheck.c:658 #, c-format msgid "no relations to check in schemas matching \"%s\"" msgstr "keine zu prüfenden Relationen in Schemas, die mit »%s« übereinstimmen" -#: pg_amcheck.c:659 +#: pg_amcheck.c:661 #, c-format msgid "no relations to check matching \"%s\"" msgstr "keine zu prüfenden Relationen, die mit »%s« übereinstimmen" -#: pg_amcheck.c:687 +#: pg_amcheck.c:689 #, c-format msgid "no relations to check" msgstr "keine zu prüfenden Relationen" -#: pg_amcheck.c:770 +#: pg_amcheck.c:772 #, c-format msgid "checking heap table \"%s.%s.%s\"" msgstr "prüfe Heap-Tabelle »%s.%s.%s«" -#: pg_amcheck.c:786 +#: pg_amcheck.c:788 #, c-format msgid "checking btree index \"%s.%s.%s\"" msgstr "prüfe B-Tree-Index »%s.%s.%s«" -#: pg_amcheck.c:937 +#: pg_amcheck.c:939 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "Fehler beim Senden von Befehl an Datenbank »%s«: %s" -#: pg_amcheck.c:940 +#: pg_amcheck.c:942 #, c-format msgid "Command was: %s" msgstr "Die Anweisung war: %s" -#: pg_amcheck.c:1060 +#: pg_amcheck.c:1062 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s, Attribut %s:\n" -#: pg_amcheck.c:1067 +#: pg_amcheck.c:1069 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s:\n" -#: pg_amcheck.c:1073 +#: pg_amcheck.c:1075 #, c-format msgid "heap table \"%s.%s.%s\", block %s:\n" msgstr "Heap-Tabelle »%s.%s.%s«, Block %s:\n" -#: pg_amcheck.c:1078 pg_amcheck.c:1089 +#: pg_amcheck.c:1080 pg_amcheck.c:1091 #, c-format msgid "heap table \"%s.%s.%s\":\n" msgstr "Heap-Tabelle »%s.%s.%s«:\n" -#: pg_amcheck.c:1093 pg_amcheck.c:1162 +#: pg_amcheck.c:1095 pg_amcheck.c:1164 #, c-format msgid "query was: %s\n" msgstr "Anfrage war: %s\n" -#: pg_amcheck.c:1144 +#: pg_amcheck.c:1146 #, c-format msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" msgstr "B-Tree-Index »%s.%s.%s«: B-Tree-Prüffunktion gab unerwartete Anzahl Zeilen zurück: %d" -#: pg_amcheck.c:1148 +#: pg_amcheck.c:1150 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "Sind die Versionen von %s und amcheck kompatibel?" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1160 #, c-format msgid "btree index \"%s.%s.%s\":\n" msgstr "B-Tree-Index »%s.%s.%s«:\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1185 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -346,17 +356,17 @@ msgstr "" "%s prüft Objekte in einer PostgreSQL-Datenbank auf Beschädigung.\n" "\n" -#: pg_amcheck.c:1184 +#: pg_amcheck.c:1186 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_amcheck.c:1185 +#: pg_amcheck.c:1187 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_amcheck.c:1186 +#: pg_amcheck.c:1188 #, c-format msgid "" "\n" @@ -365,77 +375,77 @@ msgstr "" "\n" "Zieloptionen:\n" -#: pg_amcheck.c:1187 +#: pg_amcheck.c:1189 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all alle Datenbanken prüfen\n" -#: pg_amcheck.c:1188 +#: pg_amcheck.c:1190 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=MUSTER übereinstimmende Datenbanken prüfen\n" -#: pg_amcheck.c:1189 +#: pg_amcheck.c:1191 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=MUSTER übereinstimmende Datenbanken NICHT prüfen\n" -#: pg_amcheck.c:1190 +#: pg_amcheck.c:1192 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=MUSTER übereinstimmende Indexe prüfen\n" -#: pg_amcheck.c:1191 +#: pg_amcheck.c:1193 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=MUSTER übereinstimmende Indexe NICHT prüfen\n" -#: pg_amcheck.c:1192 +#: pg_amcheck.c:1194 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=MUSTER übereinstimmende Relationen prüfen\n" -#: pg_amcheck.c:1193 +#: pg_amcheck.c:1195 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=MUSTER übereinstimmende Relationen NICHT prüfen\n" -#: pg_amcheck.c:1194 +#: pg_amcheck.c:1196 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=MUSTER übereinstimmende Schemas prüfen\n" -#: pg_amcheck.c:1195 +#: pg_amcheck.c:1197 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=MUSTER übereinstimmende Schemas NICHT prüfen\n" -#: pg_amcheck.c:1196 +#: pg_amcheck.c:1198 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=MUSTER übereinstimmende Tabellen prüfen\n" -#: pg_amcheck.c:1197 +#: pg_amcheck.c:1199 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=MUSTER übereinstimmende Tabellen NICHT prüfen\n" -#: pg_amcheck.c:1198 +#: pg_amcheck.c:1200 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr " --no-dependent-indexes Liste der Relationen NICHT um Indexe erweitern\n" -#: pg_amcheck.c:1199 +#: pg_amcheck.c:1201 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr " --no-dependent-toast Liste der Relationen NICHT um TOAST-Tabellen erweitern\n" -#: pg_amcheck.c:1200 +#: pg_amcheck.c:1202 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr " --no-strict-names Muster müssen NICHT mit Objekten übereinstimmen\n" -#: pg_amcheck.c:1201 +#: pg_amcheck.c:1203 #, c-format msgid "" "\n" @@ -444,32 +454,32 @@ msgstr "" "\n" "Optionen für Tabellen:\n" -#: pg_amcheck.c:1202 +#: pg_amcheck.c:1204 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers TOAST-Zeigern NICHT folgen\n" -#: pg_amcheck.c:1203 +#: pg_amcheck.c:1205 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr " --on-error-stop Prüfung nach der ersten beschädigten Seite beenden\n" -#: pg_amcheck.c:1204 +#: pg_amcheck.c:1206 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr " --skip=OPTION Blöcke mit »all-frozen« oder »all-visible« NICHT prüfen\n" -#: pg_amcheck.c:1205 +#: pg_amcheck.c:1207 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" msgstr " --startblock=BLOCK Prüfen der Tabelle(n) bei angegebener Blocknummer beginnen\n" -#: pg_amcheck.c:1206 +#: pg_amcheck.c:1208 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" msgstr " --endblock=BLOCK Tabelle(n) nur bis zur angegebenen Blocknummer prüfen\n" -#: pg_amcheck.c:1207 +#: pg_amcheck.c:1209 #, c-format msgid "" "\n" @@ -478,27 +488,27 @@ msgstr "" "\n" "Optionen für B-Tree-Indexe:\n" -#: pg_amcheck.c:1208 +#: pg_amcheck.c:1210 #, c-format msgid " --checkunique check unique constraint if index is unique\n" msgstr " --checkunique Unique-Constraint prüfen, wenn der Index Unique ist\n" -#: pg_amcheck.c:1209 +#: pg_amcheck.c:1211 #, c-format msgid " --heapallindexed check that all heap tuples are found within indexes\n" msgstr " --heapallindexed prüfen, dass alle Heap-Tupel in Indexen zu finden sind\n" -#: pg_amcheck.c:1210 +#: pg_amcheck.c:1212 #, c-format msgid " --parent-check check index parent/child relationships\n" msgstr " --parent-check Index-Eltern/Kind-Beziehungen prüfen\n" -#: pg_amcheck.c:1211 +#: pg_amcheck.c:1213 #, c-format msgid " --rootdescend search from root page to refind tuples\n" msgstr " --rootdescend Tupel erneut von der Wurzelseite aus suchen\n" -#: pg_amcheck.c:1212 +#: pg_amcheck.c:1214 #, c-format msgid "" "\n" @@ -507,37 +517,37 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: pg_amcheck.c:1213 +#: pg_amcheck.c:1215 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: pg_amcheck.c:1214 +#: pg_amcheck.c:1216 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: pg_amcheck.c:1215 +#: pg_amcheck.c:1217 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: pg_amcheck.c:1216 +#: pg_amcheck.c:1218 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: pg_amcheck.c:1217 +#: pg_amcheck.c:1219 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: pg_amcheck.c:1218 +#: pg_amcheck.c:1220 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" -#: pg_amcheck.c:1219 +#: pg_amcheck.c:1221 #, c-format msgid "" "\n" @@ -546,46 +556,46 @@ msgstr "" "\n" "Weitere Optionen:\n" -#: pg_amcheck.c:1220 +#: pg_amcheck.c:1222 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo zeige die Befehle, die an den Server\n" " gesendet werden\n" -#: pg_amcheck.c:1221 +#: pg_amcheck.c:1223 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr "" " -j, --jobs=NUM so viele parallele Verbindungen zum Server\n" " verwenden\n" -#: pg_amcheck.c:1222 +#: pg_amcheck.c:1224 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress Fortschrittsinformationen zeigen\n" -#: pg_amcheck.c:1223 +#: pg_amcheck.c:1225 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: pg_amcheck.c:1224 +#: pg_amcheck.c:1226 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_amcheck.c:1225 +#: pg_amcheck.c:1227 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing fehlende Erweiterungen installieren\n" -#: pg_amcheck.c:1226 +#: pg_amcheck.c:1228 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_amcheck.c:1228 +#: pg_amcheck.c:1230 #, c-format msgid "" "\n" @@ -594,52 +604,52 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_amcheck.c:1229 +#: pg_amcheck.c:1231 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_amcheck.c:1282 +#: pg_amcheck.c:1284 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) %*s" -#: pg_amcheck.c:1293 +#: pg_amcheck.c:1295 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1308 +#: pg_amcheck.c:1310 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%)" -#: pg_amcheck.c:1367 pg_amcheck.c:1400 +#: pg_amcheck.c:1369 pg_amcheck.c:1402 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" -#: pg_amcheck.c:1445 +#: pg_amcheck.c:1447 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "falscher Relationsname (zu viele Namensteile): %s" -#: pg_amcheck.c:1598 pg_amcheck.c:1737 +#: pg_amcheck.c:1600 pg_amcheck.c:1739 #, c-format msgid "including database \"%s\"" msgstr "Datenbank »%s« einbezogen" -#: pg_amcheck.c:1719 +#: pg_amcheck.c:1721 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "interner Fehler: unerwartete pattern_id %d für Datenbank empfangen" -#: pg_amcheck.c:1721 +#: pg_amcheck.c:1723 #, c-format msgid "no connectable databases to check matching \"%s\"" msgstr "keine Datenbanken, mit denen verbunden werden kann und die mit »%s« übereinstimmen" -#: pg_amcheck.c:2179 +#: pg_amcheck.c:2196 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "interner Fehler: unerwartete pattern_id %d für Relation empfangen" diff --git a/src/bin/pg_amcheck/po/ru.po b/src/bin/pg_amcheck/po/ru.po index 4d7da795e2a..47cbf2bef34 100644 --- a/src/bin/pg_amcheck/po/ru.po +++ b/src/bin/pg_amcheck/po/ru.po @@ -1,10 +1,10 @@ -# Alexander Lakhin , 2021, 2022, 2024. +# SPDX-FileCopyrightText: 2021, 2022, 2024, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_amcheck (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2024-09-05 08:23+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:46+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -32,17 +32,27 @@ msgstr "подробности: " msgid "hint: " msgstr "подсказка: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format diff --git a/src/bin/pg_archivecleanup/po/de.po b/src/bin/pg_archivecleanup/po/de.po index 78f867ca0fd..545ce79246e 100644 --- a/src/bin/pg_archivecleanup/po/de.po +++ b/src/bin/pg_archivecleanup/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_archivecleanup (PostgreSQL) 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-03-06 09:23+0000\n" +"POT-Creation-Date: 2026-08-08 06:23+0000\n" "PO-Revision-Date: 2025-03-06 12:11+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -36,17 +36,27 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: pg_archivecleanup.c:69 #, c-format msgid "archive location \"%s\" does not exist" diff --git a/src/bin/pg_archivecleanup/po/ru.po b/src/bin/pg_archivecleanup/po/ru.po index ccefe2163c4..521abfd8290 100644 --- a/src/bin/pg_archivecleanup/po/ru.po +++ b/src/bin/pg_archivecleanup/po/ru.po @@ -1,13 +1,13 @@ # Russian message translation file for pg_archivecleanup # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# SPDX-FileCopyrightText: 2017, 2019, 2020, 2022, 2024, 2025 Alexander Lakhin +# SPDX-FileCopyrightText: 2017, 2019, 2020, 2022, 2024, 2025, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_archivecleanup (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2025-09-13 21:08+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:46+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -37,17 +37,27 @@ msgstr "подробности: " msgid "hint: " msgstr "подсказка: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: pg_archivecleanup.c:69 #, c-format msgid "archive location \"%s\" does not exist" diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c index 51d12aa7f6f..42a073e921f 100644 --- a/src/bin/pg_basebackup/pg_createsubscriber.c +++ b/src/bin/pg_basebackup/pg_createsubscriber.c @@ -115,7 +115,7 @@ static void wait_for_end_recovery(const char *conninfo, const struct CreateSubscriberOptions *opt); static void create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo); static void drop_publication(PGconn *conn, const char *pubname, - const char *dbname, bool *made_publication); + const char *dbname); static void check_and_drop_publications(PGconn *conn, struct LogicalRepInfo *dbinfo); static void create_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo); static void set_replication_progress(PGconn *conn, const struct LogicalRepInfo *dbinfo, @@ -203,8 +203,7 @@ cleanup_objects_atexit(void) if (conn != NULL) { if (dbinfo->made_publication) - drop_publication(conn, dbinfo->pubname, dbinfo->dbname, - &dbinfo->made_publication); + drop_publication(conn, dbinfo->pubname, dbinfo->dbname); if (dbinfo->made_replslot) drop_replication_slot(conn, dbinfo, dbinfo->replslotname); disconnect_database(conn, false); @@ -1465,7 +1464,6 @@ drop_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo, { pg_log_error("could not drop replication slot \"%s\" in database \"%s\": %s", slot_name, dbinfo->dbname, PQresultErrorMessage(res)); - dbinfo->made_replslot = false; /* don't try again. */ } PQclear(res); @@ -1705,8 +1703,7 @@ create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo) * Drop the specified publication in the given database. */ static void -drop_publication(PGconn *conn, const char *pubname, const char *dbname, - bool *made_publication) +drop_publication(PGconn *conn, const char *pubname, const char *dbname) { PQExpBuffer str = createPQExpBuffer(); PGresult *res; @@ -1736,7 +1733,6 @@ drop_publication(PGconn *conn, const char *pubname, const char *dbname, { pg_log_error("could not drop publication \"%s\" in database \"%s\": %s", pubname, dbname, PQresultErrorMessage(res)); - *made_publication = false; /* don't try again. */ /* * Don't disconnect and exit here. This routine is used by primary @@ -1786,8 +1782,7 @@ check_and_drop_publications(PGconn *conn, struct LogicalRepInfo *dbinfo) /* Drop each publication */ for (int i = 0; i < PQntuples(res); i++) - drop_publication(conn, PQgetvalue(res, i, 0), dbinfo->dbname, - &dbinfo->made_publication); + drop_publication(conn, PQgetvalue(res, i, 0), dbinfo->dbname); PQclear(res); } @@ -1797,8 +1792,7 @@ check_and_drop_publications(PGconn *conn, struct LogicalRepInfo *dbinfo) * those to provide necessary information to the user. */ if (!drop_all_pubs || dry_run) - drop_publication(conn, dbinfo->pubname, dbinfo->dbname, - &dbinfo->made_publication); + drop_publication(conn, dbinfo->pubname, dbinfo->dbname); } /* diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c index fb7a6a1d05d..113a43b81ad 100644 --- a/src/bin/pg_basebackup/pg_recvlogical.c +++ b/src/bin/pg_basebackup/pg_recvlogical.c @@ -244,8 +244,9 @@ StreamLogicalLog(void) /* Initiate the replication stream at specified location */ query = createPQExpBuffer(); - appendPQExpBuffer(query, "START_REPLICATION SLOT \"%s\" LOGICAL %X/%X", - replication_slot, LSN_FORMAT_ARGS(startpos)); + appendPQExpBufferStr(query, "START_REPLICATION SLOT "); + AppendQuotedIdentifier(query, replication_slot); + appendPQExpBuffer(query, " LOGICAL %X/%X", LSN_FORMAT_ARGS(startpos)); /* print options if there are any */ if (noptions) @@ -258,11 +259,14 @@ StreamLogicalLog(void) appendPQExpBufferStr(query, ", "); /* write option name */ - appendPQExpBuffer(query, "\"%s\"", options[(i * 2)]); + AppendQuotedIdentifier(query, options[i * 2]); /* write option value if specified */ - if (options[(i * 2) + 1] != NULL) - appendPQExpBuffer(query, " '%s'", options[(i * 2) + 1]); + if (options[i * 2 + 1] != NULL) + { + appendPQExpBufferChar(query, ' '); + AppendQuotedLiteral(query, options[i * 2 + 1]); + } } if (noptions) @@ -342,7 +346,7 @@ StreamLogicalLog(void) outfd = fileno(stdout); else outfd = open(outfile, O_CREAT | O_APPEND | O_WRONLY | PG_BINARY, - S_IRUSR | S_IWUSR); + pg_file_create_mode); if (outfd == -1) { pg_log_error("could not open log file \"%s\": %m", outfile); diff --git a/src/bin/pg_basebackup/po/de.po b/src/bin/pg_basebackup/po/de.po index 0c10f397abc..1159b93c92a 100644 --- a/src/bin/pg_basebackup/po/de.po +++ b/src/bin/pg_basebackup/po/de.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-05 12:11+0000\n" -"PO-Revision-Date: 2026-05-06 15:44+0200\n" +"POT-Creation-Date: 2026-08-08 06:20+0000\n" +"PO-Revision-Date: 2026-08-08 09:42+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -108,8 +108,8 @@ msgid "could not read file \"%s\": read %d of %zu" msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 -#: ../../fe_utils/astreamer_file.c:141 ../../fe_utils/astreamer_file.c:270 -#: pg_recvlogical.c:653 +#: ../../fe_utils/astreamer_file.c:141 ../../fe_utils/astreamer_file.c:282 +#: pg_recvlogical.c:657 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" @@ -151,24 +151,34 @@ msgstr "konnte Datei »%s« nicht schreiben: %m" msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" #: ../../common/file_utils.c:123 ../../common/file_utils.c:588 -#: pg_receivewal.c:319 pg_recvlogical.c:354 +#: pg_receivewal.c:319 pg_recvlogical.c:358 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" @@ -226,40 +236,50 @@ msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu msgid "could not get exit code from subprocess: error code %lu" msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" -#: ../../fe_utils/astreamer_file.c:96 ../../fe_utils/astreamer_file.c:366 +#: ../../fe_utils/astreamer_file.c:96 ../../fe_utils/astreamer_file.c:378 #: ../../fe_utils/recovery_gen.c:153 pg_basebackup.c:1498 pg_basebackup.c:1707 #, c-format msgid "could not create file \"%s\": %m" msgstr "konnte Datei »%s« nicht erstellen: %m" -#: ../../fe_utils/astreamer_file.c:124 ../../fe_utils/astreamer_file.c:261 +#: ../../fe_utils/astreamer_file.c:124 ../../fe_utils/astreamer_file.c:273 #: ../../fe_utils/recovery_gen.c:144 pg_basebackup.c:1434 pg_basebackup.c:1728 #, c-format msgid "could not write to file \"%s\": %m" msgstr "konnte nicht in Datei »%s« schreiben: %m" -#: ../../fe_utils/astreamer_file.c:280 +#: ../../fe_utils/astreamer_file.c:222 ../../fe_utils/astreamer_tar.c:309 +#, c-format +msgid "tar member has unsafe path name: \"%s\"" +msgstr "Tar-Mitglied hat unsicheren Pfadnamen: »%s«" + +#: ../../fe_utils/astreamer_file.c:251 +#, c-format +msgid "link target has unsafe path name: \"%s\"" +msgstr "Verknüpfungsziel hat unsicheren Pfadnamen: »%s«" + +#: ../../fe_utils/astreamer_file.c:292 #, c-format msgid "unexpected state while extracting archive" msgstr "unerwarteter Zustand beim Extrahieren des Archivs" -#: ../../fe_utils/astreamer_file.c:326 pg_basebackup.c:699 pg_basebackup.c:713 +#: ../../fe_utils/astreamer_file.c:338 pg_basebackup.c:699 pg_basebackup.c:713 #: pg_basebackup.c:758 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: ../../fe_utils/astreamer_file.c:331 +#: ../../fe_utils/astreamer_file.c:343 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m" -#: ../../fe_utils/astreamer_file.c:350 +#: ../../fe_utils/astreamer_file.c:362 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "konnte symbolische Verknüpfung von »%s« nach »%s« nicht erzeugen: %m" -#: ../../fe_utils/astreamer_file.c:370 +#: ../../fe_utils/astreamer_file.c:382 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "konnte Zugriffsrechte von Datei »%s« nicht setzen: %m" @@ -346,12 +366,12 @@ msgstr "Eingabedatei scheint kein gültiges Tar-Archiv zu sein" msgid "tar member has empty name" msgstr "Tar-Mitglied hat leeren Namen" -#: ../../fe_utils/astreamer_tar.c:328 +#: ../../fe_utils/astreamer_tar.c:332 #, c-format msgid "pax extensions to tar format are not supported" msgstr "PAX-Erweiterungen des Tar-Formats werden nicht unterstützt" -#: ../../fe_utils/astreamer_tar.c:357 +#: ../../fe_utils/astreamer_tar.c:361 #, c-format msgid "COPY stream ended before last file was finished" msgstr "COPY-Strom endete vor dem Ende der letzten Datei" @@ -514,13 +534,13 @@ msgstr "" "%s erzeugt eine Basissicherung eines laufenden PostgreSQL-Servers.\n" "\n" -#: pg_basebackup.c:394 pg_createsubscriber.c:246 pg_receivewal.c:79 +#: pg_basebackup.c:394 pg_createsubscriber.c:245 pg_receivewal.c:79 #: pg_recvlogical.c:85 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_basebackup.c:395 pg_createsubscriber.c:247 pg_receivewal.c:80 +#: pg_basebackup.c:395 pg_createsubscriber.c:246 pg_receivewal.c:80 #: pg_recvlogical.c:86 #, c-format msgid " %s [OPTION]...\n" @@ -789,7 +809,7 @@ msgstr " -w, --no-password niemals nach Passwort fragen\n" msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n" -#: pg_basebackup.c:448 pg_createsubscriber.c:270 pg_receivewal.c:106 +#: pg_basebackup.c:448 pg_createsubscriber.c:269 pg_receivewal.c:106 #: pg_recvlogical.c:120 #, c-format msgid "" @@ -799,7 +819,7 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_basebackup.c:449 pg_createsubscriber.c:271 pg_receivewal.c:107 +#: pg_basebackup.c:449 pg_createsubscriber.c:270 pg_receivewal.c:107 #: pg_recvlogical.c:121 #, c-format msgid "%s home page: <%s>\n" @@ -851,7 +871,7 @@ msgstr "konnte Hintergrund-Thread nicht erzeugen: %m" msgid "directory \"%s\" exists but is not empty" msgstr "Verzeichnis »%s« existiert aber ist nicht leer" -#: pg_basebackup.c:783 pg_createsubscriber.c:420 +#: pg_basebackup.c:783 pg_createsubscriber.c:419 #, c-format msgid "could not access directory \"%s\": %m" msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" @@ -912,8 +932,8 @@ msgstr "Transferrate »%s« ist außerhalb des gültigen Bereichs" msgid "could not get COPY data stream: %s" msgstr "konnte COPY-Datenstrom nicht empfangen: %s" -#: pg_basebackup.c:1040 pg_recvlogical.c:451 pg_recvlogical.c:627 -#: receivelog.c:980 +#: pg_basebackup.c:1040 pg_recvlogical.c:455 pg_recvlogical.c:631 +#: receivelog.c:986 #, c-format msgid "could not read COPY data: %s" msgstr "konnte COPY-Daten nicht lesen: %s" @@ -998,9 +1018,9 @@ msgstr "Verwenden Sie -X none oder -X fetch, um Log-Streaming abzuschalten." msgid "server does not support incremental backup" msgstr "Server unterstützt kein inkrementelles Backup" -#: pg_basebackup.c:1851 pg_basebackup.c:2009 pg_recvlogical.c:274 -#: receivelog.c:542 receivelog.c:581 streamutil.c:296 streamutil.c:370 -#: streamutil.c:422 streamutil.c:510 streamutil.c:667 streamutil.c:712 +#: pg_basebackup.c:1851 pg_basebackup.c:2009 pg_recvlogical.c:278 +#: receivelog.c:541 receivelog.c:587 streamutil.c:296 streamutil.c:370 +#: streamutil.c:422 streamutil.c:511 streamutil.c:672 streamutil.c:717 #, c-format msgid "could not send replication command \"%s\": %s" msgstr "konnte Replikationsbefehl »%s« nicht senden: %s" @@ -1191,21 +1211,21 @@ msgstr "ungültige Option »%s« für --wal-method, muss »fetch«, »stream« o #: pg_basebackup.c:2713 pg_basebackup.c:2725 pg_basebackup.c:2737 #: pg_basebackup.c:2745 pg_basebackup.c:2758 pg_basebackup.c:2764 #: pg_basebackup.c:2773 pg_basebackup.c:2785 pg_basebackup.c:2796 -#: pg_basebackup.c:2804 pg_createsubscriber.c:2238 pg_createsubscriber.c:2261 -#: pg_createsubscriber.c:2271 pg_createsubscriber.c:2279 -#: pg_createsubscriber.c:2307 pg_createsubscriber.c:2350 pg_receivewal.c:748 +#: pg_basebackup.c:2804 pg_createsubscriber.c:2237 pg_createsubscriber.c:2260 +#: pg_createsubscriber.c:2270 pg_createsubscriber.c:2278 +#: pg_createsubscriber.c:2306 pg_createsubscriber.c:2349 pg_receivewal.c:748 #: pg_receivewal.c:760 pg_receivewal.c:767 pg_receivewal.c:776 -#: pg_receivewal.c:783 pg_receivewal.c:793 pg_recvlogical.c:861 -#: pg_recvlogical.c:873 pg_recvlogical.c:883 pg_recvlogical.c:890 -#: pg_recvlogical.c:897 pg_recvlogical.c:904 pg_recvlogical.c:911 -#: pg_recvlogical.c:918 pg_recvlogical.c:925 pg_recvlogical.c:934 -#: pg_recvlogical.c:941 +#: pg_receivewal.c:783 pg_receivewal.c:793 pg_recvlogical.c:865 +#: pg_recvlogical.c:877 pg_recvlogical.c:887 pg_recvlogical.c:894 +#: pg_recvlogical.c:901 pg_recvlogical.c:908 pg_recvlogical.c:915 +#: pg_recvlogical.c:922 pg_recvlogical.c:929 pg_recvlogical.c:938 +#: pg_recvlogical.c:945 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_basebackup.c:2585 pg_createsubscriber.c:2269 pg_receivewal.c:758 -#: pg_recvlogical.c:871 +#: pg_basebackup.c:2585 pg_createsubscriber.c:2268 pg_receivewal.c:758 +#: pg_recvlogical.c:875 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" @@ -1307,27 +1327,27 @@ msgstr "fehlgeschlagen am Ende der Wiederherstellung" msgid "The target server cannot be used as a physical replica anymore. You must recreate the physical replica before continuing." msgstr "Der Zielserver kann nicht mehr als physischer Standby verwendet werden. Sie müssen den physischen Standby neu erzeugen bevor fortgesetzt werden kann." -#: pg_createsubscriber.c:221 +#: pg_createsubscriber.c:220 #, c-format msgid "publication \"%s\" created in database \"%s\" on primary was left behind" msgstr "Publikation »%s« erzeugt in Datenbank »%s« auf dem Primärserver wurde zurückgelassen" -#: pg_createsubscriber.c:224 +#: pg_createsubscriber.c:223 #, c-format msgid "Drop this publication before trying again." msgstr "Löschen Sie diese Publikation, bevor Sie erneut versuchen." -#: pg_createsubscriber.c:228 +#: pg_createsubscriber.c:227 #, c-format msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" msgstr "Replikations-Slot »%s« erzeugt in Datenbank »%s« auf dem Primärserver wurde zurückgelassen" -#: pg_createsubscriber.c:231 pg_createsubscriber.c:1324 +#: pg_createsubscriber.c:230 pg_createsubscriber.c:1328 #, c-format msgid "Drop this replication slot soon to avoid retention of WAL files." msgstr "Löschen Sie diesen Replikations-Slot bald, um Zurückhalten von WAL-Datein zu vermeiden." -#: pg_createsubscriber.c:244 +#: pg_createsubscriber.c:243 #, c-format msgid "" "%s creates a new logical replica from a standby server.\n" @@ -1336,7 +1356,7 @@ msgstr "" "%s erzeugt eine neue logische Replik aus einem Standby-Server.\n" "\n" -#: pg_createsubscriber.c:248 pg_receivewal.c:81 pg_recvlogical.c:91 +#: pg_createsubscriber.c:247 pg_receivewal.c:81 pg_recvlogical.c:91 #, c-format msgid "" "\n" @@ -1345,7 +1365,7 @@ msgstr "" "\n" "Optionen:\n" -#: pg_createsubscriber.c:249 +#: pg_createsubscriber.c:248 #, c-format msgid "" " -a, --all create subscriptions for all databases except template\n" @@ -1355,57 +1375,57 @@ msgstr "" " für Template-Datenbanken und Datenbanken, die keine\n" " Verbindungen zulassen\n" -#: pg_createsubscriber.c:251 +#: pg_createsubscriber.c:250 #, c-format msgid " -d, --database=DBNAME database in which to create a subscription\n" msgstr " -d, --database=DBNAME Datenbank, in der eine Subskription erzeugt werden soll\n" -#: pg_createsubscriber.c:252 +#: pg_createsubscriber.c:251 #, c-format msgid " -D, --pgdata=DATADIR location for the subscriber data directory\n" msgstr " -D, --pgdata=DATENVERZ Datenverzeichnis für den Subskriptionsserver\n" -#: pg_createsubscriber.c:253 +#: pg_createsubscriber.c:252 #, c-format msgid " -n, --dry-run dry run, just show what would be done\n" msgstr " -n, --dry-run Probelauf; nur zeigen, was gemacht werden würde\n" -#: pg_createsubscriber.c:254 +#: pg_createsubscriber.c:253 #, c-format msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" msgstr " -p, --subscriber-port=PORT Portnummer für den Subskriptionsserver (Standard %s)\n" -#: pg_createsubscriber.c:255 +#: pg_createsubscriber.c:254 #, c-format msgid " -P, --publisher-server=CONNSTR publisher connection string\n" msgstr " -P, --publisher-server=VERBDG Verbindungsparameter des Publikationsservers\n" -#: pg_createsubscriber.c:256 +#: pg_createsubscriber.c:255 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr " -s, --socketdir=VERZ Verzeichnis für Socket (Standard: aktuelles Verz.)\n" -#: pg_createsubscriber.c:257 +#: pg_createsubscriber.c:256 #, c-format msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" msgstr " -t, --recovery-timeout=SEK Sekunden zu warten auf Ende der Wiederherstellung\n" -#: pg_createsubscriber.c:258 +#: pg_createsubscriber.c:257 #, c-format msgid " -T, --enable-two-phase enable two-phase commit for all subscriptions\n" msgstr " -T, --enable-two-phase Zwei-Phasen-Commit für alle Subskriptionen einschalten\n" -#: pg_createsubscriber.c:259 +#: pg_createsubscriber.c:258 #, c-format msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" msgstr " -U, --subscriber-username=NAME Benutzername für Subskriptionsserver-Verbindung\n" -#: pg_createsubscriber.c:260 +#: pg_createsubscriber.c:259 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose »Verbose«-Modus\n" -#: pg_createsubscriber.c:261 +#: pg_createsubscriber.c:260 #, c-format msgid "" " --clean=OBJECTTYPE drop all objects of the specified type from specified\n" @@ -1415,7 +1435,7 @@ msgstr "" " Datenbanken auf dem Subskriptionsserver löschen;\n" " akzeptiert: »%s«\n" -#: pg_createsubscriber.c:263 +#: pg_createsubscriber.c:262 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -1424,649 +1444,649 @@ msgstr "" " --config-file=DATEINAME angegebene Serverkonfigurationsdatei zum\n" " Starten des Ziel-Clusters verwenden\n" -#: pg_createsubscriber.c:265 +#: pg_createsubscriber.c:264 #, c-format msgid " --publication=NAME publication name\n" msgstr " --publication=NAME Publikationsname\n" -#: pg_createsubscriber.c:266 +#: pg_createsubscriber.c:265 #, c-format msgid " --replication-slot=NAME replication slot name\n" msgstr " --replication-slot=NAME Replikations-Slot-Name\n" -#: pg_createsubscriber.c:267 +#: pg_createsubscriber.c:266 #, c-format msgid " --subscription=NAME subscription name\n" msgstr " --subscription=NAME Subskriptionsname\n" -#: pg_createsubscriber.c:268 +#: pg_createsubscriber.c:267 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_createsubscriber.c:269 +#: pg_createsubscriber.c:268 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_createsubscriber.c:312 +#: pg_createsubscriber.c:311 #, c-format msgid "could not parse connection string: %s" msgstr "konnte Verbindungsparameter nicht interpretieren: %s" -#: pg_createsubscriber.c:389 +#: pg_createsubscriber.c:388 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: pg_createsubscriber.c:392 +#: pg_createsubscriber.c:391 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" -#: pg_createsubscriber.c:412 +#: pg_createsubscriber.c:411 #, c-format msgid "checking if directory \"%s\" is a cluster data directory" msgstr "prüfe ob Verzeichnis »%s« ein Cluster-Datenverzeichnis ist" -#: pg_createsubscriber.c:418 +#: pg_createsubscriber.c:417 #, c-format msgid "data directory \"%s\" does not exist" msgstr "Datenverzeichnis »%s« existiert nicht" -#: pg_createsubscriber.c:426 +#: pg_createsubscriber.c:425 #, c-format msgid "directory \"%s\" is not a database cluster directory" msgstr "Verzeichnis »%s« ist kein Datenbankclusterverzeichnis" -#: pg_createsubscriber.c:544 +#: pg_createsubscriber.c:543 #, c-format msgid "connection to database failed: %s" msgstr "Verbindung zur Datenbank fehlgeschlagen: %s" -#: pg_createsubscriber.c:557 streamutil.c:230 +#: pg_createsubscriber.c:556 streamutil.c:230 #, c-format msgid "could not clear \"search_path\": %s" msgstr "konnte »search_path« nicht auf leer setzen: %s" -#: pg_createsubscriber.c:597 +#: pg_createsubscriber.c:596 #, c-format msgid "getting system identifier from publisher" msgstr "hole Systemidentifikator vom Publikationsserver" -#: pg_createsubscriber.c:604 +#: pg_createsubscriber.c:603 #, c-format msgid "could not get system identifier: %s" msgstr "konnte Systemidentifikator nicht ermitteln: %s" -#: pg_createsubscriber.c:610 +#: pg_createsubscriber.c:609 #, c-format msgid "could not get system identifier: got %d rows, expected %d row" msgstr "konnte Systemidentifikator nicht ermitteln: %d Zeilen erhalten, %d Zeile erwartet" -#: pg_createsubscriber.c:617 +#: pg_createsubscriber.c:616 #, c-format msgid "system identifier is % on publisher" msgstr "Systemidentifikator ist % auf dem Publikationsserver" -#: pg_createsubscriber.c:637 +#: pg_createsubscriber.c:636 #, c-format msgid "getting system identifier from subscriber" msgstr "hole Systemidentifikator vom Subskriptionsserver" -#: pg_createsubscriber.c:641 pg_createsubscriber.c:670 +#: pg_createsubscriber.c:640 pg_createsubscriber.c:669 #, c-format msgid "control file appears to be corrupt" msgstr "Kontrolldatei scheint kaputt zu sein" -#: pg_createsubscriber.c:645 pg_createsubscriber.c:688 +#: pg_createsubscriber.c:644 pg_createsubscriber.c:687 #, c-format msgid "system identifier is % on subscriber" msgstr "Systemidentifikator ist % auf dem Subskriptionsserver" -#: pg_createsubscriber.c:666 +#: pg_createsubscriber.c:665 #, c-format msgid "modifying system identifier of subscriber" msgstr "ändere Systemidentifikator auf dem Subskriptionsserver" -#: pg_createsubscriber.c:683 +#: pg_createsubscriber.c:682 #, c-format msgid "dry-run: would set system identifier to % on subscriber" msgstr "Probelauf: Systemidentifikator würde auf dem Subskriptionsserver auf % gesetzt werden" -#: pg_createsubscriber.c:693 +#: pg_createsubscriber.c:692 #, c-format msgid "dry-run: would run pg_resetwal on the subscriber" msgstr "Probelauf: würde pg_resetwal auf dem Subskriptionsserver ausführen" -#: pg_createsubscriber.c:695 +#: pg_createsubscriber.c:694 #, c-format msgid "running pg_resetwal on the subscriber" msgstr "führe pg_resetwal auf dem Subskriptionsserver aus" -#: pg_createsubscriber.c:707 +#: pg_createsubscriber.c:706 #, c-format msgid "successfully reset WAL on the subscriber" msgstr "WAL auf dem Subskriptionsserver erfolgreich zurückgesetzt" -#: pg_createsubscriber.c:709 +#: pg_createsubscriber.c:708 #, c-format msgid "could not reset WAL on subscriber: %s" msgstr "konnte WAL auf dem Subskriptionsserver nicht zurücksetzen: %s" -#: pg_createsubscriber.c:733 +#: pg_createsubscriber.c:732 #, c-format msgid "could not obtain database OID: %s" msgstr "konnte Datenbank-OID nicht ermitteln: %s" -#: pg_createsubscriber.c:740 +#: pg_createsubscriber.c:739 #, c-format msgid "could not obtain database OID: got %d rows, expected %d row" msgstr "konnte Datenbank-OID nicht ermitteln: %d Zeilen erhalten, %d Zeile erwartet" -#: pg_createsubscriber.c:812 +#: pg_createsubscriber.c:811 #, c-format msgid "create replication slot \"%s\" on publisher" msgstr "erzeuge Replikations-Slot »%s« auf dem Publikationsserver" -#: pg_createsubscriber.c:832 +#: pg_createsubscriber.c:831 #, c-format msgid "could not write an additional WAL record: %s" msgstr "konnte zusätzlichen WAL-Datensatz nicht schreiben: %s" -#: pg_createsubscriber.c:858 +#: pg_createsubscriber.c:857 #, c-format msgid "could not obtain recovery progress: %s" msgstr "konnte Recovery-Fortschritt nicht ermitteln: %s" -#: pg_createsubscriber.c:891 +#: pg_createsubscriber.c:890 #, c-format msgid "checking settings on publisher" msgstr "prüfe Einstellungen auf dem Publikationsserver" -#: pg_createsubscriber.c:901 +#: pg_createsubscriber.c:900 #, c-format msgid "primary server cannot be in recovery" msgstr "Primärserver kann nicht im Wiederherstellungsmodus sein" -#: pg_createsubscriber.c:927 +#: pg_createsubscriber.c:926 #, c-format msgid "could not obtain publisher settings: %s" msgstr "konnte Einstellungen des Publikationsservers nicht ermitteln: %s" -#: pg_createsubscriber.c:956 +#: pg_createsubscriber.c:955 #, c-format msgid "publisher requires \"wal_level\" >= \"logical\"" msgstr "Publikationsserver benötigt »wal_level« >= »logical«" -#: pg_createsubscriber.c:962 +#: pg_createsubscriber.c:961 #, c-format msgid "publisher requires %d replication slots, but only %d remain" msgstr "Publikationsserver benötigt %d Replikations-Slots, aber nur %d verbleiben" -#: pg_createsubscriber.c:964 pg_createsubscriber.c:973 -#: pg_createsubscriber.c:1083 pg_createsubscriber.c:1092 -#: pg_createsubscriber.c:1101 +#: pg_createsubscriber.c:963 pg_createsubscriber.c:972 +#: pg_createsubscriber.c:1082 pg_createsubscriber.c:1091 +#: pg_createsubscriber.c:1100 #, c-format msgid "Increase the configuration parameter \"%s\" to at least %d." msgstr "Erhöhen Sie den Konfigurationsparameter »%s« auf mindestens %d." -#: pg_createsubscriber.c:971 +#: pg_createsubscriber.c:970 #, c-format msgid "publisher requires %d WAL sender processes, but only %d remain" msgstr "Publikationsserver benötigt %d WAL-Sender-Prozesse, aber nur %d verbleiben" -#: pg_createsubscriber.c:980 +#: pg_createsubscriber.c:979 #, c-format msgid "two_phase option will not be enabled for replication slots" msgstr "Option »two_phase« wird für Replikations-Slots nicht aktiviert" -#: pg_createsubscriber.c:981 +#: pg_createsubscriber.c:980 #, c-format msgid "Subscriptions will be created with the two_phase option disabled. Prepared transactions will be replicated at COMMIT PREPARED." msgstr "Subskriptionen werden mit der Option »two_phase« ausgeschaltet erzeugt. Vorbereitete Transaktionen werden bei COMMIT PREPARED repliziert werden." -#: pg_createsubscriber.c:983 +#: pg_createsubscriber.c:982 #, c-format msgid "You can use the command-line option --enable-two-phase to enable two_phase." msgstr "Sie können die Kommandozeilenoption --enable-two-phase verwenden, um two_phase einzuschalten." -#: pg_createsubscriber.c:993 +#: pg_createsubscriber.c:992 #, c-format msgid "required WAL could be removed from the publisher" msgstr "benötigtes WAL könnte vom Publikationsserver entfernt werden" -#: pg_createsubscriber.c:994 +#: pg_createsubscriber.c:993 #, c-format msgid "Set the configuration parameter \"%s\" to -1 to ensure that required WAL files are not prematurely removed." msgstr "Setzen Sie den Konfigurationsparameter »%s« auf -1, um sicherzustellen, dass die benötigten WAL-Dateien nicht vorzeitig entfernt werden." -#: pg_createsubscriber.c:1026 +#: pg_createsubscriber.c:1025 #, c-format msgid "checking settings on subscriber" msgstr "prüfe Einstellungen auf Subskriptionsserver" -#: pg_createsubscriber.c:1033 +#: pg_createsubscriber.c:1032 #, c-format msgid "target server must be a standby" msgstr "Zielserver muss ein Standby sein" -#: pg_createsubscriber.c:1057 +#: pg_createsubscriber.c:1056 #, c-format msgid "could not obtain subscriber settings: %s" msgstr "konnte Einstellungen des Subskriptionsservers nicht ermitteln: %s" -#: pg_createsubscriber.c:1081 +#: pg_createsubscriber.c:1080 #, c-format msgid "subscriber requires %d active replication origins, but only %d remain" msgstr "Subskriptionsserver benötigt %d Slots für aktive Replication-Origins, aber nur %d verbleiben" -#: pg_createsubscriber.c:1090 +#: pg_createsubscriber.c:1089 #, c-format msgid "subscriber requires %d logical replication workers, but only %d remain" msgstr "Subskriptionsserver benötigt %d Arbeitsprozesse für logische Replikation, aber nur %d verbleiben" -#: pg_createsubscriber.c:1099 +#: pg_createsubscriber.c:1098 #, c-format msgid "subscriber requires %d worker processes, but only %d remain" msgstr "Subskriptionsserver benötigt %d Arbeitsprozesse, aber nur %d verbleiben" -#: pg_createsubscriber.c:1135 +#: pg_createsubscriber.c:1139 #, c-format msgid "dry-run: would drop subscription \"%s\" in database \"%s\"" msgstr "Probelauf: würde Subskription »%s« in Datenbank »%s« löschen" -#: pg_createsubscriber.c:1139 +#: pg_createsubscriber.c:1143 #, c-format msgid "dropping subscription \"%s\" in database \"%s\"" msgstr "lösche Subskription »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1146 +#: pg_createsubscriber.c:1150 #, c-format msgid "could not drop subscription \"%s\": %s" msgstr "konnte Subskription »%s« nicht löschen: %s" -#: pg_createsubscriber.c:1181 +#: pg_createsubscriber.c:1185 #, c-format msgid "could not obtain pre-existing subscriptions: %s" msgstr "konnte bereits existierende Subskriptionen nicht ermitteln: %s" -#: pg_createsubscriber.c:1322 +#: pg_createsubscriber.c:1326 #, c-format msgid "could not drop replication slot \"%s\" on primary" msgstr "konnte Replikations-Slot »%s« auf dem Primärserver nicht löschen" -#: pg_createsubscriber.c:1356 +#: pg_createsubscriber.c:1360 #, c-format msgid "could not obtain failover replication slot information: %s" msgstr "konnte Failover-Replikations-Slot-Informationen nicht ermitteln: %s" -#: pg_createsubscriber.c:1358 pg_createsubscriber.c:1367 +#: pg_createsubscriber.c:1362 pg_createsubscriber.c:1371 #, c-format msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." msgstr "Löschen Sie die Failover-Replikations-Slots auf dem Subskriptionsserver bald, um Zurückhalten von WAL-Dateien zu vermeiden." -#: pg_createsubscriber.c:1366 +#: pg_createsubscriber.c:1370 #, c-format msgid "could not drop failover replication slot" msgstr "konnte Failover-Replikations-Slot nicht löschen" -#: pg_createsubscriber.c:1389 +#: pg_createsubscriber.c:1393 #, c-format msgid "dry-run: would create the replication slot \"%s\" in database \"%s\" on publisher" msgstr "Probelauf: würde Replikations-Slot »%s« in Datenbank »%s« auf dem Publikationsserver erzeugen" -#: pg_createsubscriber.c:1392 +#: pg_createsubscriber.c:1396 #, c-format msgid "creating the replication slot \"%s\" in database \"%s\" on publisher" msgstr "erzeuge Replikations-Slot »%s« in Datenbank »%s« auf dem Publikationsserver" -#: pg_createsubscriber.c:1411 +#: pg_createsubscriber.c:1415 #, c-format msgid "could not create replication slot \"%s\" in database \"%s\": %s" msgstr "konnte Replikations-Slot »%s« in Datenbank »%s« nicht erzeugen: %s" -#: pg_createsubscriber.c:1442 +#: pg_createsubscriber.c:1446 #, c-format msgid "dry-run: would drop the replication slot \"%s\" in database \"%s\"" msgstr "Probelauf: würde Replikations-Slot »%s« in Datenbank »%s« löschen" -#: pg_createsubscriber.c:1445 +#: pg_createsubscriber.c:1449 #, c-format msgid "dropping the replication slot \"%s\" in database \"%s\"" msgstr "lösche Replikations-Slot »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1461 +#: pg_createsubscriber.c:1465 #, c-format msgid "could not drop replication slot \"%s\" in database \"%s\": %s" msgstr "konnte Replikations-Slot »%s« in Datenbank »%s« nicht löschen: %s" -#: pg_createsubscriber.c:1482 +#: pg_createsubscriber.c:1485 #, c-format msgid "pg_ctl failed with exit code %d" msgstr "pg_ctl ist fehlgeschlagen mit Statuscode %d" -#: pg_createsubscriber.c:1487 +#: pg_createsubscriber.c:1490 #, c-format msgid "pg_ctl was terminated by exception 0x%X" msgstr "pg_ctl wurde durch Ausnahme 0x%X beendet" -#: pg_createsubscriber.c:1489 +#: pg_createsubscriber.c:1492 #, 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." -#: pg_createsubscriber.c:1491 +#: pg_createsubscriber.c:1494 #, c-format msgid "pg_ctl was terminated by signal %d: %s" msgstr "pg_ctl wurde durch Signal %d beendet: %s" -#: pg_createsubscriber.c:1497 +#: pg_createsubscriber.c:1500 #, c-format msgid "pg_ctl exited with unrecognized status %d" msgstr "pg_ctl hat mit unbekanntem Status %d beendet" -#: pg_createsubscriber.c:1500 +#: pg_createsubscriber.c:1503 #, c-format msgid "The failed command was: %s" msgstr "Der fehlgeschlagene Befehl war: %s" -#: pg_createsubscriber.c:1550 +#: pg_createsubscriber.c:1553 #, c-format msgid "server was started" msgstr "Server wurde gestartet" -#: pg_createsubscriber.c:1565 +#: pg_createsubscriber.c:1568 #, c-format msgid "server was stopped" msgstr "Server wurde angehalten" -#: pg_createsubscriber.c:1584 +#: pg_createsubscriber.c:1587 #, c-format msgid "waiting for the target server to reach the consistent state" msgstr "warte, dass der Zielserver einen konsistenten Zustand erreicht" -#: pg_createsubscriber.c:1602 +#: pg_createsubscriber.c:1605 #, c-format msgid "recovery timed out" msgstr "Zeitüberschreitung bei der Wiederherstellung" -#: pg_createsubscriber.c:1615 +#: pg_createsubscriber.c:1618 #, c-format msgid "server did not end recovery" msgstr "Server hat Recovery-Zustand nicht beendet" -#: pg_createsubscriber.c:1617 +#: pg_createsubscriber.c:1620 #, c-format msgid "target server reached the consistent state" msgstr "Zielserver hat einen konsistenten Zustand erreicht" -#: pg_createsubscriber.c:1618 +#: pg_createsubscriber.c:1621 #, c-format msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." msgstr "Wenn pg_createsubscriber ab diesem Punkt fehlschlägt, dann müssen Sie die physikalische Replik neu erzeugen, bevor fortgesetzt werden kann." -#: pg_createsubscriber.c:1645 pg_createsubscriber.c:1776 +#: pg_createsubscriber.c:1648 pg_createsubscriber.c:1777 #, c-format msgid "could not obtain publication information: %s" msgstr "konnte Publikationsinformationen nicht ermitteln: %s" -#: pg_createsubscriber.c:1659 +#: pg_createsubscriber.c:1662 #, c-format msgid "publication \"%s\" already exists" msgstr "Publikation »%s« existiert bereits" -#: pg_createsubscriber.c:1660 +#: pg_createsubscriber.c:1663 #, c-format msgid "Consider renaming this publication before continuing." msgstr "Nennen Sie diese Publikation eventuell um bevor Sie fortsetzen." -#: pg_createsubscriber.c:1668 +#: pg_createsubscriber.c:1671 #, c-format msgid "dry-run: would create publication \"%s\" in database \"%s\"" msgstr "Probelauf: würde Publikation »%s« in Datenbank »%s« erzeugen" -#: pg_createsubscriber.c:1671 +#: pg_createsubscriber.c:1674 #, c-format msgid "creating publication \"%s\" in database \"%s\"" msgstr "erzeuge Publikation »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1684 +#: pg_createsubscriber.c:1687 #, c-format msgid "could not create publication \"%s\" in database \"%s\": %s" msgstr "konnte Publikation »%s« in Datenbank »%s« nicht erzeugen: %s" -#: pg_createsubscriber.c:1715 +#: pg_createsubscriber.c:1717 #, c-format msgid "dry-run: would drop publication \"%s\" in database \"%s\"" msgstr "Probelauf: würde Publikation »%s« in Datenbank »%s« löschen" -#: pg_createsubscriber.c:1718 +#: pg_createsubscriber.c:1720 #, c-format msgid "dropping publication \"%s\" in database \"%s\"" msgstr "lösche Publikation »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1732 +#: pg_createsubscriber.c:1734 #, c-format msgid "could not drop publication \"%s\" in database \"%s\": %s" msgstr "konnte Publikation »%s« in Datenbank »%s« nicht löschen: %s" -#: pg_createsubscriber.c:1769 +#: pg_createsubscriber.c:1770 #, c-format msgid "dropping all existing publications in database \"%s\"" msgstr "lösche alle bestehenden Publikationen in Datenbank »%s«" -#: pg_createsubscriber.c:1828 +#: pg_createsubscriber.c:1827 #, c-format msgid "dry-run: would create subscription \"%s\" in database \"%s\"" msgstr "Probelauf: würde Subskription »%s« in Datenbank »%s« erzeugen" -#: pg_createsubscriber.c:1831 +#: pg_createsubscriber.c:1830 #, c-format msgid "creating subscription \"%s\" in database \"%s\"" msgstr "erzeuge Subskription »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1853 +#: pg_createsubscriber.c:1852 #, c-format msgid "could not create subscription \"%s\" in database \"%s\": %s" msgstr "konnte Subskription »%s« in Datenbank »%s« nicht erzeugen: %s" -#: pg_createsubscriber.c:1898 +#: pg_createsubscriber.c:1897 #, c-format msgid "could not obtain subscription OID: %s" msgstr "konnte Subskriptions-OID nicht ermitteln: %s" -#: pg_createsubscriber.c:1905 +#: pg_createsubscriber.c:1904 #, c-format msgid "could not obtain subscription OID: got %d rows, expected %d row" msgstr "konnte Subskriptions-OID nicht ermitteln: %d Zeilen erhalten, %d Zeile erwartet" -#: pg_createsubscriber.c:1930 +#: pg_createsubscriber.c:1929 #, c-format msgid "dry-run: would set the replication progress (node name \"%s\", LSN %s) in database \"%s\"" msgstr "Problelauf: würde Replikationsfortschritt (Knotenname »%s«, LSN %s) in Datenbank »%s« setzen" -#: pg_createsubscriber.c:1933 +#: pg_createsubscriber.c:1932 #, c-format msgid "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"" msgstr "setze Replikationsfortschritt (Knotenname »%s«, LSN %s) in Datenbank »%s«" -#: pg_createsubscriber.c:1948 +#: pg_createsubscriber.c:1947 #, c-format msgid "could not set replication progress for subscription \"%s\": %s" msgstr "konnte Replikationsfortschritt für Subskription »%s« nicht setzen: %s" -#: pg_createsubscriber.c:1980 +#: pg_createsubscriber.c:1979 #, c-format msgid "dry-run: would enable subscription \"%s\" in database \"%s\"" msgstr "Probelauf: würde Subskription »%s« in Datenbank »%s« aktivieren" -#: pg_createsubscriber.c:1983 +#: pg_createsubscriber.c:1982 #, c-format msgid "enabling subscription \"%s\" in database \"%s\"" msgstr "aktiviere Subskription »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1995 +#: pg_createsubscriber.c:1994 #, c-format msgid "could not enable subscription \"%s\": %s" msgstr "konnte Subskription »%s« nicht aktivieren: %s" -#: pg_createsubscriber.c:2041 +#: pg_createsubscriber.c:2040 #, c-format msgid "could not obtain a list of databases: %s" msgstr "konnte Liste der Datenbanken nicht ermitteln: %s" -#: pg_createsubscriber.c:2145 +#: pg_createsubscriber.c:2144 #, c-format msgid "cannot be executed by \"root\"" msgstr "kann nicht von »root« ausgeführt werden" -#: pg_createsubscriber.c:2146 +#: pg_createsubscriber.c:2145 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen." -#: pg_createsubscriber.c:2169 +#: pg_createsubscriber.c:2168 #, c-format msgid "database \"%s\" specified more than once for -d/--database" msgstr "Datenbank »%s« mehrmals für -d/--database angegeben" -#: pg_createsubscriber.c:2210 +#: pg_createsubscriber.c:2209 #, c-format msgid "publication \"%s\" specified more than once for --publication" msgstr "Publikation »%s« mehrmals für --publication angegeben" -#: pg_createsubscriber.c:2219 +#: pg_createsubscriber.c:2218 #, c-format msgid "replication slot \"%s\" specified more than once for --replication-slot" msgstr "Replikations-Slot »%s« mehrmals für --replication-slot angegeben" -#: pg_createsubscriber.c:2228 +#: pg_createsubscriber.c:2227 #, c-format msgid "subscription \"%s\" specified more than once for --subscription" msgstr "Subskription »%s« mehrmals für --subscription angegeben" -#: pg_createsubscriber.c:2234 +#: pg_createsubscriber.c:2233 #, c-format msgid "object type \"%s\" specified more than once for --clean" msgstr "Objekttyp »%s« mehrmals für --clean angegeben" -#: pg_createsubscriber.c:2259 +#: pg_createsubscriber.c:2258 #, c-format msgid "options %s and %s cannot be used together" msgstr "Optionen %s und %s können nicht zusammen verwendet werden" -#: pg_createsubscriber.c:2278 +#: pg_createsubscriber.c:2277 #, c-format msgid "no subscriber data directory specified" msgstr "kein Datenverzeichnis für Subskriptionsserver angegeben" -#: pg_createsubscriber.c:2289 +#: pg_createsubscriber.c:2288 #, c-format msgid "could not determine current directory" msgstr "konnte aktuelles Verzeichnis nicht ermitteln" -#: pg_createsubscriber.c:2306 +#: pg_createsubscriber.c:2305 #, c-format msgid "no publisher connection string specified" msgstr "keine Verbindungsparameter für Publikationsserver angegeben" -#: pg_createsubscriber.c:2310 +#: pg_createsubscriber.c:2309 #, c-format msgid "validating publisher connection string" msgstr "validiere Verbindungsparameter für Publikationsserver" -#: pg_createsubscriber.c:2316 +#: pg_createsubscriber.c:2315 #, c-format msgid "validating subscriber connection string" msgstr "validiere Verbindungsparameter für Subskriptionsserver" -#: pg_createsubscriber.c:2333 +#: pg_createsubscriber.c:2332 #, c-format msgid "no database was specified" msgstr "keine Datenbank wurde angegeben" -#: pg_createsubscriber.c:2344 +#: pg_createsubscriber.c:2343 #, c-format msgid "database name \"%s\" was extracted from the publisher connection string" msgstr "Datenbankname »%s« wurde aus der Verbindungszeichenkette des Publikationsservers extrahiert" -#: pg_createsubscriber.c:2349 +#: pg_createsubscriber.c:2348 #, c-format msgid "no database name specified" msgstr "kein Datenbankname angegeben" -#: pg_createsubscriber.c:2359 +#: pg_createsubscriber.c:2358 #, c-format msgid "wrong number of publication names specified" msgstr "falsche Anzahl Publikationsnamen angegeben" -#: pg_createsubscriber.c:2360 +#: pg_createsubscriber.c:2359 #, c-format msgid "The number of specified publication names (%d) must match the number of specified database names (%d)." msgstr "Die Anzahl der angegebenen Publikationsnamen (%d) muss mit der Anzahl der angegebenen Datenbanknamen (%d) übereinstimmen." -#: pg_createsubscriber.c:2366 +#: pg_createsubscriber.c:2365 #, c-format msgid "wrong number of subscription names specified" msgstr "falsche Anzahl Subskriptionsnamen angegeben" -#: pg_createsubscriber.c:2367 +#: pg_createsubscriber.c:2366 #, c-format msgid "The number of specified subscription names (%d) must match the number of specified database names (%d)." msgstr "Die Anzahl der angegebenen Subskriptionsnamen (%d) muss mit der Anzahl der angegebenen Datenbanknamen (%d) übereinstimmen." -#: pg_createsubscriber.c:2373 +#: pg_createsubscriber.c:2372 #, c-format msgid "wrong number of replication slot names specified" msgstr "falsche Anzahl Replikations-Slot-Namen angegeben" -#: pg_createsubscriber.c:2374 +#: pg_createsubscriber.c:2373 #, c-format msgid "The number of specified replication slot names (%d) must match the number of specified database names (%d)." msgstr "Die Anzahl der angegebenen Replikations-Slot-Namen (%d) muss mit der Anzahl der angegebenen Datenbanknamen (%d) übereinstimmen." -#: pg_createsubscriber.c:2386 +#: pg_createsubscriber.c:2385 #, c-format msgid "invalid object type \"%s\" specified for %s" msgstr "ungültiger Objekttyp »%s« für %s angegeben" -#: pg_createsubscriber.c:2388 +#: pg_createsubscriber.c:2387 #, c-format msgid "The valid value is: \"%s\"" msgstr "Der gültige Wert ist: »%s«" -#: pg_createsubscriber.c:2419 +#: pg_createsubscriber.c:2418 #, c-format msgid "subscriber data directory is not a copy of the source database cluster" msgstr "Datenverzeichnis des Subskriptionsservers ist keine Kopie des Quelldatenbankclusters" -#: pg_createsubscriber.c:2432 +#: pg_createsubscriber.c:2431 #, c-format msgid "standby server is running" msgstr "Standby-Server läuft" -#: pg_createsubscriber.c:2433 +#: pg_createsubscriber.c:2432 #, c-format msgid "Stop the standby server and try again." msgstr "Halten Sie den Standby-Server an und versuchen Sie erneut." -#: pg_createsubscriber.c:2442 +#: pg_createsubscriber.c:2441 #, c-format msgid "starting the standby server with command-line options" msgstr "starte den Standby-Server mit Kommandozeilenoptionen" -#: pg_createsubscriber.c:2458 pg_createsubscriber.c:2493 +#: pg_createsubscriber.c:2457 pg_createsubscriber.c:2492 #, c-format msgid "stopping the subscriber" msgstr "stoppe den Subskriptionsserver" -#: pg_createsubscriber.c:2472 +#: pg_createsubscriber.c:2471 #, c-format msgid "starting the subscriber" msgstr "starte den Subskriptionsserver" -#: pg_createsubscriber.c:2501 +#: pg_createsubscriber.c:2500 #, c-format msgid "Done!" msgstr "Fertig!" @@ -2164,7 +2184,7 @@ msgstr "Log-Streaming gestoppt bei %X/%X (Zeitleiste %u)" msgid "switched to timeline %u at %X/%X" msgstr "auf Zeitleiste %u umgeschaltet bei %X/%X" -#: pg_receivewal.c:224 pg_recvlogical.c:1075 +#: pg_receivewal.c:224 pg_recvlogical.c:1079 #, c-format msgid "received interrupt signal, exiting" msgstr "Interrupt-Signal erhalten, beende" @@ -2234,7 +2254,7 @@ msgstr "kann Datei »%s« nicht prüfen: Komprimierung mit %s wird von dieser In msgid "starting log streaming at %X/%X (timeline %u)" msgstr "starte Log-Streaming bei %X/%X (Zeitleiste %u)" -#: pg_receivewal.c:693 pg_recvlogical.c:809 +#: pg_receivewal.c:693 pg_recvlogical.c:813 #, c-format msgid "could not parse end position \"%s\"" msgstr "konnte Endposition »%s« nicht parsen" @@ -2264,23 +2284,23 @@ msgstr "Komprimierung mit %s wird noch nicht unterstützt" msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "Replikationsverbindung, die Slot »%s« verwendet, ist unerwarteterweise datenbankspezifisch" -#: pg_receivewal.c:878 pg_recvlogical.c:993 +#: pg_receivewal.c:878 pg_recvlogical.c:997 #, c-format msgid "dropping replication slot \"%s\"" msgstr "lösche Replikations-Slot »%s«" -#: pg_receivewal.c:889 pg_recvlogical.c:1003 +#: pg_receivewal.c:889 pg_recvlogical.c:1007 #, c-format msgid "creating replication slot \"%s\"" msgstr "erzeuge Replikations-Slot »%s«" -#: pg_receivewal.c:918 pg_recvlogical.c:1028 +#: pg_receivewal.c:918 pg_recvlogical.c:1032 #, c-format msgid "disconnected" msgstr "Verbindung beendet" #. translator: check source for value for %d -#: pg_receivewal.c:922 pg_recvlogical.c:1032 +#: pg_receivewal.c:922 pg_recvlogical.c:1036 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "Verbindung beendet; erneuter Versuch in %d Sekunden" @@ -2389,108 +2409,108 @@ msgstr "konnte Rückmeldungspaket nicht senden: %s" msgid "starting log streaming at %X/%X (slot %s)" msgstr "starte Log-Streaming bei %X/%X (Slot %s)" -#: pg_recvlogical.c:283 +#: pg_recvlogical.c:287 #, c-format msgid "streaming initiated" msgstr "Streaming eingeleitet" -#: pg_recvlogical.c:348 +#: pg_recvlogical.c:352 #, c-format msgid "could not open log file \"%s\": %m" msgstr "konnte Logdatei »%s« nicht öffnen: %m" -#: pg_recvlogical.c:377 receivelog.c:889 +#: pg_recvlogical.c:381 receivelog.c:895 #, c-format msgid "invalid socket: %s" msgstr "ungültiges Socket: %s" -#: pg_recvlogical.c:430 receivelog.c:917 +#: pg_recvlogical.c:434 receivelog.c:923 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: pg_recvlogical.c:437 receivelog.c:966 +#: pg_recvlogical.c:441 receivelog.c:972 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "konnte keine Daten vom WAL-Stream empfangen: %s" -#: pg_recvlogical.c:479 pg_recvlogical.c:530 receivelog.c:1010 -#: receivelog.c:1073 +#: pg_recvlogical.c:483 pg_recvlogical.c:534 receivelog.c:1016 +#: receivelog.c:1079 #, c-format msgid "streaming header too small: %d" msgstr "Streaming-Header zu klein: %d" -#: pg_recvlogical.c:514 receivelog.c:846 +#: pg_recvlogical.c:518 receivelog.c:852 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "unbekannter Streaming-Header: »%c«" -#: pg_recvlogical.c:568 pg_recvlogical.c:580 +#: pg_recvlogical.c:572 pg_recvlogical.c:584 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "konnte %d Bytes nicht in Logdatei »%s« schreiben: %m" -#: pg_recvlogical.c:638 receivelog.c:641 receivelog.c:678 +#: pg_recvlogical.c:642 receivelog.c:647 receivelog.c:684 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "unerwarteter Abbruch des Replikations-Streams: %s" -#: pg_recvlogical.c:804 +#: pg_recvlogical.c:808 #, c-format msgid "could not parse start position \"%s\"" msgstr "konnte Startposition »%s« nicht parsen" -#: pg_recvlogical.c:882 +#: pg_recvlogical.c:886 #, c-format msgid "no slot specified" msgstr "kein Slot angegeben" -#: pg_recvlogical.c:889 +#: pg_recvlogical.c:893 #, c-format msgid "no target file specified" msgstr "keine Zieldatei angegeben" -#: pg_recvlogical.c:896 +#: pg_recvlogical.c:900 #, c-format msgid "no database specified" msgstr "keine Datenbank angegeben" -#: pg_recvlogical.c:903 +#: pg_recvlogical.c:907 #, c-format msgid "at least one action needs to be specified" msgstr "mindestens eine Aktion muss angegeben werden" -#: pg_recvlogical.c:910 +#: pg_recvlogical.c:914 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "--create-slot oder --start kann nicht zusammen mit --drop-slot verwendet werden" -#: pg_recvlogical.c:917 +#: pg_recvlogical.c:921 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "--create-slot oder --drop-slot kann nicht zusammen mit --startpos verwendet werden" -#: pg_recvlogical.c:924 +#: pg_recvlogical.c:928 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos kann nur zusammen mit --start angegeben werden" -#: pg_recvlogical.c:933 pg_recvlogical.c:940 +#: pg_recvlogical.c:937 pg_recvlogical.c:944 #, c-format msgid "%s may only be specified with --create-slot" msgstr "%s kann nur zusammen mit --create-slot angegeben werden" -#: pg_recvlogical.c:977 +#: pg_recvlogical.c:981 #, c-format msgid "could not establish database-specific replication connection" msgstr "konnte keine datenbankspezifische Replikationsverbindung herstellen" -#: pg_recvlogical.c:1078 +#: pg_recvlogical.c:1082 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "Endposition %X/%X durch Keepalive erreicht" -#: pg_recvlogical.c:1083 +#: pg_recvlogical.c:1087 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "Endposition %X/%X erreicht durch WAL-Eintrag bei %X/%X" @@ -2537,7 +2557,7 @@ msgstr "konnte Write-Ahead-Log-Datei »%s« nicht öffnen: %s" msgid "not renaming \"%s\", segment is not complete" msgstr "»%s« wird nicht umbenannt, Segment ist noch nicht vollständig" -#: receivelog.c:226 receivelog.c:316 receivelog.c:687 +#: receivelog.c:226 receivelog.c:316 receivelog.c:693 #, c-format msgid "could not close file \"%s\": %s" msgstr "konnte Datei »%s« nicht schließen: %s" @@ -2567,67 +2587,67 @@ msgstr "inkompatible Serverversion %s; Client unterstützt Streaming nicht mit S msgid "incompatible server version %s; client does not support streaming from server versions newer than %s" msgstr "inkompatible Serverversion %s; Client unterstützt Streaming nicht mit Serverversionen neuer als %s" -#: receivelog.c:507 +#: receivelog.c:504 #, c-format msgid "system identifier does not match between base backup and streaming connection" msgstr "Systemidentifikator stimmt nicht zwischen Basissicherung und Streaming-Verbindung überein" -#: receivelog.c:515 +#: receivelog.c:512 #, c-format msgid "starting timeline %u is not present in the server" msgstr "Startzeitleiste %u ist auf dem Server nicht vorhanden" -#: receivelog.c:554 +#: receivelog.c:553 #, c-format msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields" msgstr "unerwartete Antwort auf Befehl TIMELINE_HISTORY: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: receivelog.c:625 +#: receivelog.c:631 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "Server berichtete unerwartete nächste Zeitleiste %u, folgend auf Zeitleiste %u" -#: receivelog.c:631 +#: receivelog.c:637 #, c-format msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X" msgstr "Server beendete Streaming von Zeitleiste %u bei %X/%X, aber gab an, dass nächste Zeitleiste %u bei %X/%X beginnt" -#: receivelog.c:671 +#: receivelog.c:677 #, c-format msgid "replication stream was terminated before stop point" msgstr "Replikationsstrom wurde vor Stopppunkt abgebrochen" -#: receivelog.c:717 +#: receivelog.c:723 #, c-format msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields" msgstr "unerwartete Ergebnismenge nach Ende der Zeitleiste: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: receivelog.c:726 +#: receivelog.c:732 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "konnte Startpunkt der nächsten Zeitleiste (»%s«) nicht interpretieren" -#: receivelog.c:774 receivelog.c:1029 walmethods.c:1206 +#: receivelog.c:780 receivelog.c:1035 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "konnte Datei »%s« nicht fsyncen: %s" -#: receivelog.c:1090 +#: receivelog.c:1096 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "Write-Ahead-Log-Eintrag für Offset %u erhalten ohne offene Datei" -#: receivelog.c:1100 +#: receivelog.c:1106 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "WAL-Daten-Offset %08x erhalten, %08x erwartet" -#: receivelog.c:1135 +#: receivelog.c:1141 #, c-format msgid "could not write %d bytes to WAL file \"%s\": %s" msgstr "konnte %d Bytes nicht in WAL-Datei »%s« schreiben: %s" -#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1228 +#: receivelog.c:1166 receivelog.c:1206 receivelog.c:1234 #, c-format msgid "could not send copy-end packet: %s" msgstr "konnte COPY-Ende-Paket nicht senden: %s" @@ -2688,32 +2708,32 @@ msgstr "Gruppenzugriffseinstellung konnte nicht interpretiert werden: %s" msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "Konnte System nicht identifizieren: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet" -#: streamutil.c:519 +#: streamutil.c:520 #, c-format msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "konnte Replikations-Slot »%s« nicht lesen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: streamutil.c:531 +#: streamutil.c:532 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "Replikations-Slot »%s« existiert nicht" -#: streamutil.c:542 +#: streamutil.c:543 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "physischer Replikations-Slot wurde erwartet, stattdessen wurde Typ »%s« erhalten" -#: streamutil.c:556 +#: streamutil.c:557 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "konnte restart_lsn »%s« für Replikations-Slot »%s« nicht parsen" -#: streamutil.c:678 +#: streamutil.c:683 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: streamutil.c:722 +#: streamutil.c:727 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "konnte Replikations-Slot »%s« nicht löschen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" diff --git a/src/bin/pg_basebackup/po/ja.po b/src/bin/pg_basebackup/po/ja.po index a78e8aae8c1..6e996f83e4a 100644 --- a/src/bin/pg_basebackup/po/ja.po +++ b/src/bin/pg_basebackup/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_basebackup (PostgreSQL 18)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-12-09 09:38+0900\n" -"PO-Revision-Date: 2025-12-09 10:16+0900\n" +"POT-Creation-Date: 2026-05-12 14:54+0900\n" +"PO-Revision-Date: 2026-05-14 16:30+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -45,8 +45,8 @@ msgstr "ヒント: " #: ../../common/compression.c:132 ../../common/compression.c:141 #: ../../common/compression.c:150 ../../fe_utils/astreamer_gzip.c:140 #: ../../fe_utils/astreamer_gzip.c:273 ../../fe_utils/astreamer_lz4.c:102 -#: ../../fe_utils/astreamer_lz4.c:300 ../../fe_utils/astreamer_zstd.c:133 -#: ../../fe_utils/astreamer_zstd.c:288 +#: ../../fe_utils/astreamer_lz4.c:300 ../../fe_utils/astreamer_zstd.c:130 +#: ../../fe_utils/astreamer_zstd.c:285 #, c-format msgid "this build does not support compression with %s" msgstr "このビルドでは%sによる圧縮をサポートしていません" @@ -112,7 +112,8 @@ msgid "could not read file \"%s\": read %d of %zu" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 -#: ../../fe_utils/astreamer_file.c:141 pg_recvlogical.c:653 +#: ../../fe_utils/astreamer_file.c:141 ../../fe_utils/astreamer_file.c:282 +#: pg_recvlogical.c:653 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズできませんでした: %m" @@ -153,17 +154,27 @@ msgstr "ファイル\"%s\"を書き出せませんでした: %m" msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません (内部エラー)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "メモリ割り当て要求サイズ %zu * %zu が不正です\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -228,40 +239,50 @@ msgstr "制限付きトークンで再実行できませんでした: %lu" msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスの終了コードを取得できませんでした: エラーコード %lu" -#: ../../fe_utils/astreamer_file.c:96 ../../fe_utils/astreamer_file.c:364 +#: ../../fe_utils/astreamer_file.c:96 ../../fe_utils/astreamer_file.c:378 #: ../../fe_utils/recovery_gen.c:153 pg_basebackup.c:1498 pg_basebackup.c:1707 #, c-format msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作成できませんでした: %m" -#: ../../fe_utils/astreamer_file.c:124 ../../fe_utils/astreamer_file.c:261 +#: ../../fe_utils/astreamer_file.c:124 ../../fe_utils/astreamer_file.c:273 #: ../../fe_utils/recovery_gen.c:144 pg_basebackup.c:1434 pg_basebackup.c:1728 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ファイル\"%s\"を書き込めませんでした: %m" -#: ../../fe_utils/astreamer_file.c:278 +#: ../../fe_utils/astreamer_file.c:222 ../../fe_utils/astreamer_tar.c:309 +#, c-format +msgid "tar member has unsafe path name: \"%s\"" +msgstr "tarメンバーのパス名が安全ではありません: \"%s\"" + +#: ../../fe_utils/astreamer_file.c:251 +#, c-format +msgid "link target has unsafe path name: \"%s\"" +msgstr "リンク先のパス名が安全ではありません: \"%s\"" + +#: ../../fe_utils/astreamer_file.c:292 #, c-format msgid "unexpected state while extracting archive" msgstr "アーカイブの抽出中に想定外の状態" -#: ../../fe_utils/astreamer_file.c:324 pg_basebackup.c:699 pg_basebackup.c:713 +#: ../../fe_utils/astreamer_file.c:338 pg_basebackup.c:699 pg_basebackup.c:713 #: pg_basebackup.c:758 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" -#: ../../fe_utils/astreamer_file.c:329 +#: ../../fe_utils/astreamer_file.c:343 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "ディレクトリ\"%s\"に権限を設定できませんでした: %m" -#: ../../fe_utils/astreamer_file.c:348 +#: ../../fe_utils/astreamer_file.c:362 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "\"%s\"から\"%s\"へのシンボリックリンクを作成できませんでした: %m" -#: ../../fe_utils/astreamer_file.c:368 +#: ../../fe_utils/astreamer_file.c:382 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "ファイル\"%s\"の権限を設定できませんでした: %m" @@ -302,7 +323,7 @@ msgid "could not initialize compression library" msgstr "圧縮ライブラリを初期化できませんでした" #: ../../fe_utils/astreamer_gzip.c:320 ../../fe_utils/astreamer_lz4.c:356 -#: ../../fe_utils/astreamer_zstd.c:333 +#: ../../fe_utils/astreamer_zstd.c:330 #, c-format msgid "could not decompress data: %s" msgstr "データを伸張できませんでした: %s" @@ -317,8 +338,8 @@ msgstr "lz4圧縮コンテクストを生成できませんでした: %s" msgid "could not write lz4 header: %s" msgstr "lz4ヘッダを出力できませんでした: %s" -#: ../../fe_utils/astreamer_lz4.c:191 ../../fe_utils/astreamer_zstd.c:185 -#: ../../fe_utils/astreamer_zstd.c:227 +#: ../../fe_utils/astreamer_lz4.c:191 ../../fe_utils/astreamer_zstd.c:182 +#: ../../fe_utils/astreamer_zstd.c:224 #, c-format msgid "could not compress data: %s" msgstr "データを圧縮できませんでした: %s" @@ -333,22 +354,27 @@ msgstr "lz4圧縮を終了できませんでした: %s" msgid "could not initialize compression library: %s" msgstr "圧縮ライブラリを初期化できませんでした: %s" -#: ../../fe_utils/astreamer_tar.c:244 -#, c-format -msgid "tar file trailer exceeds 2 blocks" -msgstr "tarファイル後続ブロックが2ブロックを超えています" - -#: ../../fe_utils/astreamer_tar.c:249 +#: ../../fe_utils/astreamer_tar.c:254 #, c-format msgid "unexpected state while parsing tar archive" msgstr "tarアーカイブのパース中に想定外の状態" -#: ../../fe_utils/astreamer_tar.c:292 +#: ../../fe_utils/astreamer_tar.c:300 +#, c-format +msgid "input file does not appear to be a valid tar archive" +msgstr "入力ファイルが有効なtarアーカイブではないようです" + +#: ../../fe_utils/astreamer_tar.c:307 #, c-format msgid "tar member has empty name" msgstr "tarメンバーの名前が空です" -#: ../../fe_utils/astreamer_tar.c:326 +#: ../../fe_utils/astreamer_tar.c:332 +#, c-format +msgid "pax extensions to tar format are not supported" +msgstr "tar形式に対するpax拡張はサポートされていません" + +#: ../../fe_utils/astreamer_tar.c:361 #, c-format msgid "COPY stream ended before last file was finished" msgstr "最後のファイルが終わる前にCOPYストリームが終了しました" @@ -368,12 +394,12 @@ msgstr "zstd圧縮レベルを%dに設定できませんでした: %s" msgid "could not set compression worker count to %d: %s" msgstr "圧縮ワーカー数を%dに設定できませんでした: %s" -#: ../../fe_utils/astreamer_zstd.c:120 +#: ../../fe_utils/astreamer_zstd.c:119 #, c-format msgid "could not enable long-distance mode: %s" msgstr "長距離モードを有効化できませんでした: %s" -#: ../../fe_utils/astreamer_zstd.c:279 +#: ../../fe_utils/astreamer_zstd.c:276 #, c-format msgid "could not create zstd decompression context" msgstr "zstd伸張コンテクストを生成できませんでした" @@ -1182,9 +1208,9 @@ msgstr "不正な wal-method オプション\"%s\"、\"fetch\"、\"stream\" ま #: pg_basebackup.c:2713 pg_basebackup.c:2725 pg_basebackup.c:2737 #: pg_basebackup.c:2745 pg_basebackup.c:2758 pg_basebackup.c:2764 #: pg_basebackup.c:2773 pg_basebackup.c:2785 pg_basebackup.c:2796 -#: pg_basebackup.c:2804 pg_createsubscriber.c:2238 pg_createsubscriber.c:2261 -#: pg_createsubscriber.c:2271 pg_createsubscriber.c:2279 -#: pg_createsubscriber.c:2307 pg_createsubscriber.c:2350 pg_receivewal.c:748 +#: pg_basebackup.c:2804 pg_createsubscriber.c:2243 pg_createsubscriber.c:2266 +#: pg_createsubscriber.c:2276 pg_createsubscriber.c:2284 +#: pg_createsubscriber.c:2312 pg_createsubscriber.c:2355 pg_receivewal.c:748 #: pg_receivewal.c:760 pg_receivewal.c:767 pg_receivewal.c:776 #: pg_receivewal.c:783 pg_receivewal.c:793 pg_recvlogical.c:861 #: pg_recvlogical.c:873 pg_recvlogical.c:883 pg_recvlogical.c:890 @@ -1195,7 +1221,7 @@ msgstr "不正な wal-method オプション\"%s\"、\"fetch\"、\"stream\" ま msgid "Try \"%s --help\" for more information." msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_basebackup.c:2585 pg_createsubscriber.c:2269 pg_receivewal.c:758 +#: pg_basebackup.c:2585 pg_createsubscriber.c:2274 pg_receivewal.c:758 #: pg_recvlogical.c:871 #, c-format msgid "too many command-line arguments (first is \"%s\")" @@ -1313,7 +1339,7 @@ msgstr "再試行の前にこのパブリケーションを削除してくださ msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" msgstr "プライマリ上のデータベース\"%2$s\"で作成されたレプリケーションスロット\"%1$s\"が残されています" -#: pg_createsubscriber.c:231 pg_createsubscriber.c:1324 +#: pg_createsubscriber.c:231 pg_createsubscriber.c:1329 #, c-format msgid "Drop this replication slot soon to avoid retention of WAL files." msgstr "WALファイルの増加を避けるためにこのレプリケーションスロットを直ちに削除してください。" @@ -1666,402 +1692,402 @@ msgstr "サブスクライバは%d個の論理レプリケーションワーカ msgid "subscriber requires %d worker processes, but only %d remain" msgstr "サブスクライバは%d個のワーカープロセスを必要としますが、%d個しか残っていません" -#: pg_createsubscriber.c:1135 +#: pg_createsubscriber.c:1140 #, c-format msgid "dry-run: would drop subscription \"%s\" in database \"%s\"" msgstr "ドライラン: データベース\"%2$s\"のサブスクリプション\"%1$s\"が削除されます" -#: pg_createsubscriber.c:1139 +#: pg_createsubscriber.c:1144 #, c-format msgid "dropping subscription \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のサブスクリプション\"%1$s\"の削除中" -#: pg_createsubscriber.c:1146 +#: pg_createsubscriber.c:1151 #, c-format msgid "could not drop subscription \"%s\": %s" msgstr "サブスクリプション\"%s\"を削除できませんでした: %s" -#: pg_createsubscriber.c:1181 +#: pg_createsubscriber.c:1186 #, c-format msgid "could not obtain pre-existing subscriptions: %s" msgstr "既存のサブスクリプションを取得できませんでした: %s" -#: pg_createsubscriber.c:1322 +#: pg_createsubscriber.c:1327 #, c-format msgid "could not drop replication slot \"%s\" on primary" msgstr "プライマリ上のレプリケーションスロット\"%s\"を削除できませんでした" -#: pg_createsubscriber.c:1356 +#: pg_createsubscriber.c:1361 #, c-format msgid "could not obtain failover replication slot information: %s" msgstr "フェイルオーバーレプリケーションスロットの情報を取得できませんでした: %s" -#: pg_createsubscriber.c:1358 pg_createsubscriber.c:1367 +#: pg_createsubscriber.c:1363 pg_createsubscriber.c:1372 #, c-format msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." msgstr "WALファイルの増加を避けるためにこのフェイルオーバーレプリケーションスロットを直ちに削除してください。" -#: pg_createsubscriber.c:1366 +#: pg_createsubscriber.c:1371 #, c-format msgid "could not drop failover replication slot" msgstr "フェイルオーバーレプリケーションスロットを削除できませんでした" -#: pg_createsubscriber.c:1389 +#: pg_createsubscriber.c:1394 #, c-format msgid "dry-run: would create the replication slot \"%s\" in database \"%s\" on publisher" msgstr "ドライラン: パブリッシャ上でデータベース\"%2$s\"にレプリケーションスロット\"%1$s\"が作成されます" -#: pg_createsubscriber.c:1392 +#: pg_createsubscriber.c:1397 #, c-format msgid "creating the replication slot \"%s\" in database \"%s\" on publisher" msgstr "パブリッシャ上でデータベース\"%2$s\"にレプリケーションスロット\"%1$s\"を作成します" -#: pg_createsubscriber.c:1411 +#: pg_createsubscriber.c:1416 #, c-format msgid "could not create replication slot \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"でレプリケーションスロット\"%1$s\"を作成できませんでした: %3$s" -#: pg_createsubscriber.c:1442 +#: pg_createsubscriber.c:1447 #, c-format msgid "dry-run: would drop the replication slot \"%s\" in database \"%s\"" msgstr "ドライラン: データベース\"%2$s\"のレプリケーションスロット\"%1$s\"が削除されます" -#: pg_createsubscriber.c:1445 +#: pg_createsubscriber.c:1450 #, c-format msgid "dropping the replication slot \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のレプリケーションスロット\"%1$s\"を削除します" -#: pg_createsubscriber.c:1461 +#: pg_createsubscriber.c:1466 #, c-format msgid "could not drop replication slot \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"のレプリケーションスロット\"%1$s\"を削除できませんでした: %3$s" -#: pg_createsubscriber.c:1482 +#: pg_createsubscriber.c:1487 #, c-format msgid "pg_ctl failed with exit code %d" msgstr "pg_ctlが終了コード%dで失敗しました" -#: pg_createsubscriber.c:1487 +#: pg_createsubscriber.c:1492 #, c-format msgid "pg_ctl was terminated by exception 0x%X" msgstr "pg_ctlが例外0x%Xによって終了させられました" -#: pg_createsubscriber.c:1489 +#: pg_createsubscriber.c:1494 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "16進値の説明についてはC インクルードファイル\"ntstatus.h\"を参照してください。" -#: pg_createsubscriber.c:1491 +#: pg_createsubscriber.c:1496 #, c-format msgid "pg_ctl was terminated by signal %d: %s" msgstr "pg_ctlがシグナル%dによって終了させられました %s" -#: pg_createsubscriber.c:1497 +#: pg_createsubscriber.c:1502 #, c-format msgid "pg_ctl exited with unrecognized status %d" msgstr "pg_ctlが認識できない状態%dで終了しました" -#: pg_createsubscriber.c:1500 +#: pg_createsubscriber.c:1505 #, c-format msgid "The failed command was: %s" msgstr "失敗したコマンドは以下のとおりです: %s" -#: pg_createsubscriber.c:1550 +#: pg_createsubscriber.c:1555 #, c-format msgid "server was started" msgstr "サーバー起動完了" -#: pg_createsubscriber.c:1565 +#: pg_createsubscriber.c:1570 #, c-format msgid "server was stopped" msgstr "サーバーは停止しました" -#: pg_createsubscriber.c:1584 +#: pg_createsubscriber.c:1589 #, c-format msgid "waiting for the target server to reach the consistent state" msgstr "対象サーバーが一貫性のある状態に到達するのを待っています" -#: pg_createsubscriber.c:1602 +#: pg_createsubscriber.c:1607 #, c-format msgid "recovery timed out" msgstr "リカバリーがタイムアウトしました" -#: pg_createsubscriber.c:1615 +#: pg_createsubscriber.c:1620 #, c-format msgid "server did not end recovery" msgstr "サーバーはリカバリを完了しませんでした" -#: pg_createsubscriber.c:1617 +#: pg_createsubscriber.c:1622 #, c-format msgid "target server reached the consistent state" msgstr "対象サーバーが一貫性のある状態に到達しました" -#: pg_createsubscriber.c:1618 +#: pg_createsubscriber.c:1623 #, c-format msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." msgstr "もしpg_createsubscriberが今時点より後で失敗した場合は、作業を継続する前に物理レプリカを再作成する必要があります。" -#: pg_createsubscriber.c:1645 pg_createsubscriber.c:1776 +#: pg_createsubscriber.c:1650 pg_createsubscriber.c:1781 #, c-format msgid "could not obtain publication information: %s" msgstr "パブリケーション情報を取得できませんでした: %s" -#: pg_createsubscriber.c:1659 +#: pg_createsubscriber.c:1664 #, c-format msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"はすでに存在します" -#: pg_createsubscriber.c:1660 +#: pg_createsubscriber.c:1665 #, c-format msgid "Consider renaming this publication before continuing." msgstr "作業を継続する前にこのパブリケーションの名前を変更することを検討してください。" -#: pg_createsubscriber.c:1668 +#: pg_createsubscriber.c:1673 #, c-format msgid "dry-run: would create publication \"%s\" in database \"%s\"" msgstr "ドライラン: データベース\"%2$s\"にパブリケーション\"%1$s\"が作成されます" -#: pg_createsubscriber.c:1671 +#: pg_createsubscriber.c:1676 #, c-format msgid "creating publication \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"でパブリケーション\"%1$s\"を作成します" -#: pg_createsubscriber.c:1684 +#: pg_createsubscriber.c:1689 #, c-format msgid "could not create publication \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"でパブリケーション\"%1$s\"を作成できませんでした: %3$s" -#: pg_createsubscriber.c:1715 +#: pg_createsubscriber.c:1720 #, c-format msgid "dry-run: would drop publication \"%s\" in database \"%s\"" msgstr "ドライラン: データベース\"%2$s\"のパブリケーション\"%1$s\"が削除されます" -#: pg_createsubscriber.c:1718 +#: pg_createsubscriber.c:1723 #, c-format msgid "dropping publication \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のパブリケーション\"%1$s\"を削除します" -#: pg_createsubscriber.c:1732 +#: pg_createsubscriber.c:1737 #, c-format msgid "could not drop publication \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"のパブリケーション\"%1$s\"が削除できませんでした: %3$s" -#: pg_createsubscriber.c:1769 +#: pg_createsubscriber.c:1774 #, c-format msgid "dropping all existing publications in database \"%s\"" msgstr "データベース\"%s\"のすべてのパブリケーションを削除します" -#: pg_createsubscriber.c:1828 +#: pg_createsubscriber.c:1833 #, c-format msgid "dry-run: would create subscription \"%s\" in database \"%s\"" msgstr "ドライラン: データベース\"%2$s\"にサブスクリプション\"%1$s\"が作成されます" -#: pg_createsubscriber.c:1831 +#: pg_createsubscriber.c:1836 #, c-format msgid "creating subscription \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"でサブスクリプション\"%1$s\"を作成します" -#: pg_createsubscriber.c:1853 +#: pg_createsubscriber.c:1858 #, c-format msgid "could not create subscription \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"でサブスクリプション\"%1$s\"を作成できませんでした: %3$s" -#: pg_createsubscriber.c:1898 +#: pg_createsubscriber.c:1903 #, c-format msgid "could not obtain subscription OID: %s" msgstr "サブスクリプションOIDが取得できませんでした: %s" -#: pg_createsubscriber.c:1905 +#: pg_createsubscriber.c:1910 #, c-format msgid "could not obtain subscription OID: got %d rows, expected %d row" msgstr "サブスクリプションOIDが取得できませんでした: 受信したのは%d行、想定は%d行" -#: pg_createsubscriber.c:1930 +#: pg_createsubscriber.c:1935 #, c-format msgid "dry-run: would set the replication progress (node name \"%s\", LSN %s) in database \"%s\"" msgstr "ドライラン: データベース\"%3$s\"のレプリケーション進捗が設定されます(ノード名\"%1$s\", LSN %2$s)" -#: pg_createsubscriber.c:1933 +#: pg_createsubscriber.c:1938 #, c-format msgid "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"" msgstr "データベース\"%3$s\"でのレプリケーションの進捗を設定しています(ノード名\"%1$s\", LSN %2$s)" -#: pg_createsubscriber.c:1948 +#: pg_createsubscriber.c:1953 #, c-format msgid "could not set replication progress for subscription \"%s\": %s" msgstr "サブスクリプション\"%s\"にレプリケーション進捗を設定できませんでした: %s" -#: pg_createsubscriber.c:1980 +#: pg_createsubscriber.c:1985 #, c-format msgid "dry-run: would enable subscription \"%s\" in database \"%s\"" msgstr "ドライラン: データベース\"%2$s\"のサブスクリプション\"%1$s\"が有効にされます" -#: pg_createsubscriber.c:1983 +#: pg_createsubscriber.c:1988 #, c-format msgid "enabling subscription \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のサブスクリプション\"%1$s\"を有効にします" -#: pg_createsubscriber.c:1995 +#: pg_createsubscriber.c:2000 #, c-format msgid "could not enable subscription \"%s\": %s" msgstr "サブスクリプション\"%s\"を有効化できませんでした: %s" -#: pg_createsubscriber.c:2041 +#: pg_createsubscriber.c:2046 #, c-format msgid "could not obtain a list of databases: %s" msgstr "データベースの一覧を取得できませんでした: %s" -#: pg_createsubscriber.c:2145 +#: pg_createsubscriber.c:2150 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\"では実行できません" -#: pg_createsubscriber.c:2146 +#: pg_createsubscriber.c:2151 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "PostgreSQLのスーパーユーザーで%sを実行しなければなりません" -#: pg_createsubscriber.c:2169 +#: pg_createsubscriber.c:2174 #, c-format msgid "database \"%s\" specified more than once for -d/--database" msgstr "-d/--database に対してデータベース\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2210 +#: pg_createsubscriber.c:2215 #, c-format msgid "publication \"%s\" specified more than once for --publication" msgstr "--publication に対してパブリケーション\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2219 +#: pg_createsubscriber.c:2224 #, c-format msgid "replication slot \"%s\" specified more than once for --replication-slot" msgstr "--replication-slot に対してレプリケーションスロット\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2228 +#: pg_createsubscriber.c:2233 #, c-format msgid "subscription \"%s\" specified more than once for --subscription" msgstr "--subscription に対してブスクリプション\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2234 +#: pg_createsubscriber.c:2239 #, c-format msgid "object type \"%s\" specified more than once for --clean" msgstr "--clean に対してオブジェクト種別\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2259 +#: pg_createsubscriber.c:2264 #, c-format msgid "options %s and %s cannot be used together" msgstr "オプション %s と %s は同時には使用できません" -#: pg_createsubscriber.c:2278 +#: pg_createsubscriber.c:2283 #, c-format msgid "no subscriber data directory specified" msgstr "サブスクライバのデータディレクトリが指定されていません" -#: pg_createsubscriber.c:2289 +#: pg_createsubscriber.c:2294 #, c-format msgid "could not determine current directory" msgstr "カレントディレクトリを特定できませんでした" -#: pg_createsubscriber.c:2306 +#: pg_createsubscriber.c:2311 #, c-format msgid "no publisher connection string specified" msgstr "パブリッシャの接続文字列が指定されていません" -#: pg_createsubscriber.c:2310 +#: pg_createsubscriber.c:2315 #, c-format msgid "validating publisher connection string" msgstr "パブリッシャの接続文字列の検証中" -#: pg_createsubscriber.c:2316 +#: pg_createsubscriber.c:2321 #, c-format msgid "validating subscriber connection string" msgstr "サブスクライバの接続文字列の検証中" -#: pg_createsubscriber.c:2333 +#: pg_createsubscriber.c:2338 #, c-format msgid "no database was specified" msgstr "データベースが指定されていません" -#: pg_createsubscriber.c:2344 +#: pg_createsubscriber.c:2349 #, c-format msgid "database name \"%s\" was extracted from the publisher connection string" msgstr "データベース名\"%s\"がパブリッシャの接続文字列から抽出されました" -#: pg_createsubscriber.c:2349 +#: pg_createsubscriber.c:2354 #, c-format msgid "no database name specified" msgstr "データベース名が指定されていません" -#: pg_createsubscriber.c:2359 +#: pg_createsubscriber.c:2364 #, c-format msgid "wrong number of publication names specified" msgstr "指定されたパブリケーション名の数が間違っています" -#: pg_createsubscriber.c:2360 +#: pg_createsubscriber.c:2365 #, c-format msgid "The number of specified publication names (%d) must match the number of specified database names (%d)." msgstr "パブリケーション名の数(%d)はデータベース名の数(%d)と一致している必要があります。" -#: pg_createsubscriber.c:2366 +#: pg_createsubscriber.c:2371 #, c-format msgid "wrong number of subscription names specified" msgstr "指定されたサブスクリプション名の数が間違っています" -#: pg_createsubscriber.c:2367 +#: pg_createsubscriber.c:2372 #, c-format msgid "The number of specified subscription names (%d) must match the number of specified database names (%d)." msgstr "サブスクリプション名の数(%d)はデータベース名の数(%d)と一致している必要があります。" -#: pg_createsubscriber.c:2373 +#: pg_createsubscriber.c:2378 #, c-format msgid "wrong number of replication slot names specified" msgstr "指定されたレプリケーションスロット名の数が間違っています" -#: pg_createsubscriber.c:2374 +#: pg_createsubscriber.c:2379 #, c-format msgid "The number of specified replication slot names (%d) must match the number of specified database names (%d)." msgstr "レプリケーションスロット名の数(%d)はデータベース名の数(%d)と一致している必要があります。" -#: pg_createsubscriber.c:2386 +#: pg_createsubscriber.c:2391 #, c-format msgid "invalid object type \"%s\" specified for %s" msgstr "%2$s に対して指定された不正なオブジェクト種別\"%1$s\"" -#: pg_createsubscriber.c:2388 +#: pg_createsubscriber.c:2393 #, c-format msgid "The valid value is: \"%s\"" msgstr "指定可能な値は: \"%s\"" -#: pg_createsubscriber.c:2419 +#: pg_createsubscriber.c:2424 #, c-format msgid "subscriber data directory is not a copy of the source database cluster" msgstr "サブスクライバのデータディレクトリは元データベースクラスタのコピーではありません" -#: pg_createsubscriber.c:2432 +#: pg_createsubscriber.c:2437 #, c-format msgid "standby server is running" msgstr "スタンバイサーバーが稼働中です" -#: pg_createsubscriber.c:2433 +#: pg_createsubscriber.c:2438 #, c-format msgid "Stop the standby server and try again." msgstr "このスタンバイサーバーを停止してから再試行してください。" -#: pg_createsubscriber.c:2442 +#: pg_createsubscriber.c:2447 #, c-format msgid "starting the standby server with command-line options" msgstr "コマンドラインオプションを指定してスタンバイサーバーを起動しています" -#: pg_createsubscriber.c:2458 pg_createsubscriber.c:2493 +#: pg_createsubscriber.c:2463 pg_createsubscriber.c:2498 #, c-format msgid "stopping the subscriber" msgstr "サブスクライバを起動しています" -#: pg_createsubscriber.c:2472 +#: pg_createsubscriber.c:2477 #, c-format msgid "starting the subscriber" msgstr "サブスクライバを起動しています" -#: pg_createsubscriber.c:2501 +#: pg_createsubscriber.c:2506 #, c-format msgid "Done!" msgstr "完了!" @@ -2749,3 +2775,6 @@ msgstr "圧縮ストリームをクローズできませんでした" #~ msgid "options %s and -a/--all cannot be used together" #~ msgstr "%s と -a/--all は同時には使用できません" + +#~ msgid "tar file trailer exceeds 2 blocks" +#~ msgstr "tarファイル後続ブロックが2ブロックを超えています" diff --git a/src/bin/pg_basebackup/po/ru.po b/src/bin/pg_basebackup/po/ru.po index cd458fb7f18..c5eedd5f3f2 100644 --- a/src/bin/pg_basebackup/po/ru.po +++ b/src/bin/pg_basebackup/po/ru.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_basebackup (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:57+0200\n" -"PO-Revision-Date: 2026-02-07 09:24+0200\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:48+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -40,8 +40,8 @@ msgstr "подсказка: " #: ../../common/compression.c:132 ../../common/compression.c:141 #: ../../common/compression.c:150 ../../fe_utils/astreamer_gzip.c:140 #: ../../fe_utils/astreamer_gzip.c:273 ../../fe_utils/astreamer_lz4.c:102 -#: ../../fe_utils/astreamer_lz4.c:300 ../../fe_utils/astreamer_zstd.c:133 -#: ../../fe_utils/astreamer_zstd.c:288 +#: ../../fe_utils/astreamer_lz4.c:300 ../../fe_utils/astreamer_zstd.c:130 +#: ../../fe_utils/astreamer_zstd.c:285 #, c-format msgid "this build does not support compression with %s" msgstr "эта сборка программы не поддерживает сжатие %s" @@ -111,7 +111,8 @@ msgid "could not read file \"%s\": read %d of %zu" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)" #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 -#: ../../fe_utils/astreamer_file.c:141 pg_recvlogical.c:653 +#: ../../fe_utils/astreamer_file.c:141 ../../fe_utils/astreamer_file.c:282 +#: pg_recvlogical.c:657 #, c-format msgid "could not close file \"%s\": %m" msgstr "не удалось закрыть файл \"%s\": %m" @@ -153,24 +154,34 @@ msgstr "не удалось записать файл \"%s\": %m" msgid "could not fsync file \"%s\": %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/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" #: ../../common/file_utils.c:123 ../../common/file_utils.c:588 -#: pg_receivewal.c:319 pg_recvlogical.c:354 +#: pg_receivewal.c:319 pg_recvlogical.c:358 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалось получить информацию о файле \"%s\": %m" @@ -228,40 +239,50 @@ msgstr "не удалось перезапуститься с ограничен msgid "could not get exit code from subprocess: error code %lu" msgstr "не удалось получить код выхода от подпроцесса (код ошибки: %lu)" -#: ../../fe_utils/astreamer_file.c:96 ../../fe_utils/astreamer_file.c:364 +#: ../../fe_utils/astreamer_file.c:96 ../../fe_utils/astreamer_file.c:378 #: ../../fe_utils/recovery_gen.c:153 pg_basebackup.c:1498 pg_basebackup.c:1707 #, c-format msgid "could not create file \"%s\": %m" msgstr "не удалось создать файл \"%s\": %m" -#: ../../fe_utils/astreamer_file.c:124 ../../fe_utils/astreamer_file.c:261 +#: ../../fe_utils/astreamer_file.c:124 ../../fe_utils/astreamer_file.c:273 #: ../../fe_utils/recovery_gen.c:144 pg_basebackup.c:1434 pg_basebackup.c:1728 #, c-format msgid "could not write to file \"%s\": %m" msgstr "не удалось записать в файл \"%s\": %m" -#: ../../fe_utils/astreamer_file.c:278 +#: ../../fe_utils/astreamer_file.c:222 ../../fe_utils/astreamer_tar.c:309 +#, c-format +msgid "tar member has unsafe path name: \"%s\"" +msgstr "компонент tar имеет небезопасный путь: \"%s\"" + +#: ../../fe_utils/astreamer_file.c:251 +#, c-format +msgid "link target has unsafe path name: \"%s\"" +msgstr "цель ссылки имеет небезопасный путь: \"%s\"" + +#: ../../fe_utils/astreamer_file.c:292 #, c-format msgid "unexpected state while extracting archive" msgstr "неожиданное состояние при извлечении архива" -#: ../../fe_utils/astreamer_file.c:324 pg_basebackup.c:699 pg_basebackup.c:713 +#: ../../fe_utils/astreamer_file.c:338 pg_basebackup.c:699 pg_basebackup.c:713 #: pg_basebackup.c:758 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не удалось создать каталог \"%s\": %m" -#: ../../fe_utils/astreamer_file.c:329 +#: ../../fe_utils/astreamer_file.c:343 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "не удалось установить права для каталога \"%s\": %m" -#: ../../fe_utils/astreamer_file.c:348 +#: ../../fe_utils/astreamer_file.c:362 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "не удалось создать символическую ссылку \"%s\" в \"%s\": %m" -#: ../../fe_utils/astreamer_file.c:368 +#: ../../fe_utils/astreamer_file.c:382 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "не удалось установить права доступа для файла \"%s\": %m" @@ -302,7 +323,7 @@ msgid "could not initialize compression library" msgstr "не удалось инициализировать библиотеку сжатия" #: ../../fe_utils/astreamer_gzip.c:320 ../../fe_utils/astreamer_lz4.c:356 -#: ../../fe_utils/astreamer_zstd.c:333 +#: ../../fe_utils/astreamer_zstd.c:330 #, c-format msgid "could not decompress data: %s" msgstr "не удалось распаковать данные: %s" @@ -317,8 +338,8 @@ msgstr "не удалось создать контекст сжатия lz4: %s msgid "could not write lz4 header: %s" msgstr "не удалось записать заголовок lz4: %s" -#: ../../fe_utils/astreamer_lz4.c:191 ../../fe_utils/astreamer_zstd.c:185 -#: ../../fe_utils/astreamer_zstd.c:227 +#: ../../fe_utils/astreamer_lz4.c:191 ../../fe_utils/astreamer_zstd.c:182 +#: ../../fe_utils/astreamer_zstd.c:224 #, c-format msgid "could not compress data: %s" msgstr "не удалось сжать данные: %s" @@ -333,22 +354,27 @@ msgstr "не удалось завершить сжатие lz4: %s" msgid "could not initialize compression library: %s" msgstr "не удалось инициализировать библиотеку сжатия: %s" -#: ../../fe_utils/astreamer_tar.c:244 -#, c-format -msgid "tar file trailer exceeds 2 blocks" -msgstr "окончание файла tar занимает больше 2 блоков" - -#: ../../fe_utils/astreamer_tar.c:249 +#: ../../fe_utils/astreamer_tar.c:254 #, c-format msgid "unexpected state while parsing tar archive" msgstr "неожиданное состояние при разборе архива tar" -#: ../../fe_utils/astreamer_tar.c:292 +#: ../../fe_utils/astreamer_tar.c:300 +#, c-format +msgid "input file does not appear to be a valid tar archive" +msgstr "входной файл не похож на архив tar" + +#: ../../fe_utils/astreamer_tar.c:307 #, c-format msgid "tar member has empty name" msgstr "пустое имя у компонента tar" -#: ../../fe_utils/astreamer_tar.c:326 +#: ../../fe_utils/astreamer_tar.c:332 +#, c-format +msgid "pax extensions to tar format are not supported" +msgstr "расширения PAX для формата tar не поддерживаются" + +#: ../../fe_utils/astreamer_tar.c:361 #, c-format msgid "COPY stream ended before last file was finished" msgstr "поток COPY закончился до завершения последнего файла" @@ -368,12 +394,12 @@ msgstr "не удалось установить для zstd уровень сж msgid "could not set compression worker count to %d: %s" msgstr "не удалось установить число потоков сжатия %d: %s" -#: ../../fe_utils/astreamer_zstd.c:120 +#: ../../fe_utils/astreamer_zstd.c:119 #, c-format msgid "could not enable long-distance mode: %s" msgstr "не удалось включить режим большой дистанции: %s" -#: ../../fe_utils/astreamer_zstd.c:279 +#: ../../fe_utils/astreamer_zstd.c:276 #, c-format msgid "could not create zstd decompression context" msgstr "не удалось создать контекст распаковки zstd" @@ -520,13 +546,13 @@ msgstr "" "%s делает базовую резервную копию работающего сервера PostgreSQL.\n" "\n" -#: pg_basebackup.c:394 pg_createsubscriber.c:246 pg_receivewal.c:79 +#: pg_basebackup.c:394 pg_createsubscriber.c:245 pg_receivewal.c:79 #: pg_recvlogical.c:85 #, c-format msgid "Usage:\n" msgstr "Использование:\n" -#: pg_basebackup.c:395 pg_createsubscriber.c:247 pg_receivewal.c:80 +#: pg_basebackup.c:395 pg_createsubscriber.c:246 pg_receivewal.c:80 #: pg_recvlogical.c:86 #, c-format msgid " %s [OPTION]...\n" @@ -821,7 +847,7 @@ msgid "" msgstr "" " -W, --password запрашивать пароль всегда (обычно не требуется)\n" -#: pg_basebackup.c:448 pg_createsubscriber.c:270 pg_receivewal.c:106 +#: pg_basebackup.c:448 pg_createsubscriber.c:269 pg_receivewal.c:106 #: pg_recvlogical.c:120 #, c-format msgid "" @@ -831,7 +857,7 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: pg_basebackup.c:449 pg_createsubscriber.c:271 pg_receivewal.c:107 +#: pg_basebackup.c:449 pg_createsubscriber.c:270 pg_receivewal.c:107 #: pg_recvlogical.c:121 #, c-format msgid "%s home page: <%s>\n" @@ -883,7 +909,7 @@ msgstr "не удалось создать фоновый поток выпол msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" существует, но он не пуст" -#: pg_basebackup.c:783 pg_createsubscriber.c:420 +#: pg_basebackup.c:783 pg_createsubscriber.c:419 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ошибка при обращении к каталогу \"%s\": %m" @@ -947,8 +973,8 @@ msgstr "скорость передачи \"%s\" вне диапазона" msgid "could not get COPY data stream: %s" msgstr "не удалось получить поток данных COPY: %s" -#: pg_basebackup.c:1040 pg_recvlogical.c:451 pg_recvlogical.c:627 -#: receivelog.c:980 +#: pg_basebackup.c:1040 pg_recvlogical.c:455 pg_recvlogical.c:631 +#: receivelog.c:986 #, c-format msgid "could not read COPY data: %s" msgstr "не удалось прочитать данные COPY: %s" @@ -1043,9 +1069,9 @@ msgstr "Укажите -X none или -X fetch для отключения тр msgid "server does not support incremental backup" msgstr "сервер не поддерживает инкрементальное копирование" -#: pg_basebackup.c:1851 pg_basebackup.c:2009 pg_recvlogical.c:274 -#: receivelog.c:542 receivelog.c:581 streamutil.c:296 streamutil.c:370 -#: streamutil.c:422 streamutil.c:510 streamutil.c:667 streamutil.c:712 +#: pg_basebackup.c:1851 pg_basebackup.c:2009 pg_recvlogical.c:278 +#: receivelog.c:541 receivelog.c:587 streamutil.c:296 streamutil.c:370 +#: streamutil.c:422 streamutil.c:511 streamutil.c:672 streamutil.c:717 #, c-format msgid "could not send replication command \"%s\": %s" msgstr "не удалось передать команду репликации \"%s\": %s" @@ -1250,21 +1276,21 @@ msgstr "" #: pg_basebackup.c:2713 pg_basebackup.c:2725 pg_basebackup.c:2737 #: pg_basebackup.c:2745 pg_basebackup.c:2758 pg_basebackup.c:2764 #: pg_basebackup.c:2773 pg_basebackup.c:2785 pg_basebackup.c:2796 -#: pg_basebackup.c:2804 pg_createsubscriber.c:2238 pg_createsubscriber.c:2261 -#: pg_createsubscriber.c:2271 pg_createsubscriber.c:2279 -#: pg_createsubscriber.c:2307 pg_createsubscriber.c:2350 pg_receivewal.c:748 +#: pg_basebackup.c:2804 pg_createsubscriber.c:2237 pg_createsubscriber.c:2260 +#: pg_createsubscriber.c:2270 pg_createsubscriber.c:2278 +#: pg_createsubscriber.c:2306 pg_createsubscriber.c:2349 pg_receivewal.c:748 #: pg_receivewal.c:760 pg_receivewal.c:767 pg_receivewal.c:776 -#: pg_receivewal.c:783 pg_receivewal.c:793 pg_recvlogical.c:861 -#: pg_recvlogical.c:873 pg_recvlogical.c:883 pg_recvlogical.c:890 -#: pg_recvlogical.c:897 pg_recvlogical.c:904 pg_recvlogical.c:911 -#: pg_recvlogical.c:918 pg_recvlogical.c:925 pg_recvlogical.c:934 -#: pg_recvlogical.c:941 +#: pg_receivewal.c:783 pg_receivewal.c:793 pg_recvlogical.c:865 +#: pg_recvlogical.c:877 pg_recvlogical.c:887 pg_recvlogical.c:894 +#: pg_recvlogical.c:901 pg_recvlogical.c:908 pg_recvlogical.c:915 +#: pg_recvlogical.c:922 pg_recvlogical.c:929 pg_recvlogical.c:938 +#: pg_recvlogical.c:945 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Для дополнительной информации попробуйте \"%s --help\"." -#: pg_basebackup.c:2585 pg_createsubscriber.c:2269 pg_receivewal.c:758 -#: pg_recvlogical.c:871 +#: pg_basebackup.c:2585 pg_createsubscriber.c:2268 pg_receivewal.c:758 +#: pg_recvlogical.c:875 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" @@ -1371,32 +1397,32 @@ msgstr "" "Целевой сервер больше не может использоваться как физическая реплика. Чтобы " "продолжить, физическую реплику необходимо пересоздать." -#: pg_createsubscriber.c:221 +#: pg_createsubscriber.c:220 #, c-format msgid "" "publication \"%s\" created in database \"%s\" on primary was left behind" msgstr "на главном сервере осталась публикация \"%s\", созданная в базе \"%s\"" -#: pg_createsubscriber.c:224 +#: pg_createsubscriber.c:223 #, c-format msgid "Drop this publication before trying again." msgstr "Удалите эту публикацию и попробуйте повторить операцию." -#: pg_createsubscriber.c:228 +#: pg_createsubscriber.c:227 #, c-format msgid "" "replication slot \"%s\" created in database \"%s\" on primary was left behind" msgstr "" "на главном сервере остался слот репликации \"%s\", созданный в базе \"%s\"" -#: pg_createsubscriber.c:231 pg_createsubscriber.c:1324 +#: pg_createsubscriber.c:230 pg_createsubscriber.c:1328 #, c-format msgid "Drop this replication slot soon to avoid retention of WAL files." msgstr "" "Удалите этот слот репликации незамедлительно во избежание накопления файлов " "WAL." -#: pg_createsubscriber.c:244 +#: pg_createsubscriber.c:243 #, c-format msgid "" "%s creates a new logical replica from a standby server.\n" @@ -1405,7 +1431,7 @@ msgstr "" "%s превращает резервный сервер в логическую реплику.\n" "\n" -#: pg_createsubscriber.c:248 pg_receivewal.c:81 pg_recvlogical.c:91 +#: pg_createsubscriber.c:247 pg_receivewal.c:81 pg_recvlogical.c:91 #, c-format msgid "" "\n" @@ -1414,7 +1440,7 @@ msgstr "" "\n" "Параметры:\n" -#: pg_createsubscriber.c:249 +#: pg_createsubscriber.c:248 #, c-format msgid "" " -a, --all create subscriptions for all databases " @@ -1426,7 +1452,7 @@ msgstr "" "кроме шаблонов\n" " и баз данных, не допускающих подключения\n" -#: pg_createsubscriber.c:251 +#: pg_createsubscriber.c:250 #, c-format msgid "" " -d, --database=DBNAME database in which to create a " @@ -1434,7 +1460,7 @@ msgid "" msgstr "" " -d, --database=ИМЯ_БД база, в которой будет создана подписка\n" -#: pg_createsubscriber.c:252 +#: pg_createsubscriber.c:251 #, c-format msgid "" " -D, --pgdata=DATADIR location for the subscriber data " @@ -1442,7 +1468,7 @@ msgid "" msgstr "" " -D, --pgdata=КАТ_ДАННЫХ расположение каталога данных подписчика\n" -#: pg_createsubscriber.c:253 +#: pg_createsubscriber.c:252 #, c-format msgid "" " -n, --dry-run dry run, just show what would be done\n" @@ -1450,19 +1476,19 @@ msgstr "" " -n, --dry-run холостой запуск — только показать, какие\n" " действия будут выполнены\n" -#: pg_createsubscriber.c:254 +#: pg_createsubscriber.c:253 #, c-format msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" msgstr "" " -p, --subscriber-port=ПОРТ номер порта подписчика (по умолчанию: %s)\n" -#: pg_createsubscriber.c:255 +#: pg_createsubscriber.c:254 #, c-format msgid " -P, --publisher-server=CONNSTR publisher connection string\n" msgstr "" " -P, --publisher-server=СТРОКА строка подключения к серверу публикации\n" -#: pg_createsubscriber.c:256 +#: pg_createsubscriber.c:255 #, c-format msgid "" " -s, --socketdir=DIR socket directory to use (default current " @@ -1470,13 +1496,13 @@ msgid "" msgstr "" " -s, --socketdir=КАТАЛОГ каталог сокетов (по умолчанию текущий)\n" -#: pg_createsubscriber.c:257 +#: pg_createsubscriber.c:256 #, c-format msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" msgstr "" " -t, --recovery-timeout=СЕК время ожидания окончания восстановления\n" -#: pg_createsubscriber.c:258 +#: pg_createsubscriber.c:257 #, c-format msgid "" " -T, --enable-two-phase enable two-phase commit for all " @@ -1485,19 +1511,19 @@ msgstr "" " -T, --enable-two-phase включить двухфазную фиксацию для всех " "подписок\n" -#: pg_createsubscriber.c:259 +#: pg_createsubscriber.c:258 #, c-format msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" msgstr "" " -U, --subscriber-username=ИМЯ имя пользователя для подключения " "подписчика\n" -#: pg_createsubscriber.c:260 +#: pg_createsubscriber.c:259 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose выводить подробные сообщения\n" -#: pg_createsubscriber.c:261 +#: pg_createsubscriber.c:260 #, c-format msgid "" " --clean=OBJECTTYPE drop all objects of the specified type " @@ -1509,7 +1535,7 @@ msgstr "" "указанных\n" " баз на подписчике; принимает: \"%s\"\n" -#: pg_createsubscriber.c:263 +#: pg_createsubscriber.c:262 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -1519,215 +1545,215 @@ msgstr "" " конфигурации сервера при запуске целевого\n" " кластера\n" -#: pg_createsubscriber.c:265 +#: pg_createsubscriber.c:264 #, c-format msgid " --publication=NAME publication name\n" msgstr " --publication=ИМЯ имя публикации\n" -#: pg_createsubscriber.c:266 +#: pg_createsubscriber.c:265 #, c-format msgid " --replication-slot=NAME replication slot name\n" msgstr " --replication-slot=ИМЯ имя слота репликации\n" -#: pg_createsubscriber.c:267 +#: pg_createsubscriber.c:266 #, c-format msgid " --subscription=NAME subscription name\n" msgstr " --subscription=ИМЯ имя подписки\n" -#: pg_createsubscriber.c:268 +#: pg_createsubscriber.c:267 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: pg_createsubscriber.c:269 +#: pg_createsubscriber.c:268 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: pg_createsubscriber.c:312 +#: pg_createsubscriber.c:311 #, c-format msgid "could not parse connection string: %s" msgstr "не удалось разобрать строку подключения: %s" -#: pg_createsubscriber.c:389 +#: pg_createsubscriber.c:388 #, c-format msgid "" "program \"%s\" is needed by %s but was not found in the same directory as " "\"%s\"" msgstr "программа \"%s\" нужна для %s, но она не найдена в каталоге \"%s\"" -#: pg_createsubscriber.c:392 +#: pg_createsubscriber.c:391 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "" "программа \"%s\" найдена программой \"%s\", но её версия отличается от " "версии %s" -#: pg_createsubscriber.c:412 +#: pg_createsubscriber.c:411 #, c-format msgid "checking if directory \"%s\" is a cluster data directory" msgstr "проверяется, является ли каталог \"%s\" каталогом данных кластера" -#: pg_createsubscriber.c:418 +#: pg_createsubscriber.c:417 #, c-format msgid "data directory \"%s\" does not exist" msgstr "каталог данных \"%s\" не существует" -#: pg_createsubscriber.c:426 +#: pg_createsubscriber.c:425 #, c-format msgid "directory \"%s\" is not a database cluster directory" msgstr "каталог \"%s\" не является каталогом кластера баз данных" -#: pg_createsubscriber.c:544 +#: pg_createsubscriber.c:543 #, c-format msgid "connection to database failed: %s" msgstr "не удалось подключиться к базе: %s" -#: pg_createsubscriber.c:557 streamutil.c:230 +#: pg_createsubscriber.c:556 streamutil.c:230 #, c-format msgid "could not clear \"search_path\": %s" msgstr "не удалось очистить \"search_path\": %s" -#: pg_createsubscriber.c:597 +#: pg_createsubscriber.c:596 #, c-format msgid "getting system identifier from publisher" msgstr "получение идентификатора системы с сервера публикации" -#: pg_createsubscriber.c:604 +#: pg_createsubscriber.c:603 #, c-format msgid "could not get system identifier: %s" msgstr "не удалось получить идентификатор системы: %s" -#: pg_createsubscriber.c:610 +#: pg_createsubscriber.c:609 #, c-format msgid "could not get system identifier: got %d rows, expected %d row" msgstr "" "не удалось получить идентификатор системы; получено строк: %d, ожидалось: %d" -#: pg_createsubscriber.c:617 +#: pg_createsubscriber.c:616 #, c-format msgid "system identifier is % on publisher" msgstr "идентификатор системы на стороне публикации: %" -#: pg_createsubscriber.c:637 +#: pg_createsubscriber.c:636 #, c-format msgid "getting system identifier from subscriber" msgstr "получение идентификатора системы с подписчика" -#: pg_createsubscriber.c:641 pg_createsubscriber.c:670 +#: pg_createsubscriber.c:640 pg_createsubscriber.c:669 #, c-format msgid "control file appears to be corrupt" msgstr "управляющий файл, по-видимому, испорчен" -#: pg_createsubscriber.c:645 pg_createsubscriber.c:688 +#: pg_createsubscriber.c:644 pg_createsubscriber.c:687 #, c-format msgid "system identifier is % on subscriber" msgstr "идентификатор системы на подписчике: %" -#: pg_createsubscriber.c:666 +#: pg_createsubscriber.c:665 #, c-format msgid "modifying system identifier of subscriber" msgstr "изменение идентификатора системы на подписчике" -#: pg_createsubscriber.c:683 +#: pg_createsubscriber.c:682 #, c-format msgid "dry-run: would set system identifier to % on subscriber" msgstr "" "холостой запуск: на подписчике будет установлен идентификатор системы " "%" -#: pg_createsubscriber.c:693 +#: pg_createsubscriber.c:692 #, c-format msgid "dry-run: would run pg_resetwal on the subscriber" msgstr "холостой запуск: будет выполнен сброс WAL (pg_resetwal) на подписчике" -#: pg_createsubscriber.c:695 +#: pg_createsubscriber.c:694 #, c-format msgid "running pg_resetwal on the subscriber" msgstr "запуск pg_resetwal на подписчике" -#: pg_createsubscriber.c:707 +#: pg_createsubscriber.c:706 #, c-format msgid "successfully reset WAL on the subscriber" msgstr "WAL на подписчике сброшен успешно" -#: pg_createsubscriber.c:709 +#: pg_createsubscriber.c:708 #, c-format msgid "could not reset WAL on subscriber: %s" msgstr "не удалось сбросить WAL на подписчике: %s" -#: pg_createsubscriber.c:733 +#: pg_createsubscriber.c:732 #, c-format msgid "could not obtain database OID: %s" msgstr "получить OID базы данных не удалось: %s" -#: pg_createsubscriber.c:740 +#: pg_createsubscriber.c:739 #, c-format msgid "could not obtain database OID: got %d rows, expected %d row" msgstr "получить OID базы данных не удалось; получено строк: %d, ожидалось: %d" -#: pg_createsubscriber.c:812 +#: pg_createsubscriber.c:811 #, c-format msgid "create replication slot \"%s\" on publisher" msgstr "создаётся слот репликации \"%s\" на подписчике" -#: pg_createsubscriber.c:832 +#: pg_createsubscriber.c:831 #, c-format msgid "could not write an additional WAL record: %s" msgstr "не удалось записать дополнительную запись WAL: %s" -#: pg_createsubscriber.c:858 +#: pg_createsubscriber.c:857 #, c-format msgid "could not obtain recovery progress: %s" msgstr "не удалось получить состояние восстановления: %s" -#: pg_createsubscriber.c:891 +#: pg_createsubscriber.c:890 #, c-format msgid "checking settings on publisher" msgstr "проверка параметров на стороне публикации" -#: pg_createsubscriber.c:901 +#: pg_createsubscriber.c:900 #, c-format msgid "primary server cannot be in recovery" msgstr "главный сервер не должен быть в состоянии восстановления" -#: pg_createsubscriber.c:927 +#: pg_createsubscriber.c:926 #, c-format msgid "could not obtain publisher settings: %s" msgstr "не удалось получить параметры с сервера публикации: %s" -#: pg_createsubscriber.c:956 +#: pg_createsubscriber.c:955 #, c-format msgid "publisher requires \"wal_level\" >= \"logical\"" msgstr "на стороне публикации требуется значение \"wal_level\" >= \"logical\"" -#: pg_createsubscriber.c:962 +#: pg_createsubscriber.c:961 #, c-format msgid "publisher requires %d replication slots, but only %d remain" msgstr "" "на стороне публикации требуется слотов репликации: %d, но доступно всего %d" -#: pg_createsubscriber.c:964 pg_createsubscriber.c:973 -#: pg_createsubscriber.c:1083 pg_createsubscriber.c:1092 -#: pg_createsubscriber.c:1101 +#: pg_createsubscriber.c:963 pg_createsubscriber.c:972 +#: pg_createsubscriber.c:1082 pg_createsubscriber.c:1091 +#: pg_createsubscriber.c:1100 #, c-format msgid "Increase the configuration parameter \"%s\" to at least %d." msgstr "Увеличьте значение параметра конфигурации \"%s\" как минимум до %d." -#: pg_createsubscriber.c:971 +#: pg_createsubscriber.c:970 #, c-format msgid "publisher requires %d WAL sender processes, but only %d remain" msgstr "" "на стороне публикации требуется процессов-передатчиков WAL: %d, но доступно " "всего %d" -#: pg_createsubscriber.c:980 +#: pg_createsubscriber.c:979 #, c-format msgid "two_phase option will not be enabled for replication slots" msgstr "параметр two_phase для слотов репликации не будет включён" -#: pg_createsubscriber.c:981 +#: pg_createsubscriber.c:980 #, c-format msgid "" "Subscriptions will be created with the two_phase option disabled. Prepared " @@ -1736,7 +1762,7 @@ msgstr "" "Подписки будут созданы с отключённым параметром two_phase. Подготовленные " "транзакции будут реплицироваться в момент выполнения COMMIT PREPARED." -#: pg_createsubscriber.c:983 +#: pg_createsubscriber.c:982 #, c-format msgid "" "You can use the command-line option --enable-two-phase to enable two_phase." @@ -1744,12 +1770,12 @@ msgstr "" "Для включения режима two_phase можно использовать параметр командной строки " "--enable-two-phase." -#: pg_createsubscriber.c:993 +#: pg_createsubscriber.c:992 #, c-format msgid "required WAL could be removed from the publisher" msgstr "нужные файлы WAL могли быть удалены с сервера публикации" -#: pg_createsubscriber.c:994 +#: pg_createsubscriber.c:993 #, c-format msgid "" "Set the configuration parameter \"%s\" to -1 to ensure that required WAL " @@ -1758,70 +1784,70 @@ msgstr "" "Чтобы необходимые файлы WAL не были удалены преждевременно, присвойте " "параметру конфигурации \"%s\" -1." -#: pg_createsubscriber.c:1026 +#: pg_createsubscriber.c:1025 #, c-format msgid "checking settings on subscriber" msgstr "проверка параметров на подписчике" -#: pg_createsubscriber.c:1033 +#: pg_createsubscriber.c:1032 #, c-format msgid "target server must be a standby" msgstr "целевой сервер должен быть резервным" -#: pg_createsubscriber.c:1057 +#: pg_createsubscriber.c:1056 #, c-format msgid "could not obtain subscriber settings: %s" msgstr "получить параметры подписчика не удалось: %s" -#: pg_createsubscriber.c:1081 +#: pg_createsubscriber.c:1080 #, c-format msgid "subscriber requires %d active replication origins, but only %d remain" msgstr "" "подписчику требуется активных слотов репликации: %d, но доступно всего %d" -#: pg_createsubscriber.c:1090 +#: pg_createsubscriber.c:1089 #, c-format msgid "subscriber requires %d logical replication workers, but only %d remain" msgstr "" "подписчику требуется процессов логической репликации: %d, но доступно всего " "%d" -#: pg_createsubscriber.c:1099 +#: pg_createsubscriber.c:1098 #, c-format msgid "subscriber requires %d worker processes, but only %d remain" msgstr "подписчику требуется рабочих процессов: %d, но доступно всего %d" -#: pg_createsubscriber.c:1135 +#: pg_createsubscriber.c:1139 #, c-format msgid "dry-run: would drop subscription \"%s\" in database \"%s\"" msgstr "холостой запуск: будет удалена подписка \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1139 +#: pg_createsubscriber.c:1143 #, c-format msgid "dropping subscription \"%s\" in database \"%s\"" msgstr "удаление подписки \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1146 +#: pg_createsubscriber.c:1150 #, c-format msgid "could not drop subscription \"%s\": %s" msgstr "удалить подписку \"%s\" не получилось: %s" -#: pg_createsubscriber.c:1181 +#: pg_createsubscriber.c:1185 #, c-format msgid "could not obtain pre-existing subscriptions: %s" msgstr "получить уже существующие подписки не удалось: %s" -#: pg_createsubscriber.c:1322 +#: pg_createsubscriber.c:1326 #, c-format msgid "could not drop replication slot \"%s\" on primary" msgstr "удалить слот репликации \"%s\" на главном сервере не получилось" -#: pg_createsubscriber.c:1356 +#: pg_createsubscriber.c:1360 #, c-format msgid "could not obtain failover replication slot information: %s" msgstr "получить информацию о переносимом слоте репликации не удалось: %s" -#: pg_createsubscriber.c:1358 pg_createsubscriber.c:1367 +#: pg_createsubscriber.c:1362 pg_createsubscriber.c:1371 #, c-format msgid "" "Drop the failover replication slots on subscriber soon to avoid retention of " @@ -1830,12 +1856,12 @@ msgstr "" "Удалите переносимые слоты репликации на подписчике незамедлительно во " "избежание накопления файлов WAL." -#: pg_createsubscriber.c:1366 +#: pg_createsubscriber.c:1370 #, c-format msgid "could not drop failover replication slot" msgstr "удалить переносимый слот репликации не получилось" -#: pg_createsubscriber.c:1389 +#: pg_createsubscriber.c:1393 #, c-format msgid "" "dry-run: would create the replication slot \"%s\" in database \"%s\" on " @@ -1844,42 +1870,42 @@ msgstr "" "холостой запуск: будет создан слот репликации \"%s\" в базе \"%s\" на " "стороне публикации" -#: pg_createsubscriber.c:1392 +#: pg_createsubscriber.c:1396 #, c-format msgid "creating the replication slot \"%s\" in database \"%s\" on publisher" msgstr "создание слота репликации \"%s\" в базе \"%s\" на стороне публикации" -#: pg_createsubscriber.c:1411 +#: pg_createsubscriber.c:1415 #, c-format msgid "could not create replication slot \"%s\" in database \"%s\": %s" msgstr "создать слот репликации \"%s\" в базе \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1442 +#: pg_createsubscriber.c:1446 #, c-format msgid "dry-run: would drop the replication slot \"%s\" in database \"%s\"" msgstr "холостой запуск: будет удалён слот репликации \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1445 +#: pg_createsubscriber.c:1449 #, c-format msgid "dropping the replication slot \"%s\" in database \"%s\"" msgstr "удаление слота репликации \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1461 +#: pg_createsubscriber.c:1465 #, c-format msgid "could not drop replication slot \"%s\" in database \"%s\": %s" msgstr "удалить слот репликации \"%s\" в базе \"%s\" не получилось: %s" -#: pg_createsubscriber.c:1482 +#: pg_createsubscriber.c:1485 #, c-format msgid "pg_ctl failed with exit code %d" msgstr "команда pg_ctl завершилась с кодом ошибки %d" -#: pg_createsubscriber.c:1487 +#: pg_createsubscriber.c:1490 #, c-format msgid "pg_ctl was terminated by exception 0x%X" msgstr "команда pg_ctl была прервана исключением 0x%X" -#: pg_createsubscriber.c:1489 +#: pg_createsubscriber.c:1492 #, c-format msgid "" "See C include file \"ntstatus.h\" for a description of the hexadecimal value." @@ -1887,52 +1913,52 @@ msgstr "" "Описание этого шестнадцатеричного значения ищите во включаемом C-файле " "\"ntstatus.h\"" -#: pg_createsubscriber.c:1491 +#: pg_createsubscriber.c:1494 #, c-format msgid "pg_ctl was terminated by signal %d: %s" msgstr "команда pg_ctl была завершена сигналом %d: %s" -#: pg_createsubscriber.c:1497 +#: pg_createsubscriber.c:1500 #, c-format msgid "pg_ctl exited with unrecognized status %d" msgstr "команда pg_ctl завершилась с нераспознанным кодом состояния %d" -#: pg_createsubscriber.c:1500 +#: pg_createsubscriber.c:1503 #, c-format msgid "The failed command was: %s" msgstr "Ошибку вызвала команда: %s" -#: pg_createsubscriber.c:1550 +#: pg_createsubscriber.c:1553 #, c-format msgid "server was started" msgstr "сервер был запущен" -#: pg_createsubscriber.c:1565 +#: pg_createsubscriber.c:1568 #, c-format msgid "server was stopped" msgstr "сервер был остановлен" -#: pg_createsubscriber.c:1584 +#: pg_createsubscriber.c:1587 #, c-format msgid "waiting for the target server to reach the consistent state" msgstr "ожидание достижения целевым сервером согласованного состояния" -#: pg_createsubscriber.c:1602 +#: pg_createsubscriber.c:1605 #, c-format msgid "recovery timed out" msgstr "тайм-аут при восстановлении" -#: pg_createsubscriber.c:1615 +#: pg_createsubscriber.c:1618 #, c-format msgid "server did not end recovery" msgstr "сервер не завершил восстановление" -#: pg_createsubscriber.c:1617 +#: pg_createsubscriber.c:1620 #, c-format msgid "target server reached the consistent state" msgstr "целевой сервер достиг согласованного состояния" -#: pg_createsubscriber.c:1618 +#: pg_createsubscriber.c:1621 #, c-format msgid "" "If pg_createsubscriber fails after this point, you must recreate the " @@ -1941,82 +1967,82 @@ msgstr "" "Если в работе pg_createsubscriber произойдёт сбой после этого момента, " "продолжение возможно только после пересоздания физической реплики." -#: pg_createsubscriber.c:1645 pg_createsubscriber.c:1776 +#: pg_createsubscriber.c:1648 pg_createsubscriber.c:1777 #, c-format msgid "could not obtain publication information: %s" msgstr "получить информацию о публикации не удалось: %s" -#: pg_createsubscriber.c:1659 +#: pg_createsubscriber.c:1662 #, c-format msgid "publication \"%s\" already exists" msgstr "публикация \"%s\" уже существует" -#: pg_createsubscriber.c:1660 +#: pg_createsubscriber.c:1663 #, c-format msgid "Consider renaming this publication before continuing." msgstr "Чтобы продолжить, её можно переименовать." -#: pg_createsubscriber.c:1668 +#: pg_createsubscriber.c:1671 #, c-format msgid "dry-run: would create publication \"%s\" in database \"%s\"" msgstr "холостой запуск: будет создана публикация \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1671 +#: pg_createsubscriber.c:1674 #, c-format msgid "creating publication \"%s\" in database \"%s\"" msgstr "создаётся публикация \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1684 +#: pg_createsubscriber.c:1687 #, c-format msgid "could not create publication \"%s\" in database \"%s\": %s" msgstr "создать публикацию \"%s\" в базе \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1715 +#: pg_createsubscriber.c:1717 #, c-format msgid "dry-run: would drop publication \"%s\" in database \"%s\"" msgstr "холостой запуск: будет удалена публикация \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1718 +#: pg_createsubscriber.c:1720 #, c-format msgid "dropping publication \"%s\" in database \"%s\"" msgstr "удаляется публикация \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1732 +#: pg_createsubscriber.c:1734 #, c-format msgid "could not drop publication \"%s\" in database \"%s\": %s" msgstr "удалить публикацию \"%s\" в базе \"%s\" не получилось: %s" -#: pg_createsubscriber.c:1769 +#: pg_createsubscriber.c:1770 #, c-format msgid "dropping all existing publications in database \"%s\"" msgstr "удаление всех существующих публикаций в базе \"%s\"" -#: pg_createsubscriber.c:1828 +#: pg_createsubscriber.c:1827 #, c-format msgid "dry-run: would create subscription \"%s\" in database \"%s\"" msgstr "холостой запуск: будет удалена подписка \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1831 +#: pg_createsubscriber.c:1830 #, c-format msgid "creating subscription \"%s\" in database \"%s\"" msgstr "создаётся подписка \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1853 +#: pg_createsubscriber.c:1852 #, c-format msgid "could not create subscription \"%s\" in database \"%s\": %s" msgstr "создать подписку \"%s\" в базе \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1898 +#: pg_createsubscriber.c:1897 #, c-format msgid "could not obtain subscription OID: %s" msgstr "получить OID подписки не удалось: %s" -#: pg_createsubscriber.c:1905 +#: pg_createsubscriber.c:1904 #, c-format msgid "could not obtain subscription OID: got %d rows, expected %d row" msgstr "получить OID подписки не удалось; получено строк: %d, ожидалось: %d" -#: pg_createsubscriber.c:1930 +#: pg_createsubscriber.c:1929 #, c-format msgid "" "dry-run: would set the replication progress (node name \"%s\", LSN %s) in " @@ -2025,124 +2051,124 @@ msgstr "" "холостой запуск: будет установлено состояние репликации (имя узла \"%s\", " "LSN %s) в базе \"%s\"" -#: pg_createsubscriber.c:1933 +#: pg_createsubscriber.c:1932 #, c-format msgid "" "setting the replication progress (node name \"%s\", LSN %s) in database " "\"%s\"" msgstr "отражение состояния репликации (имя узла \"%s\", LSN %s) в базе \"%s\"" -#: pg_createsubscriber.c:1948 +#: pg_createsubscriber.c:1947 #, c-format msgid "could not set replication progress for subscription \"%s\": %s" msgstr "не удалось передать состояние репликации для подписки \"%s\": %s" -#: pg_createsubscriber.c:1980 +#: pg_createsubscriber.c:1979 #, c-format msgid "dry-run: would enable subscription \"%s\" in database \"%s\"" msgstr "холостой запуск: будет включена подписка \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1983 +#: pg_createsubscriber.c:1982 #, c-format msgid "enabling subscription \"%s\" in database \"%s\"" msgstr "включение подписки \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1995 +#: pg_createsubscriber.c:1994 #, c-format msgid "could not enable subscription \"%s\": %s" msgstr "включить подписку \"%s\" не удалось: %s" -#: pg_createsubscriber.c:2041 +#: pg_createsubscriber.c:2040 #, c-format msgid "could not obtain a list of databases: %s" msgstr "не удалось получить список баз данных: %s" -#: pg_createsubscriber.c:2145 +#: pg_createsubscriber.c:2144 #, c-format msgid "cannot be executed by \"root\"" msgstr "программу не должен запускать root" -#: pg_createsubscriber.c:2146 +#: pg_createsubscriber.c:2145 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Запускать %s нужно от имени суперпользователя PostgreSQL." -#: pg_createsubscriber.c:2169 +#: pg_createsubscriber.c:2168 #, c-format msgid "database \"%s\" specified more than once for -d/--database" msgstr "база \"%s\" указана в -d/--database неоднократно" -#: pg_createsubscriber.c:2210 +#: pg_createsubscriber.c:2209 #, c-format msgid "publication \"%s\" specified more than once for --publication" msgstr "публикация \"%s\" указана в --publication неоднократно" -#: pg_createsubscriber.c:2219 +#: pg_createsubscriber.c:2218 #, c-format msgid "replication slot \"%s\" specified more than once for --replication-slot" msgstr "слот репликации \"%s\" указан в --replication-slot неоднократно" -#: pg_createsubscriber.c:2228 +#: pg_createsubscriber.c:2227 #, c-format msgid "subscription \"%s\" specified more than once for --subscription" msgstr "подписка \"%s\" указана в --subscription неоднократно" -#: pg_createsubscriber.c:2234 +#: pg_createsubscriber.c:2233 #, c-format msgid "object type \"%s\" specified more than once for --clean" msgstr "тип объекта \"%s\" указан в --clean неоднократно" -#: pg_createsubscriber.c:2259 +#: pg_createsubscriber.c:2258 #, c-format msgid "options %s and %s cannot be used together" msgstr "параметры %s и %s исключают друг друга" -#: pg_createsubscriber.c:2278 +#: pg_createsubscriber.c:2277 #, c-format msgid "no subscriber data directory specified" msgstr "каталог данных подписчика не указан" -#: pg_createsubscriber.c:2289 +#: pg_createsubscriber.c:2288 #, c-format msgid "could not determine current directory" msgstr "не удалось определить текущий каталог" -#: pg_createsubscriber.c:2306 +#: pg_createsubscriber.c:2305 #, c-format msgid "no publisher connection string specified" msgstr "строка подключения к серверу публикации не указана" -#: pg_createsubscriber.c:2310 +#: pg_createsubscriber.c:2309 #, c-format msgid "validating publisher connection string" msgstr "проверяется строка подключения к серверу публикации" -#: pg_createsubscriber.c:2316 +#: pg_createsubscriber.c:2315 #, c-format msgid "validating subscriber connection string" msgstr "проверяется строка подключения к подписчику" -#: pg_createsubscriber.c:2333 +#: pg_createsubscriber.c:2332 #, c-format msgid "no database was specified" msgstr "база данных не указана" -#: pg_createsubscriber.c:2344 +#: pg_createsubscriber.c:2343 #, c-format msgid "database name \"%s\" was extracted from the publisher connection string" msgstr "имя базы \"%s\" извлечено из строки подключения к серверу публикации" -#: pg_createsubscriber.c:2349 +#: pg_createsubscriber.c:2348 #, c-format msgid "no database name specified" msgstr "имя базы данных не указано" -#: pg_createsubscriber.c:2359 +#: pg_createsubscriber.c:2358 #, c-format msgid "wrong number of publication names specified" msgstr "указано неверное количество имён публикаций" -#: pg_createsubscriber.c:2360 +#: pg_createsubscriber.c:2359 #, c-format msgid "" "The number of specified publication names (%d) must match the number of " @@ -2151,12 +2177,12 @@ msgstr "" "Количество указанных имён публикаций (%d) должно совпадать с количеством " "указанных имён баз (%d)." -#: pg_createsubscriber.c:2366 +#: pg_createsubscriber.c:2365 #, c-format msgid "wrong number of subscription names specified" msgstr "указано неверное количество имён подписок" -#: pg_createsubscriber.c:2367 +#: pg_createsubscriber.c:2366 #, c-format msgid "" "The number of specified subscription names (%d) must match the number of " @@ -2165,12 +2191,12 @@ msgstr "" "Количество указанных имён подписок (%d) должно совпадать с количеством " "указанных имён баз (%d)." -#: pg_createsubscriber.c:2373 +#: pg_createsubscriber.c:2372 #, c-format msgid "wrong number of replication slot names specified" msgstr "указано неверное количество имён слотов репликации" -#: pg_createsubscriber.c:2374 +#: pg_createsubscriber.c:2373 #, c-format msgid "" "The number of specified replication slot names (%d) must match the number of " @@ -2179,48 +2205,48 @@ msgstr "" "Количество указанных имён слотов репликации (%d) должно совпадать с " "количеством указанных имён баз (%d)." -#: pg_createsubscriber.c:2386 +#: pg_createsubscriber.c:2385 #, c-format msgid "invalid object type \"%s\" specified for %s" msgstr "неправильный тип объекта \"%s\" указан в %s" -#: pg_createsubscriber.c:2388 +#: pg_createsubscriber.c:2387 #, c-format msgid "The valid value is: \"%s\"" msgstr "Допустимое значение: \"%s\"" -#: pg_createsubscriber.c:2419 +#: pg_createsubscriber.c:2418 #, c-format msgid "subscriber data directory is not a copy of the source database cluster" msgstr "" "каталог данных подписчика не является копией исходного кластера баз данных" -#: pg_createsubscriber.c:2432 +#: pg_createsubscriber.c:2431 #, c-format msgid "standby server is running" msgstr "резервный сервер запущен" -#: pg_createsubscriber.c:2433 +#: pg_createsubscriber.c:2432 #, c-format msgid "Stop the standby server and try again." msgstr "Остановите резервный сервер и повторите попытку." -#: pg_createsubscriber.c:2442 +#: pg_createsubscriber.c:2441 #, c-format msgid "starting the standby server with command-line options" msgstr "резервный сервер запускается с параметрами командной строки" -#: pg_createsubscriber.c:2458 pg_createsubscriber.c:2493 +#: pg_createsubscriber.c:2457 pg_createsubscriber.c:2492 #, c-format msgid "stopping the subscriber" msgstr "подписчик останавливается" -#: pg_createsubscriber.c:2472 +#: pg_createsubscriber.c:2471 #, c-format msgid "starting the subscriber" msgstr "подписчик запускается" -#: pg_createsubscriber.c:2501 +#: pg_createsubscriber.c:2500 #, c-format msgid "Done!" msgstr "Готово!" @@ -2341,7 +2367,7 @@ msgstr "завершена передача журнала с позиции %X/ msgid "switched to timeline %u at %X/%X" msgstr "переключение на линию времени %u (позиция %X/%X)" -#: pg_receivewal.c:224 pg_recvlogical.c:1075 +#: pg_receivewal.c:224 pg_recvlogical.c:1079 #, c-format msgid "received interrupt signal, exiting" msgstr "получен сигнал прерывания, работа завершается" @@ -2420,7 +2446,7 @@ msgstr "" msgid "starting log streaming at %X/%X (timeline %u)" msgstr "начало передачи журнала с позиции %X/%X (линия времени %u)" -#: pg_receivewal.c:693 pg_recvlogical.c:809 +#: pg_receivewal.c:693 pg_recvlogical.c:813 #, c-format msgid "could not parse end position \"%s\"" msgstr "не удалось разобрать конечную позицию \"%s\"" @@ -2453,23 +2479,23 @@ msgstr "" "подключение для репликации через слот \"%s\" оказалось привязано к базе " "данных" -#: pg_receivewal.c:878 pg_recvlogical.c:993 +#: pg_receivewal.c:878 pg_recvlogical.c:997 #, c-format msgid "dropping replication slot \"%s\"" msgstr "удаление слота репликации \"%s\"" -#: pg_receivewal.c:889 pg_recvlogical.c:1003 +#: pg_receivewal.c:889 pg_recvlogical.c:1007 #, c-format msgid "creating replication slot \"%s\"" msgstr "создание слота репликации \"%s\"" -#: pg_receivewal.c:918 pg_recvlogical.c:1028 +#: pg_receivewal.c:918 pg_recvlogical.c:1032 #, c-format msgid "disconnected" msgstr "отключение" #. translator: check source for value for %d -#: pg_receivewal.c:922 pg_recvlogical.c:1032 +#: pg_receivewal.c:922 pg_recvlogical.c:1036 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "отключение; через %d сек. последует повторное подключение" @@ -2596,109 +2622,109 @@ msgstr "не удалось отправить пакет ответа: %s" msgid "starting log streaming at %X/%X (slot %s)" msgstr "начало передачи журнала с позиции %X/%X (слот %s)" -#: pg_recvlogical.c:283 +#: pg_recvlogical.c:287 #, c-format msgid "streaming initiated" msgstr "передача запущена" -#: pg_recvlogical.c:348 +#: pg_recvlogical.c:352 #, c-format msgid "could not open log file \"%s\": %m" msgstr "не удалось открыть файл протокола \"%s\": %m" -#: pg_recvlogical.c:377 receivelog.c:889 +#: pg_recvlogical.c:381 receivelog.c:895 #, c-format msgid "invalid socket: %s" msgstr "неверный сокет: %s" -#: pg_recvlogical.c:430 receivelog.c:917 +#: pg_recvlogical.c:434 receivelog.c:923 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" -#: pg_recvlogical.c:437 receivelog.c:966 +#: pg_recvlogical.c:441 receivelog.c:972 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не удалось получить данные из потока WAL: %s" -#: pg_recvlogical.c:479 pg_recvlogical.c:530 receivelog.c:1010 -#: receivelog.c:1073 +#: pg_recvlogical.c:483 pg_recvlogical.c:534 receivelog.c:1016 +#: receivelog.c:1079 #, c-format msgid "streaming header too small: %d" msgstr "заголовок потока слишком мал: %d" -#: pg_recvlogical.c:514 receivelog.c:846 +#: pg_recvlogical.c:518 receivelog.c:852 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "нераспознанный заголовок потока: \"%c\"" -#: pg_recvlogical.c:568 pg_recvlogical.c:580 +#: pg_recvlogical.c:572 pg_recvlogical.c:584 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "не удалось записать %d Б в файл журнала \"%s\": %m" -#: pg_recvlogical.c:638 receivelog.c:641 receivelog.c:678 +#: pg_recvlogical.c:642 receivelog.c:647 receivelog.c:684 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "неожиданный конец потока репликации: %s" -#: pg_recvlogical.c:804 +#: pg_recvlogical.c:808 #, c-format msgid "could not parse start position \"%s\"" msgstr "не удалось разобрать начальную позицию \"%s\"" -#: pg_recvlogical.c:882 +#: pg_recvlogical.c:886 #, c-format msgid "no slot specified" msgstr "слот не указан" -#: pg_recvlogical.c:889 +#: pg_recvlogical.c:893 #, c-format msgid "no target file specified" msgstr "целевой файл не задан" -#: pg_recvlogical.c:896 +#: pg_recvlogical.c:900 #, c-format msgid "no database specified" msgstr "база данных не задана" -#: pg_recvlogical.c:903 +#: pg_recvlogical.c:907 #, c-format msgid "at least one action needs to be specified" msgstr "необходимо задать минимум одно действие" -#: pg_recvlogical.c:910 +#: pg_recvlogical.c:914 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "--create-slot или --start нельзя применять вместе с --drop-slot" -#: pg_recvlogical.c:917 +#: pg_recvlogical.c:921 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "--create-slot или --drop-slot нельзя применять вместе с --startpos" -#: pg_recvlogical.c:924 +#: pg_recvlogical.c:928 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos можно задать только вместе с --start" -#: pg_recvlogical.c:933 pg_recvlogical.c:940 +#: pg_recvlogical.c:937 pg_recvlogical.c:944 #, c-format msgid "%s may only be specified with --create-slot" msgstr "%s можно задать только вместе с --create-slot" -#: pg_recvlogical.c:977 +#: pg_recvlogical.c:981 #, c-format msgid "could not establish database-specific replication connection" msgstr "" "не удалось установить подключение для репликации к определённой базе данных" -#: pg_recvlogical.c:1078 +#: pg_recvlogical.c:1082 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "конечная позиция %X/%X достигнута при обработке keepalive" -#: pg_recvlogical.c:1083 +#: pg_recvlogical.c:1087 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "конечная позиция %X/%X достигнута при обработке записи WAL %X/%X" @@ -2750,7 +2776,7 @@ msgstr "не удалось открыть файл журнала предза msgid "not renaming \"%s\", segment is not complete" msgstr "файл сегмента \"%s\" не переименовывается, так как он неполный" -#: receivelog.c:226 receivelog.c:316 receivelog.c:687 +#: receivelog.c:226 receivelog.c:316 receivelog.c:693 #, c-format msgid "could not close file \"%s\": %s" msgstr "не удалось закрыть файл \"%s\": %s" @@ -2788,7 +2814,7 @@ msgstr "" "несовместимая версия сервера %s; клиент не поддерживает репликацию с " "серверов версии выше %s" -#: receivelog.c:507 +#: receivelog.c:504 #, c-format msgid "" "system identifier does not match between base backup and streaming connection" @@ -2796,12 +2822,12 @@ msgstr "" "системный идентификатор базовой резервной копии отличается от идентификатора " "потоковой передачи" -#: receivelog.c:515 +#: receivelog.c:512 #, c-format msgid "starting timeline %u is not present in the server" msgstr "на сервере нет начальной линии времени %u" -#: receivelog.c:554 +#: receivelog.c:553 #, c-format msgid "" "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, " @@ -2810,12 +2836,12 @@ msgstr "" "сервер вернул неожиданный ответ на команду TIMELINE_HISTORY; получено строк: " "%d, полей: %d, а ожидалось строк: %d, полей: %d" -#: receivelog.c:625 +#: receivelog.c:631 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "сервер неожиданно сообщил линию времени %u после линии времени %u" -#: receivelog.c:631 +#: receivelog.c:637 #, c-format msgid "" "server stopped streaming timeline %u at %X/%X, but reported next timeline %u " @@ -2824,12 +2850,12 @@ msgstr "" "сервер прекратил передачу линии времени %u в %X/%X, но сообщил, что " "следующая линии времени %u начнётся в %X/%X" -#: receivelog.c:671 +#: receivelog.c:677 #, c-format msgid "replication stream was terminated before stop point" msgstr "поток репликации закончился до точки остановки" -#: receivelog.c:717 +#: receivelog.c:723 #, c-format msgid "" "unexpected result set after end-of-timeline: got %d rows and %d fields, " @@ -2838,32 +2864,32 @@ msgstr "" "сервер вернул неожиданный набор данных после конца линии времени; получено " "строк: %d, полей: %d, а ожидалось строк: %d, полей: %d" -#: receivelog.c:726 +#: receivelog.c:732 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "не удалось разобрать начальную точку следующей линии времени \"%s\"" -#: receivelog.c:774 receivelog.c:1029 walmethods.c:1206 +#: receivelog.c:780 receivelog.c:1035 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "не удалось синхронизировать с ФС файл \"%s\": %s" -#: receivelog.c:1090 +#: receivelog.c:1096 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "получена запись журнала предзаписи по смещению %u, но файл не открыт" -#: receivelog.c:1100 +#: receivelog.c:1106 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "получено смещение данных WAL %08x, но ожидалось %08x" -#: receivelog.c:1135 +#: receivelog.c:1141 #, c-format msgid "could not write %d bytes to WAL file \"%s\": %s" msgstr "не удалось записать %d Б в файл WAL \"%s\": %s" -#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1228 +#: receivelog.c:1166 receivelog.c:1206 receivelog.c:1234 #, c-format msgid "could not send copy-end packet: %s" msgstr "не удалось отправить пакет \"конец COPY\": %s" @@ -2939,7 +2965,7 @@ msgstr "" "не удалось идентифицировать систему; получено строк: %d, полей: %d " "(ожидалось: %d и %d (или более))" -#: streamutil.c:519 +#: streamutil.c:520 #, c-format msgid "" "could not read replication slot \"%s\": got %d rows and %d fields, expected " @@ -2948,23 +2974,23 @@ msgstr "" "прочитать из слота репликации \"%s\" не удалось; получено строк: %d, полей: " "%d (ожидалось: %d и %d)" -#: streamutil.c:531 +#: streamutil.c:532 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "слот репликации \"%s\" не существует" -#: streamutil.c:542 +#: streamutil.c:543 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "ожидался слот физической репликации, вместо этого получен тип \"%s\"" -#: streamutil.c:556 +#: streamutil.c:557 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "" "не удалось разобрать позицию restart_lsn \"%s\" для слота репликации \"%s\"" -#: streamutil.c:678 +#: streamutil.c:683 #, c-format msgid "" "could not create replication slot \"%s\": got %d rows and %d fields, " @@ -2973,7 +2999,7 @@ msgstr "" "создать слот репликации \"%s\" не удалось; получено строк: %d, полей: %d " "(ожидалось: %d и %d)" -#: streamutil.c:722 +#: streamutil.c:727 #, c-format msgid "" "could not drop replication slot \"%s\": got %d rows and %d fields, expected " @@ -3011,6 +3037,10 @@ msgstr "со сжатием закрытие файла с удалением н msgid "could not close compression stream" msgstr "не удалось закрыть поток сжатых данных" +#, c-format +#~ msgid "tar file trailer exceeds 2 blocks" +#~ msgstr "окончание файла tar занимает больше 2 блоков" + #, c-format #~ msgid "subscriber successfully changed the system identifier" #~ msgstr "идентификатор системы на подписчике успешно изменён" @@ -3066,9 +3096,6 @@ msgstr "не удалось закрыть поток сжатых данных" #~ msgstr "" #~ " -Z, --compress=0-9 установить уровень сжатия выходного архива\n" -#~ msgid "invalid tar block header size: %zu" -#~ msgstr "неверный размер заголовка блока tar: %zu" - #~ msgid "unrecognized link indicator \"%c\"" #~ msgstr "нераспознанный индикатор связи \"%c\"" diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index 6b6e32dfbdf..c9c7bbadc9a 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -451,8 +451,7 @@ CheckServerVersionForStreaming(PGconn *conn) bool ReceiveXlogStream(PGconn *conn, StreamCtl *stream) { - char query[128]; - char slotcmd[128]; + PQExpBuffer query; PGresult *res; XLogRecPtr stoppos; @@ -477,7 +476,6 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream) if (stream->replication_slot != NULL) { reportFlushPosition = true; - sprintf(slotcmd, "SLOT \"%s\" ", stream->replication_slot); } else { @@ -485,7 +483,6 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream) reportFlushPosition = true; else reportFlushPosition = false; - slotcmd[0] = 0; } if (stream->sysidentifier != NULL) @@ -534,8 +531,10 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream) */ if (!existsTimeLineHistoryFile(stream)) { - snprintf(query, sizeof(query), "TIMELINE_HISTORY %u", stream->timeline); - res = PQexec(conn, query); + query = createPQExpBuffer(); + appendPQExpBuffer(query, "TIMELINE_HISTORY %u", stream->timeline); + res = PQexec(conn, query->data); + destroyPQExpBuffer(query); if (PQresultStatus(res) != PGRES_TUPLES_OK) { /* FIXME: we might send it ok, but get an error */ @@ -571,11 +570,18 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream) return true; /* Initiate the replication stream at specified location */ - snprintf(query, sizeof(query), "START_REPLICATION %s%X/%X TIMELINE %u", - slotcmd, - LSN_FORMAT_ARGS(stream->startpos), - stream->timeline); - res = PQexec(conn, query); + query = createPQExpBuffer(); + appendPQExpBufferStr(query, "START_REPLICATION"); + if (stream->replication_slot != NULL) + { + appendPQExpBufferStr(query, " SLOT "); + AppendQuotedIdentifier(query, stream->replication_slot); + } + appendPQExpBuffer(query, " %X/%X TIMELINE %u", + LSN_FORMAT_ARGS(stream->startpos), + stream->timeline); + res = PQexec(conn, query->data); + destroyPQExpBuffer(query); if (PQresultStatus(res) != PGRES_COPY_BOTH) { pg_log_error("could not send replication command \"%s\": %s", diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c index c7b8a4c3a4b..a7b4fc084ae 100644 --- a/src/bin/pg_basebackup/streamutil.c +++ b/src/bin/pg_basebackup/streamutil.c @@ -501,7 +501,8 @@ GetSlotInformation(PGconn *conn, const char *slot_name, *restart_tli = tli_loc; query = createPQExpBuffer(); - appendPQExpBuffer(query, "READ_REPLICATION_SLOT %s", slot_name); + appendPQExpBufferStr(query, "READ_REPLICATION_SLOT "); + AppendQuotedIdentifier(query, slot_name); res = PQexec(conn, query->data); destroyPQExpBuffer(query); @@ -598,13 +599,17 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin, Assert(slot_name != NULL); /* Build base portion of query */ - appendPQExpBuffer(query, "CREATE_REPLICATION_SLOT \"%s\"", slot_name); + appendPQExpBufferStr(query, "CREATE_REPLICATION_SLOT "); + AppendQuotedIdentifier(query, slot_name); if (is_temporary) appendPQExpBufferStr(query, " TEMPORARY"); if (is_physical) appendPQExpBufferStr(query, " PHYSICAL"); else - appendPQExpBuffer(query, " LOGICAL \"%s\"", plugin); + { + appendPQExpBufferStr(query, " LOGICAL "); + AppendQuotedIdentifier(query, plugin); + } /* Add any requested options */ if (use_new_option_syntax) @@ -704,8 +709,8 @@ DropReplicationSlot(PGconn *conn, const char *slot_name) query = createPQExpBuffer(); /* Build query */ - appendPQExpBuffer(query, "DROP_REPLICATION_SLOT \"%s\"", - slot_name); + appendPQExpBufferStr(query, "DROP_REPLICATION_SLOT "); + AppendQuotedIdentifier(query, slot_name); res = PQexec(conn, query->data); if (PQresultStatus(res) != PGRES_COMMAND_OK) { @@ -733,6 +738,29 @@ DropReplicationSlot(PGconn *conn, const char *slot_name) return true; } +/* + * Append a suitably-quoted identifier or string literal to buf. + * "quote" should be either a double-quote or single-quote character. + * + * Caution: this quoting logic is sufficient for identifiers and literals + * in the replication grammar, but not always in regular SQL. Specifically, + * it'd fail for a string literal if standard_conforming_strings is off. + */ +void +AppendQuotedString(PQExpBuffer buf, const char *str, char quote) +{ + appendPQExpBufferChar(buf, quote); + while (*str) + { + char c = *str++; + + if (c == quote) + appendPQExpBufferChar(buf, c); + appendPQExpBufferChar(buf, c); + } + appendPQExpBufferChar(buf, quote); +} + /* * Append a "plain" option - one with no value - to a server command that * is being constructed. @@ -741,10 +769,13 @@ DropReplicationSlot(PGconn *conn, const char *slot_name) * write things like SOME_COMMAND OPTION1 OPTION2 'opt2value' OPTION3 42. The * new syntax uses a comma-separated list surrounded by parentheses, so the * equivalent is SOME_COMMAND (OPTION1, OPTION2 'optvalue', OPTION3 42). + * + * Note: we assume option names do not require quotes. Do not use this + * with option names coming from outside sources. */ void AppendPlainCommandOption(PQExpBuffer buf, bool use_new_option_syntax, - char *option_name) + const char *option_name) { if (buf->len > 0 && buf->data[buf->len - 1] != '(') { @@ -765,30 +796,26 @@ AppendPlainCommandOption(PQExpBuffer buf, bool use_new_option_syntax, */ void AppendStringCommandOption(PQExpBuffer buf, bool use_new_option_syntax, - char *option_name, char *option_value) + const char *option_name, const char *option_value) { AppendPlainCommandOption(buf, use_new_option_syntax, option_name); if (option_value != NULL) { - size_t length = strlen(option_value); - char *escaped_value = palloc(1 + 2 * length); - - PQescapeStringConn(conn, escaped_value, option_value, length, NULL); - appendPQExpBuffer(buf, " '%s'", escaped_value); - pfree(escaped_value); + appendPQExpBufferChar(buf, ' '); + AppendQuotedLiteral(buf, option_value); } } /* - * Append an option with an associated integer value to a server command + * Append an option with an associated integer value to a server command that * is being constructed. * * See comments for AppendPlainCommandOption, above. */ void AppendIntegerCommandOption(PQExpBuffer buf, bool use_new_option_syntax, - char *option_name, int32 option_value) + const char *option_name, int32 option_value) { AppendPlainCommandOption(buf, use_new_option_syntax, option_name); diff --git a/src/bin/pg_basebackup/streamutil.h b/src/bin/pg_basebackup/streamutil.h index 017b227303c..ee2e9835080 100644 --- a/src/bin/pg_basebackup/streamutil.h +++ b/src/bin/pg_basebackup/streamutil.h @@ -43,15 +43,20 @@ extern bool RunIdentifySystem(PGconn *conn, char **sysid, XLogRecPtr *startpos, char **db_name); +extern void AppendQuotedString(PQExpBuffer buf, const char *str, char quote); +#define AppendQuotedIdentifier(b, s) AppendQuotedString(b, s, '"') +#define AppendQuotedLiteral(b, s) AppendQuotedString(b, s, '\'') extern void AppendPlainCommandOption(PQExpBuffer buf, bool use_new_option_syntax, - char *option_name); + const char *option_name); extern void AppendStringCommandOption(PQExpBuffer buf, bool use_new_option_syntax, - char *option_name, char *option_value); + const char *option_name, + const char *option_value); extern void AppendIntegerCommandOption(PQExpBuffer buf, bool use_new_option_syntax, - char *option_name, int32 option_value); + const char *option_name, + int32 option_value); extern bool GetSlotInformation(PGconn *conn, const char *slot_name, XLogRecPtr *restart_lsn, diff --git a/src/bin/pg_checksums/po/de.po b/src/bin/pg_checksums/po/de.po index dc8eab7e764..257eea18ed1 100644 --- a/src/bin/pg_checksums/po/de.po +++ b/src/bin/pg_checksums/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-03-02 13:25+0000\n" +"POT-Creation-Date: 2026-08-08 06:25+0000\n" "PO-Revision-Date: 2025-03-02 15:48+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -74,9 +74,9 @@ msgstr "" "diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" "wäre inkompatibel mit diesem Datenverzeichnis." -#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:71 -#: ../../common/file_utils.c:348 ../../common/file_utils.c:407 -#: ../../common/file_utils.c:481 pg_checksums.c:191 +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:69 +#: ../../common/file_utils.c:370 ../../common/file_utils.c:428 +#: ../../common/file_utils.c:502 pg_checksums.c:191 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" @@ -86,52 +86,62 @@ msgstr "konnte Datei »%s« nicht öffnen: %m" msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:419 -#: ../../common/file_utils.c:489 +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:440 +#: ../../common/file_utils.c:510 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" -#: ../../common/file_utils.c:77 +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + +#: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" -#: ../../common/file_utils.c:121 ../../common/file_utils.c:567 +#: ../../common/file_utils.c:123 ../../common/file_utils.c:588 #: pg_checksums.c:337 pg_checksums.c:406 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: ../../common/file_utils.c:131 ../../common/file_utils.c:228 +#: ../../common/file_utils.c:133 ../../common/file_utils.c:243 #: ../../fe_utils/option_utils.c:99 #, c-format msgid "this build does not support sync method \"%s\"" msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" -#: ../../common/file_utils.c:152 ../../common/file_utils.c:282 +#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 #: pg_checksums.c:309 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../../common/file_utils.c:170 ../../common/file_utils.c:316 +#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" -#: ../../common/file_utils.c:499 +#: ../../common/file_utils.c:520 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" diff --git a/src/bin/pg_checksums/po/ru.po b/src/bin/pg_checksums/po/ru.po index a0cbfa15d6b..6b6d3e45e1d 100644 --- a/src/bin/pg_checksums/po/ru.po +++ b/src/bin/pg_checksums/po/ru.po @@ -1,10 +1,10 @@ -# SPDX-FileCopyrightText: 2019, 2020, 2021, 2022, 2024, 2025 Alexander Lakhin +# SPDX-FileCopyrightText: 2019, 2020, 2021, 2022, 2024, 2025, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_verify_checksums (PostgreSQL) 11\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2025-08-31 07:39+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:48+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -88,17 +88,27 @@ msgstr "не удалось записать файл \"%s\": %m" msgid "could not fsync file \"%s\": %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/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" diff --git a/src/bin/pg_combinebackup/Makefile b/src/bin/pg_combinebackup/Makefile index 33a1f4483bf..bdba0353412 100644 --- a/src/bin/pg_combinebackup/Makefile +++ b/src/bin/pg_combinebackup/Makefile @@ -12,6 +12,8 @@ PGFILEDESC = "pg_combinebackup - combine incremental backups" PGAPPICON=win32 +EXTRA_INSTALL=contrib/pg_visibility + subdir = src/bin/pg_combinebackup top_builddir = ../../.. include $(top_builddir)/src/Makefile.global diff --git a/src/bin/pg_combinebackup/meson.build b/src/bin/pg_combinebackup/meson.build index bbc4c5735ba..757b78e2fe8 100644 --- a/src/bin/pg_combinebackup/meson.build +++ b/src/bin/pg_combinebackup/meson.build @@ -39,6 +39,7 @@ tests += { 't/009_no_full_file.pl', 't/010_hardlink.pl', 't/011_ib_truncation.pl', + 't/012_vm_consistency.pl', ], } } diff --git a/src/bin/pg_combinebackup/po/de.po b/src/bin/pg_combinebackup/po/de.po index cf32b245542..0f8ca3bb97d 100644 --- a/src/bin/pg_combinebackup/po/de.po +++ b/src/bin/pg_combinebackup/po/de.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_combinebackup (PostgreSQL) 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:22+0000\n" -"PO-Revision-Date: 2026-02-07 09:48+0100\n" +"POT-Creation-Date: 2026-08-08 06:23+0000\n" +"PO-Revision-Date: 2026-08-08 09:36+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -53,7 +53,7 @@ msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #: backup_label.c:174 copy_file.c:71 pg_combinebackup.c:548 -#: pg_combinebackup.c:1185 reconstruct.c:369 reconstruct.c:742 +#: pg_combinebackup.c:1185 reconstruct.c:369 reconstruct.c:745 #: write_manifest.c:187 #, c-format msgid "could not close file \"%s\": %m" @@ -88,7 +88,7 @@ msgstr "" msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:761 +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:764 #: write_manifest.c:260 #, c-format msgid "could not write file \"%s\": %m" @@ -101,7 +101,7 @@ msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" #: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 -#: ../../common/jsonapi.c:2410 ../../common/parse_manifest.c:157 +#: ../../common/jsonapi.c:2459 ../../common/parse_manifest.c:157 #: ../../common/parse_manifest.c:852 #, c-format msgid "out of memory" @@ -120,17 +120,27 @@ msgstr "Zielpuffer ist zu klein" msgid "OpenSSL failure" msgstr "OpenSSL-Fehler" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -166,103 +176,103 @@ msgstr "konnte Verzeichnis »%s« nicht lesen: %m" msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" -#: ../../common/jsonapi.c:2435 +#: ../../common/jsonapi.c:2484 msgid "Recursive descent parser cannot use incremental lexer." msgstr "Parser mit rekursivem Abstieg kann inkrementellen Lexer nicht benutzen." -#: ../../common/jsonapi.c:2437 +#: ../../common/jsonapi.c:2486 msgid "Incremental parser requires incremental lexer." msgstr "Inkrementeller Parser benötigt inkrementellen Lexer." -#: ../../common/jsonapi.c:2439 +#: ../../common/jsonapi.c:2488 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSON zu tief geschachtelt, maximale erlaubte Tiefe ist 6400." -#: ../../common/jsonapi.c:2441 +#: ../../common/jsonapi.c:2490 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Escape-Sequenz »\\%.*s« ist nicht gültig." -#: ../../common/jsonapi.c:2445 +#: ../../common/jsonapi.c:2494 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../../common/jsonapi.c:2449 +#: ../../common/jsonapi.c:2498 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ende der Eingabe erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2452 +#: ../../common/jsonapi.c:2501 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Array-Element oder »]« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2455 +#: ../../common/jsonapi.c:2504 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "»,« oder »]« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2458 +#: ../../common/jsonapi.c:2507 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "»:« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2461 +#: ../../common/jsonapi.c:2510 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON-Wert erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2464 +#: ../../common/jsonapi.c:2513 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../../common/jsonapi.c:2466 +#: ../../common/jsonapi.c:2515 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Zeichenkette oder »}« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2469 +#: ../../common/jsonapi.c:2518 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "»,« oder »}« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2472 +#: ../../common/jsonapi.c:2521 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Zeichenkette erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2475 +#: ../../common/jsonapi.c:2524 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Token »%.*s« ist ungültig." -#: ../../common/jsonapi.c:2481 +#: ../../common/jsonapi.c:2530 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../../common/jsonapi.c:2483 +#: ../../common/jsonapi.c:2532 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../../common/jsonapi.c:2486 +#: ../../common/jsonapi.c:2535 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Unicode-Escape-Werte können nicht für Code-Punkt-Werte über 007F verwendet werden, wenn die Kodierung nicht UTF8 ist." -#: ../../common/jsonapi.c:2495 +#: ../../common/jsonapi.c:2544 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicode-Escape-Wert konnte nicht in die Serverkodierung %s umgewandelt werden." -#: ../../common/jsonapi.c:2502 +#: ../../common/jsonapi.c:2551 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen." -#: ../../common/jsonapi.c:2504 +#: ../../common/jsonapi.c:2553 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen." -#: ../../common/jsonapi.c:2526 +#: ../../common/jsonapi.c:2575 msgid "out of memory while constructing error description" msgstr "Speicher aufgebraucht beim Konstruieren der Fehlerbeschreibung" @@ -468,13 +478,13 @@ msgstr "%s: konnte %s nicht finden" msgid "%s: %s requires %s" msgstr "%s: %s benötigt %s" -#: backup_label.c:162 reconstruct.c:763 write_manifest.c:262 +#: backup_label.c:162 reconstruct.c:766 write_manifest.c:262 #, c-format msgid "could not write file \"%s\": wrote %d of %d" msgstr "konnte Datei »%s« nicht schreiben: %d von %d geschrieben" -#: backup_label.c:166 copy_file.c:160 copy_file.c:207 reconstruct.c:723 -#: reconstruct.c:769 write_manifest.c:270 +#: backup_label.c:166 copy_file.c:160 copy_file.c:207 reconstruct.c:726 +#: reconstruct.c:772 write_manifest.c:270 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "konnte Prüfsumme der Datei »%s« nicht aktualisieren" @@ -489,7 +499,7 @@ msgstr "konnte nicht in Datei »%s« schreiben: %m" msgid "could not write to file \"%s\", offset %u: wrote %d of %d" msgstr "konnte nicht in Datei »%s«, Position %u schreiben: %d von %d geschrieben" -#: copy_file.c:213 reconstruct.c:786 +#: copy_file.c:213 reconstruct.c:789 #, c-format msgid "could not read from file \"%s\": %m" msgstr "konnte nicht aus Datei »%s« lesen: %m" @@ -519,7 +529,7 @@ msgstr "Klonen von Dateien wird auf dieser Plattform nicht unterstützt" msgid "error while copying file range from \"%s\" to \"%s\": %m" msgstr "Fehler beim Kopieren von Dateibereich von »%s« nach »%s«: %m" -#: copy_file.c:299 pg_combinebackup.c:269 reconstruct.c:726 +#: copy_file.c:299 pg_combinebackup.c:269 reconstruct.c:729 #, c-format msgid "copy_file_range not supported on this platform" msgstr "copy_file_range wird auf dieser Plattform nicht unterstützt" @@ -918,7 +928,12 @@ msgstr "Datei »%s« hat Truncation-Blocklänge %u, was die Segmentgröße %u ü msgid "could not read file \"%s\": read %d of %u" msgstr "konnte Datei »%s« nicht lesen: %d von %u gelesen" -#: reconstruct.c:788 +#: reconstruct.c:709 +#, c-format +msgid "unexpected end of file while copying file range from \"%s\" to \"%s\"" +msgstr "unerwartetes Dateiende beim Kopieren von Dateibereich von »%s« nach »%s«" + +#: reconstruct.c:791 #, c-format msgid "could not read from file \"%s\", offset %llu: read %d of %d" msgstr "konnte nicht aus Datei »%s«, Position %llu lesen: %d von %d gelesen" diff --git a/src/bin/pg_combinebackup/po/ja.po b/src/bin/pg_combinebackup/po/ja.po index 32382adbd13..6cd839c4d86 100644 --- a/src/bin/pg_combinebackup/po/ja.po +++ b/src/bin/pg_combinebackup/po/ja.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_combinebackup (PostgreSQL 18)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-04-30 10:33+0900\n" -"PO-Revision-Date: 2025-04-30 11:26+0900\n" +"POT-Creation-Date: 2026-06-30 09:59+0900\n" +"PO-Revision-Date: 2026-06-30 10:33+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: \n" "Language: ja\n" @@ -43,7 +43,7 @@ msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み込み用にオープンできませんでした: %m" #: ../../common/controldata_utils.c:110 copy_file.c:164 load_manifest.c:161 -#: load_manifest.c:199 pg_combinebackup.c:1410 reconstruct.c:540 +#: load_manifest.c:199 pg_combinebackup.c:1410 reconstruct.c:542 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み込みに失敗しました: %m" @@ -55,7 +55,7 @@ msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトの #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #: backup_label.c:174 copy_file.c:71 pg_combinebackup.c:548 -#: pg_combinebackup.c:1185 reconstruct.c:369 reconstruct.c:740 +#: pg_combinebackup.c:1185 reconstruct.c:369 reconstruct.c:745 #: write_manifest.c:187 #, c-format msgid "could not close file \"%s\": %m" @@ -83,13 +83,13 @@ msgstr "" #: ../../common/file_utils.c:502 backup_label.c:143 copy_file.c:69 #: copy_file.c:153 copy_file.c:185 copy_file.c:189 copy_file.c:239 #: copy_file.c:282 load_manifest.c:128 pg_combinebackup.c:533 -#: pg_combinebackup.c:1177 reconstruct.c:523 reconstruct.c:638 +#: pg_combinebackup.c:1177 reconstruct.c:525 reconstruct.c:640 #: write_manifest.c:250 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:764 #: write_manifest.c:260 #, c-format msgid "could not write file \"%s\": %m" @@ -102,7 +102,7 @@ msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" #: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 -#: ../../common/jsonapi.c:2407 ../../common/parse_manifest.c:157 +#: ../../common/jsonapi.c:2459 ../../common/parse_manifest.c:157 #: ../../common/parse_manifest.c:852 #, c-format msgid "out of memory" @@ -121,17 +121,27 @@ msgstr "出力先バッファが小さすぎます" msgid "OpenSSL failure" msgstr "OpenSSLのエラー" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "nullポインタは複製できません(内部エラー)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "メモリ割り当て要求サイズ %zu * %zu が不正です\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -140,7 +150,7 @@ msgstr "ファイル\"%s\"に対してファイルシステムを同期できま #: ../../common/file_utils.c:123 ../../common/file_utils.c:588 #: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:685 #: pg_combinebackup.c:1141 pg_combinebackup.c:1393 reconstruct.c:204 -#: reconstruct.c:421 +#: reconstruct.c:422 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" @@ -167,103 +177,103 @@ msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" -#: ../../common/jsonapi.c:2432 +#: ../../common/jsonapi.c:2484 msgid "Recursive descent parser cannot use incremental lexer." msgstr "再帰降下パーサーは差分字句解析器を使用できません。" -#: ../../common/jsonapi.c:2434 +#: ../../common/jsonapi.c:2486 msgid "Incremental parser requires incremental lexer." msgstr "差分パーサーは差分字句解析器を必要とします。" -#: ../../common/jsonapi.c:2436 +#: ../../common/jsonapi.c:2488 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSONのネストが深すぎます、可能な最大の深さは6400です。" -#: ../../common/jsonapi.c:2438 +#: ../../common/jsonapi.c:2490 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "エスケープシーケンス\"\\%.*s\"は不正です。" -#: ../../common/jsonapi.c:2442 +#: ../../common/jsonapi.c:2494 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../../common/jsonapi.c:2446 +#: ../../common/jsonapi.c:2498 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "入力の終端を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2449 +#: ../../common/jsonapi.c:2501 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "配列要素または\"]\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2452 +#: ../../common/jsonapi.c:2504 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "\",\"または\"]\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2455 +#: ../../common/jsonapi.c:2507 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "\":\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2458 +#: ../../common/jsonapi.c:2510 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON値を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2461 +#: ../../common/jsonapi.c:2513 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../../common/jsonapi.c:2463 +#: ../../common/jsonapi.c:2515 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "文字列または\"}\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2466 +#: ../../common/jsonapi.c:2518 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "\",\"または\"}\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2469 +#: ../../common/jsonapi.c:2521 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "文字列を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2472 +#: ../../common/jsonapi.c:2524 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "トークン\"\\%.*s\"は不正です。" -#: ../../common/jsonapi.c:2478 +#: ../../common/jsonapi.c:2530 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../../common/jsonapi.c:2480 +#: ../../common/jsonapi.c:2532 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../../common/jsonapi.c:2483 +#: ../../common/jsonapi.c:2535 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "エンコーディングがUTF-8ではない場合、コードポイントの値が 007F 以上についてはUnicodeエスケープの値は使用できません。" -#: ../../common/jsonapi.c:2492 +#: ../../common/jsonapi.c:2544 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicodeエスケープの値がサーバーエンコーディング%sに変換できませんでした。" -#: ../../common/jsonapi.c:2499 +#: ../../common/jsonapi.c:2551 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../../common/jsonapi.c:2501 +#: ../../common/jsonapi.c:2553 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodeのローサロゲートはハイサロゲートに続かなければなりません。" -#: ../../common/jsonapi.c:2523 +#: ../../common/jsonapi.c:2575 msgid "out of memory while constructing error description" msgstr "エラー記述の構築中にメモリ不足" @@ -469,13 +479,13 @@ msgstr "%s: %sが見つかりませんでした" msgid "%s: %s requires %s" msgstr "%s: %sは%sを必要とします" -#: backup_label.c:162 reconstruct.c:761 write_manifest.c:262 +#: backup_label.c:162 reconstruct.c:766 write_manifest.c:262 #, c-format msgid "could not write file \"%s\": wrote %d of %d" msgstr "ファイル\"%1$s\"の書き込みができませんでした: %3$dバイト中%2$dバイト書き込みました" -#: backup_label.c:166 copy_file.c:160 copy_file.c:207 reconstruct.c:721 -#: reconstruct.c:767 write_manifest.c:270 +#: backup_label.c:166 copy_file.c:160 copy_file.c:207 reconstruct.c:726 +#: reconstruct.c:772 write_manifest.c:270 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "ファイル\"%s\"のチェックサムの更新ができませんでした" @@ -490,7 +500,7 @@ msgstr "ファイル\"%s\"を書き出せませんでした: %m" msgid "could not write to file \"%s\", offset %u: wrote %d of %d" msgstr "ファイル \"%1$s\"、オフセット%2$uで書き込みができませんでした: %4$dバイト中%3$dバイト書き込みました" -#: copy_file.c:213 reconstruct.c:784 +#: copy_file.c:213 reconstruct.c:789 #, c-format msgid "could not read from file \"%s\": %m" msgstr "ファイル\"%s\"から読み取れませんでした: %m" @@ -515,12 +525,12 @@ msgstr "ファイル\"%s\"の\"%s\"へのクローニング中のエラー: %s" msgid "file cloning not supported on this platform" msgstr "このプラットフォームではファイルのクローンはサポートされません" -#: copy_file.c:292 reconstruct.c:704 +#: copy_file.c:292 reconstruct.c:706 #, c-format msgid "error while copying file range from \"%s\" to \"%s\": %m" msgstr "\"%s\"の\"%s\"へのファイル範囲のコピー中のエラー: %m" -#: copy_file.c:299 pg_combinebackup.c:269 reconstruct.c:724 +#: copy_file.c:299 pg_combinebackup.c:269 reconstruct.c:729 #, c-format msgid "copy_file_range not supported on this platform" msgstr "このプラットフォームではcopy_file_rangeはサポートされません" @@ -615,11 +625,16 @@ msgstr "テーブル空間のマッピングに複数の\"=\"記号がありま msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "テーブル空間のマッピング形式\"%s\"が不正です。\"旧DIR=新DIR\"でなければなりません" -#: pg_combinebackup.c:490 pg_combinebackup.c:494 +#: pg_combinebackup.c:490 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "テーブル空間のマッピングにおいて、旧ディレクトリが絶対パスではありません: %s" +#: pg_combinebackup.c:494 +#, c-format +msgid "new directory is not an absolute path in tablespace mapping: %s" +msgstr "テーブル空間のマッピングにおいて、新ディレクトリが絶対パスではありません: %s" + #: pg_combinebackup.c:563 #, c-format msgid "backup at \"%s\" is a full backup, but only the first backup should be a full backup" @@ -887,32 +902,37 @@ msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$lldバイト msgid "full backup contains unexpected incremental file \"%s\"" msgstr "フルバックアップに予期しない差分ファイル\"%s\"が含まれています" -#: reconstruct.c:423 +#: reconstruct.c:424 #, c-format msgid "file \"%s\" is too short: expected %llu, found %llu" msgstr "ファイル\"%s\"が短すぎます: %lluを期待していましたが%lluでした" -#: reconstruct.c:465 +#: reconstruct.c:466 #, c-format msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" msgstr "ファイル\"%1$s\"の差分マジックナンバーが正しくありません (0x%3$xを期待していましたが0x%2$xでした)" -#: reconstruct.c:471 +#: reconstruct.c:472 #, c-format msgid "file \"%s\" has block count %u in excess of segment size %u" msgstr "ファイル\"%s\"のブロック数%uがセグメントサイズ%uを超えています" -#: reconstruct.c:478 +#: reconstruct.c:479 #, c-format msgid "file \"%s\" has truncation block length %u in excess of segment size %u" msgstr "ファイル\"%s\"の切り詰めブロック長%uがセグメントサイズ%uを超えています" -#: reconstruct.c:542 +#: reconstruct.c:544 #, c-format msgid "could not read file \"%s\": read %d of %u" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$uバイトのうち%2$dバイトを読み込みました" -#: reconstruct.c:786 +#: reconstruct.c:709 +#, c-format +msgid "unexpected end of file while copying file range from \"%s\" to \"%s\"" +msgstr "\"%s\"から\"%s\"へのファイル範囲のコピー中に予期しないファイル終端に達しました" + +#: reconstruct.c:791 #, c-format msgid "could not read from file \"%s\", offset %llu: read %d of %d" msgstr "ファイル \"%1$s\"、オフセット%2$lluから読み取れませんでした: %4$d中%3$d" diff --git a/src/bin/pg_combinebackup/po/ru.po b/src/bin/pg_combinebackup/po/ru.po index 732fdaf4e13..a85cbe918bc 100644 --- a/src/bin/pg_combinebackup/po/ru.po +++ b/src/bin/pg_combinebackup/po/ru.po @@ -3,8 +3,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_combinebackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:57+0200\n" -"PO-Revision-Date: 2026-02-07 09:22+0200\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:49+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -53,7 +53,7 @@ msgstr "не удалось прочитать файл \"%s\" (прочитан #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #: backup_label.c:174 copy_file.c:71 pg_combinebackup.c:548 -#: pg_combinebackup.c:1185 reconstruct.c:369 reconstruct.c:742 +#: pg_combinebackup.c:1185 reconstruct.c:369 reconstruct.c:745 #: write_manifest.c:187 #, c-format msgid "could not close file \"%s\": %m" @@ -88,7 +88,7 @@ msgstr "" msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" -#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:761 +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:764 #: write_manifest.c:260 #, c-format msgid "could not write file \"%s\": %m" @@ -101,7 +101,7 @@ msgid "could not fsync file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" #: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 -#: ../../common/jsonapi.c:2410 ../../common/parse_manifest.c:157 +#: ../../common/jsonapi.c:2459 ../../common/parse_manifest.c:157 #: ../../common/parse_manifest.c:852 #, c-format msgid "out of memory" @@ -120,17 +120,27 @@ msgstr "буфер назначения слишком мал" msgid "OpenSSL failure" msgstr "ошибка OpenSSL" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -166,91 +176,91 @@ msgstr "не удалось прочитать каталог \"%s\": %m" msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не удалось переименовать файл \"%s\" в \"%s\": %m" -#: ../../common/jsonapi.c:2435 +#: ../../common/jsonapi.c:2484 msgid "Recursive descent parser cannot use incremental lexer." msgstr "" "Инкрементальный лексический анализатор не подходит для нисходящего " "рекурсивного разбора." -#: ../../common/jsonapi.c:2437 +#: ../../common/jsonapi.c:2486 msgid "Incremental parser requires incremental lexer." msgstr "" "Для инкрементального разбора требуется инкрементальный лексический " "анализатор." -#: ../../common/jsonapi.c:2439 +#: ../../common/jsonapi.c:2488 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "" "Слишком большая вложенность JSON, максимальная допустимая глубина: 6400." -#: ../../common/jsonapi.c:2441 +#: ../../common/jsonapi.c:2490 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%.*s\"." -#: ../../common/jsonapi.c:2445 +#: ../../common/jsonapi.c:2494 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../../common/jsonapi.c:2449 +#: ../../common/jsonapi.c:2498 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%.*s\"." -#: ../../common/jsonapi.c:2452 +#: ../../common/jsonapi.c:2501 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2455 +#: ../../common/jsonapi.c:2504 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2458 +#: ../../common/jsonapi.c:2507 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "Ожидалось \":\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2461 +#: ../../common/jsonapi.c:2510 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2464 +#: ../../common/jsonapi.c:2513 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../../common/jsonapi.c:2466 +#: ../../common/jsonapi.c:2515 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2469 +#: ../../common/jsonapi.c:2518 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2472 +#: ../../common/jsonapi.c:2521 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Ожидалась строка, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2475 +#: ../../common/jsonapi.c:2524 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Ошибочный элемент \"%.*s\"." -#: ../../common/jsonapi.c:2481 +#: ../../common/jsonapi.c:2530 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../../common/jsonapi.c:2483 +#: ../../common/jsonapi.c:2532 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../../common/jsonapi.c:2486 +#: ../../common/jsonapi.c:2535 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -258,22 +268,22 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../../common/jsonapi.c:2495 +#: ../../common/jsonapi.c:2544 #, c-format msgid "" "Unicode escape value could not be translated to the server's encoding %s." msgstr "Спецкод Unicode нельзя преобразовать в серверную кодировку %s." -#: ../../common/jsonapi.c:2502 +#: ../../common/jsonapi.c:2551 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../../common/jsonapi.c:2504 +#: ../../common/jsonapi.c:2553 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее слово суррогата Unicode должно следовать за старшим словом." -#: ../../common/jsonapi.c:2526 +#: ../../common/jsonapi.c:2575 msgid "out of memory while constructing error description" msgstr "нехватка памяти при составлении описания ошибки" @@ -479,13 +489,13 @@ msgstr "%s: не удалось найти %s" msgid "%s: %s requires %s" msgstr "%s: %s требует %s" -#: backup_label.c:162 reconstruct.c:763 write_manifest.c:262 +#: backup_label.c:162 reconstruct.c:766 write_manifest.c:262 #, c-format msgid "could not write file \"%s\": wrote %d of %d" msgstr "не удалось записать файл \"%s\" (записано байт: %d из %d)" -#: backup_label.c:166 copy_file.c:160 copy_file.c:207 reconstruct.c:723 -#: reconstruct.c:769 write_manifest.c:270 +#: backup_label.c:166 copy_file.c:160 copy_file.c:207 reconstruct.c:726 +#: reconstruct.c:772 write_manifest.c:270 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "не удалось изменить контекст контрольной суммы файла \"%s\"" @@ -501,7 +511,7 @@ msgid "could not write to file \"%s\", offset %u: wrote %d of %d" msgstr "" "не удалось записать в файл \"%s\" (смещение %u, записано байт: %d из %d)" -#: copy_file.c:213 reconstruct.c:786 +#: copy_file.c:213 reconstruct.c:789 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" @@ -531,7 +541,7 @@ msgstr "клонирование файлов не поддерживается msgid "error while copying file range from \"%s\" to \"%s\": %m" msgstr "ошибка при копировании фрагмента файла \"%s\" в \"%s\": %m" -#: copy_file.c:299 pg_combinebackup.c:269 reconstruct.c:726 +#: copy_file.c:299 pg_combinebackup.c:269 reconstruct.c:729 #, c-format msgid "copy_file_range not supported on this platform" msgstr "copy_file_range не поддерживается в этой ОС" @@ -971,7 +981,13 @@ msgstr "" msgid "could not read file \"%s\": read %d of %u" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %u)" -#: reconstruct.c:788 +#: reconstruct.c:709 +#, c-format +msgid "unexpected end of file while copying file range from \"%s\" to \"%s\"" +msgstr "" +"неожиданный конец файла при копировании фрагмента файла из \"%s\" в \"%s\"" + +#: reconstruct.c:791 #, c-format msgid "could not read from file \"%s\", offset %llu: read %d of %d" msgstr "" diff --git a/src/bin/pg_combinebackup/reconstruct.c b/src/bin/pg_combinebackup/reconstruct.c index 38d8e8a2dc9..682028fb59e 100644 --- a/src/bin/pg_combinebackup/reconstruct.c +++ b/src/bin/pg_combinebackup/reconstruct.c @@ -705,6 +705,9 @@ write_reconstructed_file(char *input_filename, if (wb < 0) pg_fatal("error while copying file range from \"%s\" to \"%s\": %m", input_filename, output_filename); + else if (wb == 0) + pg_fatal("unexpected end of file while copying file range from \"%s\" to \"%s\"", + input_filename, output_filename); nwritten += wb; diff --git a/src/bin/pg_combinebackup/t/012_vm_consistency.pl b/src/bin/pg_combinebackup/t/012_vm_consistency.pl new file mode 100644 index 00000000000..6bf47ebec37 --- /dev/null +++ b/src/bin/pg_combinebackup/t/012_vm_consistency.pl @@ -0,0 +1,258 @@ +# Copyright (c) 2026, PostgreSQL Global Development Group +# +# Test that heap operations clearing visibility map bits (INSERT, UPDATE, +# DELETE, SELECT FOR UPDATE, COPY) correctly register visibility map buffers, +# since incremental backups rely on the WAL summarizer, which only tracks +# registered buffers. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $tempdir = PostgreSQL::Test::Utils::tempdir_short(); +my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; + +# Set up primary with WAL summarization enabled. +my $primary = PostgreSQL::Test::Cluster->new('primary'); +$primary->init(allows_streaming => 1); +$primary->append_conf('postgresql.conf', <start; + +$primary->safe_psql('postgres', q{CREATE EXTENSION pg_visibility}); + +my @tests = ( + { + label => 'INSERT', + table => 'vm_insert_test', + setup => q{CREATE TABLE vm_insert_test (id int); + INSERT INTO vm_insert_test DEFAULT VALUES;}, + modify => q{INSERT INTO vm_insert_test VALUES (1)}, + visible_op => '<', + frozen_op => '<', + }, + { + label => 'DELETE', + table => 'vm_delete_test', + setup => q{CREATE TABLE vm_delete_test (id int); + INSERT INTO vm_delete_test VALUES (1), (2);}, + modify => q{DELETE FROM vm_delete_test WHERE id = 1}, + visible_op => '<', + frozen_op => '<', + }, + { + label => 'UPDATE', + table => 'vm_update_test', + # Include both same-page and cross-page updates. val is stored PLAIN + # so the large update stays inline. + setup => q{CREATE TABLE vm_update_test (id INT, val TEXT); + ALTER TABLE vm_update_test ALTER COLUMN val SET STORAGE PLAIN; + INSERT INTO vm_update_test VALUES (1, 'same page'), (2, 'cross page'); + INSERT INTO vm_update_test SELECT i, repeat('a', 200) + FROM generate_series(3, 70) i;}, + modify => q{UPDATE vm_update_test SET id = 0 WHERE id = 1; + UPDATE vm_update_test SET val = repeat('b', 4000) WHERE id = 2;}, + # Confirm the small update stays on the same heap page while the large + # update relocates the tuple to a different heap page. + ctid_checks => [ + { + before => 'id = 1', + after => 'id = 0', + same => 1, + desc => 'small update stays on the same heap page', + }, + { + before => 'id = 2', + after => 'id = 2', + same => 0, + desc => 'large update moves the tuple to a different heap page', + }, + ], + visible_op => '<', + frozen_op => '<', + }, + { + label => 'LOCK', + table => 'vm_lock_test', + setup => q{CREATE TABLE vm_lock_test (id int); + INSERT INTO vm_lock_test VALUES (1), (2);}, + modify => q{SELECT * FROM vm_lock_test WHERE id = 1 FOR UPDATE}, + visible_op => '==', + frozen_op => '<', + }, + { + label => 'COPY', + table => 'vm_copy_test', + setup => q{CREATE TABLE vm_copy_test (id int); + INSERT INTO vm_copy_test DEFAULT VALUES;}, + modify => q{COPY vm_copy_test FROM PROGRAM 'echo 42'}, + visible_op => '<', + frozen_op => '<', + }, +); + +sub get_vm_summary +{ + my ($node, $table) = @_; + my $result = $node->safe_psql('postgres', + "SELECT all_visible, all_frozen FROM pg_visibility_map_summary('$table')"); + my @vals = split(/\|/, $result); + return @vals; +} + +# Return the heap block number of the (single) row matching $where. The ctid +# is "(block,offset)"; casting it through point lets us pull out the block. +sub heap_block +{ + my ($node, $table, $where) = @_; + return $node->safe_psql('postgres', + "SELECT (ctid::text::point)[0]::int FROM $table WHERE $where"); +} + +# Confirm VACUUM (FREEZE) set VM bits before testing whether later heap +# modifications clear those bits and are captured by incremental backup. We +# could perhaps be more exact than > 0, but the coarseness attempts to avoid +# test flakes. +sub check_vacuumed_vm +{ + my ($node, $test) = @_; + my ($all_visible, $all_frozen) = get_vm_summary($node, $test->{table}); + + cmp_ok($all_visible, '>', 0, + "$test->{label} test: pages are all-visible after vacuum"); + cmp_ok($all_frozen, '>', 0, + "$test->{label} test: pages are all-frozen after vacuum"); + + return ($all_visible, $all_frozen); +} + +# Check the VM bit counts after a heap modification against the post-vacuum +# baseline. Most operations clear both bits; tuple locking clears all-frozen +# without clearing all-visible. +sub check_modified_vm +{ + my ($node, $test) = @_; + my ($post_visible, $post_frozen) = get_vm_summary($node, $test->{table}); + + cmp_ok($post_visible, $test->{visible_op}, $test->{pre_visible}, + "$test->{label} test: all-visible state after modification"); + cmp_ok($post_frozen, $test->{frozen_op}, $test->{pre_frozen}, + "$test->{label} test: all-frozen state after modification"); + + return ($post_visible, $post_frozen); +} + +# Verify the combined backup restored VM state exactly as it exists on the +# primary, and ask pg_visibility to check that visible tuples are consistent. +sub validate_restored_vm +{ + my ($restored, $test) = @_; + + my ($primary_visible, $primary_frozen) = + get_vm_summary($primary, $test->{table}); + my ($restored_visible, $restored_frozen) = + get_vm_summary($restored, $test->{table}); + + is($restored_visible, $primary_visible, + "$test->{label} test: restored all_visible count matches primary"); + is($restored_frozen, $primary_frozen, + "$test->{label} test: restored all_frozen count matches primary"); + + my $corrupt_tids = $restored->safe_psql('postgres', + "SELECT count(*) FROM pg_check_visible('$test->{table}')"); + is($corrupt_tids, '0', + "$test->{label} test: no VM corruption detected by pg_check_visible"); +} + +# Create and populate the tables, then vacuum freeze them to set the VM bits +foreach my $test (@tests) +{ + $primary->safe_psql('postgres', $test->{setup}); + $primary->safe_psql('postgres', "VACUUM (FREEZE) $test->{table}"); + ($test->{pre_visible}, $test->{pre_frozen}) = + check_vacuumed_vm($primary, $test); +} + +# Take a full backup +my $full_name = 'full'; +my $full_path = $primary->backup_dir . "/$full_name"; +$primary->command_ok( + [ + 'pg_basebackup', '--no-sync', + '--pgdata' => $full_path, + '--checkpoint' => 'fast', + ], + 'full backup'); + +# Modify the tables and check that the VM bits are as expected for that test +# after the specified modification. +foreach my $test (@tests) +{ + # Record the heap block of any rows whose same-/cross-page movement we + # want to verify, before the modification relocates them. + foreach my $check (@{ $test->{ctid_checks} // [] }) + { + $check->{before_blk} = + heap_block($primary, $test->{table}, $check->{before}); + } + + $primary->safe_psql('postgres', $test->{modify}); + ($test->{post_visible}, $test->{post_frozen}) = + check_modified_vm($primary, $test); + + # Confirm each checked row did (or did not) move to a different heap page. + foreach my $check (@{ $test->{ctid_checks} // [] }) + { + my $after_blk = heap_block($primary, $test->{table}, $check->{after}); + if ($check->{same}) + { + is($after_blk, $check->{before_blk}, + "$test->{label} test: $check->{desc}"); + } + else + { + isnt($after_blk, $check->{before_blk}, + "$test->{label} test: $check->{desc}"); + } + } +} + +# Take an incremental backup. This will have the changes made in the +# modification step. +my $incr_name = 'incr'; +my $incr_path = $primary->backup_dir . "/$incr_name"; +$primary->command_ok( + [ + 'pg_basebackup', '--no-sync', + '--pgdata' => $incr_path, + '--checkpoint' => 'fast', + '--incremental' => $full_path . '/backup_manifest', + ], + 'incremental backup'); + +# Start a server from a combined backup composed of the incremental and full +# backup. +my $restored = PostgreSQL::Test::Cluster->new('restored'); +$restored->init_from_backup($primary, $incr_name, + combine_with_prior => [$full_name], + combine_mode => $mode); +$restored->append_conf('postgresql.conf', <start; +$restored->safe_psql('postgres', q{CREATE EXTENSION IF NOT EXISTS pg_visibility}); + +# Confirm that the restored server's visibility map matches the original server +foreach my $test (@tests) +{ + validate_restored_vm($restored, $test); +} + +$restored->stop; +$primary->stop; + +done_testing(); diff --git a/src/bin/pg_config/po/de.po b/src/bin/pg_config/po/de.po index 63dd1889cdb..6c86b25b144 100644 --- a/src/bin/pg_config/po/de.po +++ b/src/bin/pg_config/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-06-16 07:49+0000\n" +"POT-Creation-Date: 2026-08-08 06:19+0000\n" "PO-Revision-Date: 2024-03-26 10:37+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -43,42 +43,52 @@ msgstr "konnte kein »%s« zum Ausführen finden" msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m" -#: ../../common/exec.c:382 +#: ../../common/exec.c:363 #, c-format msgid "could not execute command \"%s\": %m" msgstr "konnte Befehl »%s« nicht ausführen: %m" -#: ../../common/exec.c:394 +#: ../../common/exec.c:375 #, c-format msgid "could not read from command \"%s\": %m" msgstr "konnte nicht von Befehl »%s« lesen: %m" -#: ../../common/exec.c:397 +#: ../../common/exec.c:378 #, c-format msgid "no data was returned by command \"%s\"" msgstr "Befehl »%s« gab keine Daten zurück" -#: ../../common/exec.c:424 +#: ../../common/exec.c:405 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: ../../common/exec.c:543 ../../common/exec.c:588 ../../common/exec.c:680 msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" -#: pg_config.c:74 +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + +#: pg_config.c:73 #, c-format msgid "" "\n" @@ -89,12 +99,12 @@ msgstr "" "%s gibt Informationen über die installierte Version von PostgreSQL.\n" "\n" -#: pg_config.c:75 +#: pg_config.c:74 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_config.c:76 +#: pg_config.c:75 #, c-format msgid "" " %s [OPTION]...\n" @@ -103,27 +113,27 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: pg_config.c:77 +#: pg_config.c:76 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: pg_config.c:78 +#: pg_config.c:77 #, c-format msgid " --bindir show location of user executables\n" msgstr " --bindir zeige Installationsverzeichnis der Benutzerprogramme\n" -#: pg_config.c:79 +#: pg_config.c:78 #, c-format msgid " --docdir show location of documentation files\n" msgstr " --docdir zeige Installationsverzeichnis der Dokumentation\n" -#: pg_config.c:80 +#: pg_config.c:79 #, c-format msgid " --htmldir show location of HTML documentation files\n" msgstr " --htmldir zeige Installationsverzeichnis der HTML-Dokumentation\n" -#: pg_config.c:81 +#: pg_config.c:80 #, c-format msgid "" " --includedir show location of C header files of the client\n" @@ -132,60 +142,60 @@ msgstr "" " --includedir zeige Installationsverzeichnis der Headerdateien der\n" " Client-Schnittstellen\n" -#: pg_config.c:83 +#: pg_config.c:82 #, c-format msgid " --pkgincludedir show location of other C header files\n" msgstr " --pkgincludedir zeige Installationsverzeichnis von weiteren Headerdateien\n" -#: pg_config.c:84 +#: pg_config.c:83 #, c-format msgid " --includedir-server show location of C header files for the server\n" msgstr "" " --includedir-server zeige Installationsverzeichnis der Headerdateien des\n" " Servers\n" -#: pg_config.c:85 +#: pg_config.c:84 #, c-format msgid " --libdir show location of object code libraries\n" msgstr " --libdir zeige Installationsverzeichnis der Objektbibliotheken\n" -#: pg_config.c:86 +#: pg_config.c:85 #, c-format msgid " --pkglibdir show location of dynamically loadable modules\n" msgstr "" " --pkglibdir zeige Installationsverzeichnis der dynamisch\n" " ladbaren Module\n" -#: pg_config.c:87 +#: pg_config.c:86 #, c-format msgid " --localedir show location of locale support files\n" msgstr " --localedir zeige Installationsverzeichnis der Locale-Dateien\n" -#: pg_config.c:88 +#: pg_config.c:87 #, c-format msgid " --mandir show location of manual pages\n" msgstr " --mandir zeige Installationsverzeichnis der Manpages\n" -#: pg_config.c:89 +#: pg_config.c:88 #, c-format msgid " --sharedir show location of architecture-independent support files\n" msgstr "" " --sharedir zeige Installationsverzeichnis der architektur-\n" " unabhängigen Datendateien\n" -#: pg_config.c:90 +#: pg_config.c:89 #, c-format msgid " --sysconfdir show location of system-wide configuration files\n" msgstr "" " --sysconfdir zeige Installationsverzeichnis der systemweiten\n" " Konfigurationsdateien\n" -#: pg_config.c:91 +#: pg_config.c:90 #, c-format msgid " --pgxs show location of extension makefile\n" msgstr " --pgxs zeige Ort der Erweiterungs-Makefile\n" -#: pg_config.c:92 +#: pg_config.c:91 #, c-format msgid "" " --configure show options given to \"configure\" script when\n" @@ -194,57 +204,57 @@ msgstr "" " --configure zeige Optionen des »configure«-Skriptes beim Bauen\n" " von PostgreSQL\n" -#: pg_config.c:94 +#: pg_config.c:93 #, c-format msgid " --cc show CC value used when PostgreSQL was built\n" msgstr " --cc zeige CC-Wert, mit dem PostgreSQL gebaut wurde\n" -#: pg_config.c:95 +#: pg_config.c:94 #, c-format msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n" msgstr " --cppflags zeige CPPFLAGS-Wert, mit dem PostgreSQL gebaut wurde\n" -#: pg_config.c:96 +#: pg_config.c:95 #, c-format msgid " --cflags show CFLAGS value used when PostgreSQL was built\n" msgstr " --cflags zeige CFLAGS-Wert, mit dem PostgreSQL gebaut wurde\n" -#: pg_config.c:97 +#: pg_config.c:96 #, c-format msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n" msgstr " --cflags_sl zeige CFLAGS_SL-Wert, mit dem PostgreSQL gebaut wurde\n" -#: pg_config.c:98 +#: pg_config.c:97 #, c-format msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n" msgstr " --ldflags zeige LDFLAGS-Wert, mit dem PostgreSQL gebaut wurde\n" -#: pg_config.c:99 +#: pg_config.c:98 #, c-format msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n" msgstr " --ldflags_ex zeige LDFLAGS_EX-Wert, mit dem PostgreSQL gebaut wurde\n" -#: pg_config.c:100 +#: pg_config.c:99 #, c-format msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n" msgstr " --ldflags_sl zeige LDFLAGS_SL-Wert, mit dem PostgreSQL gebaut wurde\n" -#: pg_config.c:101 +#: pg_config.c:100 #, c-format msgid " --libs show LIBS value used when PostgreSQL was built\n" msgstr " --libs zeige LIBS-Wert, mit dem PostgreSQL gebaut wurde\n" -#: pg_config.c:102 +#: pg_config.c:101 #, c-format msgid " --version show the PostgreSQL version\n" msgstr " --version zeige PostgreSQL-Version\n" -#: pg_config.c:103 +#: pg_config.c:102 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_config.c:104 +#: pg_config.c:103 #, c-format msgid "" "\n" @@ -255,27 +265,27 @@ msgstr "" "Ohne Argumente werden alle bekannten Informationen angezeigt.\n" "\n" -#: pg_config.c:105 +#: pg_config.c:104 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Berichten Sie Fehler an <%s>.\n" -#: pg_config.c:106 +#: pg_config.c:105 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_config.c:112 +#: pg_config.c:111 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" -#: pg_config.c:154 +#: pg_config.c:153 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: konnte eigene Programmdatei nicht finden\n" -#: pg_config.c:181 +#: pg_config.c:180 #, c-format msgid "%s: invalid argument: %s\n" msgstr "%s: ungültiges Argument: %s\n" diff --git a/src/bin/pg_config/po/ru.po b/src/bin/pg_config/po/ru.po index 35580c39bcc..6290af309ff 100644 --- a/src/bin/pg_config/po/ru.po +++ b/src/bin/pg_config/po/ru.po @@ -5,13 +5,13 @@ # Serguei A. Mokhov , 2004-2005. # Sergey Burladyan , 2009, 2012. # Andrey Sudnik , 2010. -# Alexander Lakhin , 2012-2016, 2017, 2019, 2020, 2021, 2023, 2024. +# SPDX-FileCopyrightText: 2012-2016, 2017, 2019, 2020, 2021, 2023, 2024, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_config (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2024-09-04 13:45+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:49+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -72,17 +72,27 @@ msgstr "ошибка в %s(): %m" msgid "out of memory" msgstr "нехватка памяти" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: pg_config.c:73 #, c-format msgid "" diff --git a/src/bin/pg_controldata/po/de.po b/src/bin/pg_controldata/po/de.po index 6e07ae07288..86cf5276dad 100644 --- a/src/bin/pg_controldata/po/de.po +++ b/src/bin/pg_controldata/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-06-13 01:53+0000\n" +"POT-Creation-Date: 2026-08-08 06:24+0000\n" "PO-Revision-Date: 2025-06-13 08:05+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -70,17 +70,27 @@ msgstr "konnte Datei »%s« nicht schreiben: %m" msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: pg_controldata.c:35 #, c-format msgid "" diff --git a/src/bin/pg_controldata/po/ru.po b/src/bin/pg_controldata/po/ru.po index ce97ded1eba..057b8d9564d 100644 --- a/src/bin/pg_controldata/po/ru.po +++ b/src/bin/pg_controldata/po/ru.po @@ -4,13 +4,13 @@ # Serguei A. Mokhov , 2002-2004. # Oleg Bartunov , 2004. # Andrey Sudnik , 2011. -# SPDX-FileCopyrightText: 2012-2017, 2018, 2019, 2020, 2021, 2022, 2024, 2025 Alexander Lakhin +# SPDX-FileCopyrightText: 2012-2017, 2018, 2019, 2020, 2021, 2022, 2024, 2025, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_controldata (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2025-09-13 16:58+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:49+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -73,17 +73,27 @@ msgstr "не удалось записать файл \"%s\": %m" msgid "could not fsync file \"%s\": %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/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: pg_controldata.c:35 #, c-format msgid "" diff --git a/src/bin/pg_ctl/po/de.po b/src/bin/pg_ctl/po/de.po index 3cfd780365e..99c1de81d14 100644 --- a/src/bin/pg_ctl/po/de.po +++ b/src/bin/pg_ctl/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-03-19 06:50+0000\n" +"POT-Creation-Date: 2026-08-08 06:20+0000\n" "PO-Revision-Date: 2025-03-19 11:06+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -64,18 +64,28 @@ msgstr "%s() fehlgeschlagen: %m" msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:831 ../../port/path.c:868 ../../port/path.c:885 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 +#: ../../port/path.c:848 ../../port/path.c:885 ../../port/path.c:902 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/wait_error.c:55 #, c-format msgid "command not executable" @@ -106,7 +116,7 @@ msgstr "Kindprozess wurde von Signal %d beendet: %s" msgid "child process exited with unrecognized status %d" msgstr "Kindprozess hat mit unbekanntem Status %d beendet" -#: ../../port/path.c:853 +#: ../../port/path.c:870 #, c-format msgid "could not get current working directory: %m\n" msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %m\n" diff --git a/src/bin/pg_ctl/po/ja.po b/src/bin/pg_ctl/po/ja.po index 77c2d6ba2f1..18383de13fb 100644 --- a/src/bin/pg_ctl/po/ja.po +++ b/src/bin/pg_ctl/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_ctl (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-07-19 09:21+0900\n" -"PO-Revision-Date: 2024-07-19 09:52+0900\n" +"POT-Creation-Date: 2026-05-12 14:55+0900\n" +"PO-Revision-Date: 2026-05-14 16:39+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -46,42 +46,52 @@ msgstr "実行する\"%s\"がありませんでした" msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形式に変換できませんでした: %m" -#: ../../common/exec.c:382 +#: ../../common/exec.c:363 #, c-format msgid "could not execute command \"%s\": %m" msgstr "コマンド\"%s\"を実行できませんでした: %m" -#: ../../common/exec.c:394 +#: ../../common/exec.c:375 #, c-format msgid "could not read from command \"%s\": %m" msgstr "コマンド\"%s\"から読み取れませんでした: %m" -#: ../../common/exec.c:397 +#: ../../common/exec.c:378 #, c-format msgid "no data was returned by command \"%s\"" msgstr "コマンド\"%s\"がデータを返却しませんでした" -#: ../../common/exec.c:424 +#: ../../common/exec.c:405 #, c-format msgid "%s() failed: %m" msgstr "%s() が失敗しました: %m" -#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: ../../common/exec.c:543 ../../common/exec.c:588 ../../common/exec.c:680 msgid "out of memory" 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:790 ../../port/path.c:807 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 +#: ../../port/path.c:848 ../../port/path.c:885 ../../port/path.c:902 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません(内部エラー)。\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "メモリ割り当て要求サイズ %zu * %zu が不正です\n" + #: ../../common/wait_error.c:55 #, c-format msgid "command not executable" @@ -112,7 +122,7 @@ msgstr "子プロセスはシグナル%dにより終了しました: %s" msgid "child process exited with unrecognized status %d" msgstr "子プロセスが未知のステータス%dで終了しました" -#: ../../port/path.c:775 +#: ../../port/path.c:870 #, c-format msgid "could not get current working directory: %m\n" msgstr "現在の作業ディレクトリを取得できませんでした: %m\n" diff --git a/src/bin/pg_ctl/po/ru.po b/src/bin/pg_ctl/po/ru.po index 77ce8b4a9f2..10a0d0e74fe 100644 --- a/src/bin/pg_ctl/po/ru.po +++ b/src/bin/pg_ctl/po/ru.po @@ -6,13 +6,13 @@ # Sergey Burladyan , 2009, 2012. # Andrey Sudnik , 2010. # Dmitriy Olshevskiy , 2014. -# SPDX-FileCopyrightText: 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Alexander Lakhin +# SPDX-FileCopyrightText: 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_ctl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2025-09-13 17:07+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:49+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -70,18 +70,28 @@ msgstr "ошибка в %s(): %m" msgid "out of memory" msgstr "нехватка памяти" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:831 ../../port/path.c:868 ../../port/path.c:885 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 +#: ../../port/path.c:848 ../../port/path.c:885 ../../port/path.c:902 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/wait_error.c:55 #, c-format msgid "command not executable" @@ -112,7 +122,7 @@ msgstr "дочерний процесс завершён по сигналу %d: msgid "child process exited with unrecognized status %d" msgstr "дочерний процесс завершился с нераспознанным кодом состояния %d" -#: ../../port/path.c:853 +#: ../../port/path.c:870 #, c-format msgid "could not get current working directory: %m\n" msgstr "не удалось определить текущий рабочий каталог: %m\n" diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c index a1976fae607..61af7860184 100644 --- a/src/bin/pg_dump/common.c +++ b/src/bin/pg_dump/common.c @@ -1100,50 +1100,146 @@ findOwningExtension(CatalogId catalogId) /* * parseOidArray - * parse a string of numbers delimited by spaces into a character array + * parse a string of unsigned numbers separated by spaces + * into an array of OIDs * - * Note: actually this is used for both Oids and potentially-signed - * attribute numbers. This should cause no trouble, but we could split - * the function into two functions with different argument types if it does. + * The result is a malloc'd array. + * + * If arraysize >= 0, we insist that the input contain exactly that many + * OIDs, and the allocated array is of that length too. If arraysize < 0, + * we dynamically size the array to have one more entry than the input + * provides, and fill the extra entry with zero. */ - -void -parseOidArray(const char *str, Oid *array, int arraysize) +Oid * +parseOidArray(const char *str, int arraysize) { - int j, - argNum; - char temp[100]; - char s; - + Oid *array; + int allocsize, + argNum, + templen; + char temp[32]; + + if (arraysize >= 0) + allocsize = arraysize; + else + { + /* + * Make enough room for input + one extra entry (could be more than + * enough, if there are redundant spaces in the input). + */ + allocsize = 2; + for (const char *s1 = str; *s1; s1++) + { + if (*s1 == ' ') + allocsize++; + } + } + array = pg_malloc_array(Oid, allocsize); argNum = 0; - j = 0; - for (;;) + templen = 0; + for (const char *s1 = str;; s1++) { - s = *str++; + char s = *s1; + if (s == ' ' || s == '\0') { - if (j > 0) + if (templen > 0) { - if (argNum >= arraysize) + if (arraysize >= 0 && argNum >= arraysize) pg_fatal("could not parse numeric array \"%s\": too many numbers", str); - temp[j] = '\0'; + temp[templen] = '\0'; array[argNum++] = atooid(temp); - j = 0; + templen = 0; } if (s == '\0') break; } else { - if (!(isdigit((unsigned char) s) || s == '-') || - j >= sizeof(temp) - 1) + if (!isdigit((unsigned char) s) || + templen >= sizeof(temp) - 1) pg_fatal("could not parse numeric array \"%s\": invalid character in number", str); - temp[j++] = s; + temp[templen++] = s; } } - while (argNum < arraysize) + if (arraysize >= 0 && argNum != arraysize) + pg_fatal("could not parse numeric array \"%s\": too few numbers", str); + + while (argNum < allocsize) array[argNum++] = InvalidOid; + + return array; +} + + +/* + * parseIntArray + * parse a string of possibly-signed numbers separated by spaces + * into an array of ints + * + * This is exactly like parseOidArray, but for integers. + */ +int * +parseIntArray(const char *str, int arraysize) +{ + int *array; + int allocsize, + argNum, + templen; + char temp[32]; + + if (arraysize >= 0) + allocsize = arraysize; + else + { + /* + * Make enough room for input + one extra entry (could be more than + * enough, if there are redundant spaces in the input). + */ + allocsize = 2; + for (const char *s1 = str; *s1; s1++) + { + if (*s1 == ' ') + allocsize++; + } + } + array = pg_malloc_array(int, allocsize); + argNum = 0; + templen = 0; + for (const char *s1 = str;; s1++) + { + char s = *s1; + + if (s == ' ' || s == '\0') + { + if (templen > 0) + { + if (arraysize >= 0 && argNum >= arraysize) + pg_fatal("could not parse numeric array \"%s\": too many numbers", str); + temp[templen] = '\0'; + array[argNum++] = atoi(temp); + templen = 0; + } + if (s == '\0') + break; + } + else + { + if (!(isdigit((unsigned char) s) || s == '-') || + templen >= sizeof(temp) - 1) + pg_fatal("could not parse numeric array \"%s\": invalid character in number", str); + temp[templen++] = s; + } + } + + if (arraysize >= 0 && argNum != arraysize) + pg_fatal("could not parse numeric array \"%s\": too few numbers", str); + + while (argNum < allocsize) + array[argNum++] = 0; + + return array; } diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c index dde165909ba..17ec9f9b0cc 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -731,6 +731,7 @@ variable_is_guc_list_quote(const char *name) { if (pg_strcasecmp(name, "local_preload_libraries") == 0 || pg_strcasecmp(name, "oauth_validator_libraries") == 0 || + pg_strcasecmp(name, "output_plugin_libraries") == 0 || pg_strcasecmp(name, "search_path") == 0 || pg_strcasecmp(name, "session_preload_libraries") == 0 || pg_strcasecmp(name, "shared_preload_libraries") == 0 || @@ -741,115 +742,6 @@ variable_is_guc_list_quote(const char *name) return false; } -/* - * SplitGUCList --- parse a string containing identifiers or file names - * - * This is used to split the value of a GUC_LIST_QUOTE GUC variable, without - * presuming whether the elements will be taken as identifiers or file names. - * See comparable code in src/backend/utils/adt/varlena.c. - * - * Inputs: - * rawstring: the input string; must be overwritable! On return, it's - * been modified to contain the separated identifiers. - * separator: the separator punctuation expected between identifiers - * (typically '.' or ','). Whitespace may also appear around - * identifiers. - * Outputs: - * namelist: receives a malloc'd, null-terminated array of pointers to - * identifiers within rawstring. Caller should free this - * even on error return. - * - * Returns true if okay, false if there is a syntax error in the string. - */ -bool -SplitGUCList(char *rawstring, char separator, - char ***namelist) -{ - char *nextp = rawstring; - bool done = false; - char **nextptr; - - /* - * Since we disallow empty identifiers, this is a conservative - * overestimate of the number of pointers we could need. Allow one for - * list terminator. - */ - *namelist = nextptr = (char **) - pg_malloc((strlen(rawstring) / 2 + 2) * sizeof(char *)); - *nextptr = NULL; - - while (isspace((unsigned char) *nextp)) - nextp++; /* skip leading whitespace */ - - if (*nextp == '\0') - return true; /* allow empty string */ - - /* At the top of the loop, we are at start of a new identifier. */ - do - { - char *curname; - char *endp; - - if (*nextp == '"') - { - /* Quoted name --- collapse quote-quote pairs */ - curname = nextp + 1; - for (;;) - { - endp = strchr(nextp + 1, '"'); - if (endp == NULL) - return false; /* mismatched quotes */ - if (endp[1] != '"') - break; /* found end of quoted name */ - /* Collapse adjacent quotes into one quote, and look again */ - memmove(endp, endp + 1, strlen(endp)); - nextp = endp; - } - /* endp now points at the terminating quote */ - nextp = endp + 1; - } - else - { - /* Unquoted name --- extends to separator or whitespace */ - curname = nextp; - while (*nextp && *nextp != separator && - !isspace((unsigned char) *nextp)) - nextp++; - endp = nextp; - if (curname == nextp) - return false; /* empty unquoted name not allowed */ - } - - while (isspace((unsigned char) *nextp)) - nextp++; /* skip trailing whitespace */ - - if (*nextp == separator) - { - nextp++; - while (isspace((unsigned char) *nextp)) - nextp++; /* skip leading whitespace for next */ - /* we expect another name, so done remains false */ - } - else if (*nextp == '\0') - done = true; - else - return false; /* invalid syntax */ - - /* Now safe to overwrite separator with a null */ - *endp = '\0'; - - /* - * Finished isolating current name --- add it to output array - */ - *nextptr++ = curname; - - /* Loop back if we didn't reach end of string */ - } while (!done); - - *nextptr = NULL; - return true; -} - /* * Helper function for dumping "ALTER DATABASE/ROLE SET ..." commands. * diff --git a/src/bin/pg_dump/dumputils.h b/src/bin/pg_dump/dumputils.h index 10f6e27c0a0..bbc70329abe 100644 --- a/src/bin/pg_dump/dumputils.h +++ b/src/bin/pg_dump/dumputils.h @@ -56,9 +56,6 @@ extern void emitShSecLabels(PGconn *conn, PGresult *res, extern bool variable_is_guc_list_quote(const char *name); -extern bool SplitGUCList(char *rawstring, char separator, - char ***namelist); - extern void makeAlterConfigCommand(PGconn *conn, const char *configitem, const char *type, const char *name, const char *type2, const char *name2, diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c index 086adcdc502..8f57b62ba25 100644 --- a/src/bin/pg_dump/parallel.c +++ b/src/bin/pg_dump/parallel.c @@ -976,6 +976,8 @@ ParallelBackupStart(ArchiveHandle *AH) handle = _beginthreadex(NULL, 0, (void *) &init_spawned_worker_win32, wi, 0, &(slot->threadId)); + if (handle == 0) + pg_fatal("could not create worker thread: %m"); slot->hThread = handle; slot->workerStatus = WRKR_IDLE; #else /* !WIN32 */ diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 4293e20b20e..efcb5924935 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -3083,7 +3083,9 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH) } /* If it's a subscription, maybe ignore it */ - if (ropt->no_subscriptions && strcmp(te->desc, "SUBSCRIPTION") == 0) + if (ropt->no_subscriptions && + (strcmp(te->desc, "SUBSCRIPTION") == 0 || + strcmp(te->desc, "SUBSCRIPTION TABLE") == 0)) return 0; /* Ignore it if section is not to be dumped/restored */ @@ -3115,7 +3117,6 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH) */ if (strcmp(te->desc, "ACL") == 0 || strcmp(te->desc, "COMMENT") == 0 || - strcmp(te->desc, "STATISTICS DATA") == 0 || strcmp(te->desc, "SECURITY LABEL") == 0) { /* Database properties react to createDB, not selectivity options. */ @@ -3186,14 +3187,52 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH) if (ropt->selTypes) { - if (strcmp(te->desc, "TABLE") == 0 || - strcmp(te->desc, "TABLE DATA") == 0 || - strcmp(te->desc, "VIEW") == 0 || - strcmp(te->desc, "FOREIGN TABLE") == 0 || - strcmp(te->desc, "MATERIALIZED VIEW") == 0 || - strcmp(te->desc, "MATERIALIZED VIEW DATA") == 0 || - strcmp(te->desc, "SEQUENCE") == 0 || - strcmp(te->desc, "SEQUENCE SET") == 0) + if (strcmp(te->desc, "STATISTICS DATA") == 0) + { + bool dumpthis = false; + + /* + * Statistics data entries can be for tables or indexes. Check + * the parent dependency to determine which type this entry + * belongs to, then apply the appropriate name filter. + */ + for (int i = 0; i < te->nDeps; i++) + { + TocEntry *pte = getTocEntryByDumpId(AH, te->dependencies[i]); + + if (!pte) + continue; + + if (ropt->selTable && + (strcmp(pte->desc, "TABLE") == 0 || + strcmp(pte->desc, "VIEW") == 0 || + strcmp(pte->desc, "FOREIGN TABLE") == 0 || + strcmp(pte->desc, "MATERIALIZED VIEW") == 0)) + { + if (ropt->tableNames.head == NULL || + simple_string_list_member(&ropt->tableNames, pte->tag)) + dumpthis = true; + } + + if (ropt->selIndex && + strcmp(pte->desc, "INDEX") == 0) + { + if (ropt->indexNames.head == NULL || + simple_string_list_member(&ropt->indexNames, pte->tag)) + dumpthis = true; + } + } + if (!dumpthis) + return 0; + } + else if (strcmp(te->desc, "TABLE") == 0 || + strcmp(te->desc, "TABLE DATA") == 0 || + strcmp(te->desc, "VIEW") == 0 || + strcmp(te->desc, "FOREIGN TABLE") == 0 || + strcmp(te->desc, "MATERIALIZED VIEW") == 0 || + strcmp(te->desc, "MATERIALIZED VIEW DATA") == 0 || + strcmp(te->desc, "SEQUENCE") == 0 || + strcmp(te->desc, "SEQUENCE SET") == 0) { if (!ropt->selTable) return 0; diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 8f6332d731f..618b0ea28a1 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -6725,12 +6725,8 @@ getAggregates(Archive *fout) if (agginfo[i].aggfn.nargs == 0) agginfo[i].aggfn.argtypes = NULL; else - { - agginfo[i].aggfn.argtypes = (Oid *) pg_malloc(agginfo[i].aggfn.nargs * sizeof(Oid)); - parseOidArray(PQgetvalue(res, i, i_proargtypes), - agginfo[i].aggfn.argtypes, - agginfo[i].aggfn.nargs); - } + agginfo[i].aggfn.argtypes = parseOidArray(PQgetvalue(res, i, i_proargtypes), + agginfo[i].aggfn.nargs); agginfo[i].aggfn.postponed_def = false; /* might get set during sort */ /* Decide whether we want to dump it */ @@ -6918,11 +6914,8 @@ getFuncs(Archive *fout) if (finfo[i].nargs == 0) finfo[i].argtypes = NULL; else - { - finfo[i].argtypes = (Oid *) pg_malloc(finfo[i].nargs * sizeof(Oid)); - parseOidArray(PQgetvalue(res, i, i_proargtypes), - finfo[i].argtypes, finfo[i].nargs); - } + finfo[i].argtypes = parseOidArray(PQgetvalue(res, i, i_proargtypes), + finfo[i].nargs); finfo[i].postponed_def = false; /* might get set during sort */ /* Decide whether we want to dump it */ @@ -7908,8 +7901,6 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) { Oid indrelid = atooid(PQgetvalue(res, j, i_indrelid)); TableInfo *tbinfo = NULL; - char **indAttNames = NULL; - int nindAttNames = 0; int numinds; /* Count rows for this table */ @@ -7943,6 +7934,8 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) { char contype; char indexkind; + char **indAttNames = NULL; + int nindAttNames = 0; RelStatsInfo *relstats; int32 relpages = atoi(PQgetvalue(res, j, i_relpages)); int32 relallvisible = atoi(PQgetvalue(res, j, i_relallvisible)); @@ -7963,9 +7956,8 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables) indxinfo[j].indreloptions = pg_strdup(PQgetvalue(res, j, i_indreloptions)); indxinfo[j].indstatcols = pg_strdup(PQgetvalue(res, j, i_indstatcols)); indxinfo[j].indstatvals = pg_strdup(PQgetvalue(res, j, i_indstatvals)); - indxinfo[j].indkeys = (Oid *) pg_malloc(indxinfo[j].indnattrs * sizeof(Oid)); - parseOidArray(PQgetvalue(res, j, i_indkey), - indxinfo[j].indkeys, indxinfo[j].indnattrs); + indxinfo[j].indkeys = parseIntArray(PQgetvalue(res, j, i_indkey), + indxinfo[j].indnattrs); indxinfo[j].indisclustered = (PQgetvalue(res, j, i_indisclustered)[0] == 't'); indxinfo[j].indisreplident = (PQgetvalue(res, j, i_indisreplident)[0] == 't'); indxinfo[j].indnullsnotdistinct = (PQgetvalue(res, j, i_indnullsnotdistinct)[0] == 't'); @@ -13509,12 +13501,10 @@ dumpFunc(Archive *fout, const FuncInfo *finfo) if (*protrftypes) { - Oid *typeids = pg_malloc(FUNC_MAX_ARGS * sizeof(Oid)); - int i; + Oid *typeids = parseOidArray(protrftypes, -1); appendPQExpBufferStr(q, " TRANSFORM "); - parseOidArray(protrftypes, typeids, FUNC_MAX_ARGS); - for (i = 0; typeids[i]; i++) + for (int i = 0; typeids[i]; i++) { if (i != 0) appendPQExpBufferStr(q, ", "); @@ -18426,7 +18416,7 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo) appendPQExpBufferStr(q, " ("); for (k = 0; k < indxinfo->indnkeyattrs; k++) { - int indkey = (int) indxinfo->indkeys[k]; + int indkey = indxinfo->indkeys[k]; const char *attname; if (indkey == InvalidAttrNumber) @@ -18445,7 +18435,7 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo) for (k = indxinfo->indnkeyattrs; k < indxinfo->indnattrs; k++) { - int indkey = (int) indxinfo->indkeys[k]; + int indkey = indxinfo->indkeys[k]; const char *attname; if (indkey == InvalidAttrNumber) diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 30121af7bdb..1306792b2ed 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -426,7 +426,7 @@ typedef struct _indxInfo char *indstatvals; /* statistic values for columns */ int indnkeyattrs; /* number of index key attributes */ int indnattrs; /* total number of index attributes */ - Oid *indkeys; /* In spite of the name 'indkeys' this field + int *indkeys; /* In spite of the name 'indkeys' this field * contains both key and nonkey attributes */ bool indisclustered; bool indisreplident; @@ -774,7 +774,8 @@ extern SubscriptionInfo *findSubscriptionByOid(Oid oid); extern void recordExtensionMembership(CatalogId catId, ExtensionInfo *ext); extern ExtensionInfo *findOwningExtension(CatalogId catalogId); -extern void parseOidArray(const char *str, Oid *array, int arraysize); +extern Oid *parseOidArray(const char *str, int arraysize); +extern int *parseIntArray(const char *str, int arraysize); extern void sortDumpableObjects(DumpableObject **objs, int numObjs, DumpId preBoundaryId, DumpId postBoundaryId); diff --git a/src/bin/pg_dump/po/de.po b/src/bin/pg_dump/po/de.po index f7b8c7689ae..5688dd43578 100644 --- a/src/bin/pg_dump/po/de.po +++ b/src/bin/pg_dump/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-05 12:13+0000\n" +"POT-Creation-Date: 2026-08-08 06:22+0000\n" "PO-Revision-Date: 2026-05-06 16:12+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -124,7 +124,7 @@ msgstr "konnte nicht von Befehl »%s« lesen: %m" msgid "no data was returned by command \"%s\"" msgstr "Befehl »%s« gab keine Daten zurück" -#: ../../common/exec.c:405 parallel.c:1611 +#: ../../common/exec.c:405 parallel.c:1613 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" @@ -133,17 +133,27 @@ msgstr "%s() fehlgeschlagen: %m" msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format @@ -720,22 +730,27 @@ msgstr "%s() fehlgeschlagen: Fehlercode %d" msgid "could not create communication channels: %m" msgstr "konnte Kommunikationskanäle nicht erzeugen: %m" -#: parallel.c:1018 +#: parallel.c:980 +#, c-format +msgid "could not create worker thread: %m" +msgstr "konnte Arbeits-Thread nicht erzeugen: %m" + +#: parallel.c:1020 #, c-format msgid "could not create worker process: %m" msgstr "konnte Arbeitsprozess nicht erzeugen: %m" -#: parallel.c:1148 +#: parallel.c:1150 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "unbekannter Befehl vom Leader-Prozess empfangen: »%s«" -#: parallel.c:1191 parallel.c:1429 +#: parallel.c:1193 parallel.c:1431 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "ungültige Nachricht vom Arbeitsprozess empfangen: »%s«" -#: parallel.c:1323 +#: parallel.c:1325 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -744,47 +759,47 @@ msgstr "" "konnte Sperre für Relation »%s« nicht setzen\n" "Das bedeutet meistens, dass jemand eine ACCESS-EXCLUSIVE-Sperre auf die Tabelle gesetzt hat, nachdem der pg-dump-Elternprozess die anfängliche ACCESS-SHARE-Sperre gesetzt hatte." -#: parallel.c:1412 +#: parallel.c:1414 #, c-format msgid "a worker process died unexpectedly" msgstr "ein Arbeitsprozess endete unerwartet" -#: parallel.c:1534 parallel.c:1652 +#: parallel.c:1536 parallel.c:1654 #, c-format msgid "could not write to the communication channel: %m" msgstr "konnte nicht in den Kommunikationskanal schreiben: %m" -#: parallel.c:1736 +#: parallel.c:1738 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: konnte Socket nicht erzeugen: Fehlercode %d" -#: parallel.c:1747 +#: parallel.c:1749 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: konnte nicht binden: Fehlercode %d" -#: parallel.c:1754 +#: parallel.c:1756 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: konnte nicht auf Socket hören: Fehlercode %d" -#: parallel.c:1761 +#: parallel.c:1763 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: %s() fehlgeschlagen: Fehlercode %d" -#: parallel.c:1772 +#: parallel.c:1774 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: konnte zweites Socket nicht erzeugen: Fehlercode %d" -#: parallel.c:1781 +#: parallel.c:1783 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: konnte Socket nicht verbinden: Fehlercode %d" -#: parallel.c:1790 +#: parallel.c:1792 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: konnte Verbindung nicht annehmen: Fehlercode %d" @@ -1067,12 +1082,12 @@ msgstr "konnte Standardausgabe nicht zum Anhängen öffnen: %m" msgid "unrecognized file format \"%d\"" msgstr "nicht erkanntes Dateiformat »%d«" -#: pg_backup_archiver.c:2567 pg_backup_archiver.c:4798 +#: pg_backup_archiver.c:2567 pg_backup_archiver.c:4837 #, c-format msgid "finished item %d %s %s" msgstr "Element %d %s %s abgeschlossen" -#: pg_backup_archiver.c:2571 pg_backup_archiver.c:4811 +#: pg_backup_archiver.c:2571 pg_backup_archiver.c:4850 #, c-format msgid "worker process failed: exit code %d" msgstr "Arbeitsprozess fehlgeschlagen: Code %d" @@ -1139,107 +1154,107 @@ msgstr "Funktion »%s« nicht gefunden" msgid "trigger \"%s\" not found" msgstr "Trigger »%s« nicht gefunden" -#: pg_backup_archiver.c:3470 +#: pg_backup_archiver.c:3509 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "konnte Sitzungsbenutzer nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3612 +#: pg_backup_archiver.c:3651 #, c-format msgid "could not set \"search_path\" to \"%s\": %s" msgstr "konnte »search_path« nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3673 +#: pg_backup_archiver.c:3712 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "konnte »default_tablespace« nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3722 +#: pg_backup_archiver.c:3761 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "konnte »default_table_access_method« nicht setzen: %s" -#: pg_backup_archiver.c:3771 +#: pg_backup_archiver.c:3810 #, c-format msgid "could not alter table access method: %s" msgstr "konnte Tabellenzugriffsmethode nicht ändern: %s" -#: pg_backup_archiver.c:3872 +#: pg_backup_archiver.c:3911 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "kann Eigentümer für Objekttyp »%s« nicht setzen" -#: pg_backup_archiver.c:4007 +#: pg_backup_archiver.c:4046 #, c-format msgid "unexpected TOC entry in _printTocEntry(): %d %s %s" msgstr "unerwarteter TOC-Eintrag in _printTocEntry(): %d %s %s" -#: pg_backup_archiver.c:4155 +#: pg_backup_archiver.c:4194 #, c-format msgid "did not find magic string in file header" msgstr "magische Zeichenkette im Dateikopf nicht gefunden" -#: pg_backup_archiver.c:4169 +#: pg_backup_archiver.c:4208 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "nicht unterstützte Version (%d.%d) im Dateikopf" -#: pg_backup_archiver.c:4174 +#: pg_backup_archiver.c:4213 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "Prüfung der Integer-Größe (%lu) fehlgeschlagen" -#: pg_backup_archiver.c:4178 +#: pg_backup_archiver.c:4217 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "Archiv wurde auf einer Maschine mit größeren Integers erstellt; einige Operationen könnten fehlschlagen" -#: pg_backup_archiver.c:4188 +#: pg_backup_archiver.c:4227 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "erwartetes Format (%d) ist nicht das gleiche wie das in der Datei gefundene (%d)" -#: pg_backup_archiver.c:4210 +#: pg_backup_archiver.c:4249 #, c-format msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" msgstr "Archiv ist komprimiert, aber diese Installation unterstützt keine Komprimierung (%s) -- keine Daten verfügbar" -#: pg_backup_archiver.c:4246 +#: pg_backup_archiver.c:4285 #, c-format msgid "invalid creation date in header" msgstr "ungültiges Erstellungsdatum im Kopf" -#: pg_backup_archiver.c:4380 +#: pg_backup_archiver.c:4419 #, c-format msgid "processing item %d %s %s" msgstr "verarbeite Element %d %s %s" -#: pg_backup_archiver.c:4465 +#: pg_backup_archiver.c:4504 #, c-format msgid "entering main parallel loop" msgstr "Eintritt in Hauptparallelschleife" -#: pg_backup_archiver.c:4476 +#: pg_backup_archiver.c:4515 #, c-format msgid "skipping item %d %s %s" msgstr "Element %d %s %s wird übersprungen" -#: pg_backup_archiver.c:4485 +#: pg_backup_archiver.c:4524 #, c-format msgid "launching item %d %s %s" msgstr "starte Element %d %s %s" -#: pg_backup_archiver.c:4539 +#: pg_backup_archiver.c:4578 #, c-format msgid "finished main parallel loop" msgstr "Hauptparallelschleife beendet" -#: pg_backup_archiver.c:4575 +#: pg_backup_archiver.c:4614 #, c-format msgid "processing missed item %d %s %s" msgstr "verarbeite verpasstes Element %d %s %s" -#: pg_backup_archiver.c:5117 +#: pg_backup_archiver.c:5156 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "Tabelle »%s« konnte nicht erzeugt werden, ihre Daten werden nicht wiederhergestellt werden" @@ -2302,13 +2317,13 @@ msgstr "Sanity-Check fehlgeschlagen, Elterntabelle mit OID %u von Sequenz mit OI msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" msgstr "Sanity-Check fehlgeschlagen, Tabellen-OID %u, die in pg_partitioned_table erscheint, nicht gefunden" -#: pg_dump.c:7931 pg_dump.c:8224 pg_dump.c:8687 pg_dump.c:9334 pg_dump.c:9473 +#: pg_dump.c:7929 pg_dump.c:8224 pg_dump.c:8687 pg_dump.c:9334 pg_dump.c:9473 #: pg_dump.c:9618 pg_dump.c:9718 #, c-format msgid "unrecognized table OID %u" msgstr "unbekannte Tabellen-OID %u" -#: pg_dump.c:7935 +#: pg_dump.c:7933 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "unerwartete Indexdaten für Tabelle »%s«" diff --git a/src/bin/pg_dump/po/ja.po b/src/bin/pg_dump/po/ja.po index 3c74562ef33..bdc63388681 100644 --- a/src/bin/pg_dump/po/ja.po +++ b/src/bin/pg_dump/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_dump (PostgreSQL 18)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-01-13 11:09+0900\n" -"PO-Revision-Date: 2026-01-13 11:53+0900\n" +"POT-Creation-Date: 2026-05-12 14:55+0900\n" +"PO-Revision-Date: 2026-05-14 16:51+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -44,7 +44,7 @@ msgstr "ヒント: " #: ../../common/compression.c:132 ../../common/compression.c:141 #: ../../common/compression.c:150 compress_gzip.c:441 compress_gzip.c:448 -#: compress_io.c:108 compress_lz4.c:800 compress_lz4.c:807 compress_zstd.c:26 +#: compress_io.c:108 compress_lz4.c:809 compress_lz4.c:816 compress_zstd.c:26 #: compress_zstd.c:32 #, c-format msgid "this build does not support compression with %s" @@ -138,17 +138,27 @@ msgstr "%s() が失敗しました: %m" msgid "out of memory" msgstr "メモリ不足です" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません(内部エラー)。\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "メモリ割り当て要求サイズ %zu * %zu が不正です\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format @@ -539,7 +549,7 @@ msgstr "伸張できませんでした: %s" msgid "could not free LZ4 decompression context: %s" msgstr "LZ4伸張コンテクストを解放きませんでした: %s" -#: compress_lz4.c:260 compress_lz4.c:267 compress_lz4.c:689 compress_lz4.c:704 +#: compress_lz4.c:260 compress_lz4.c:267 compress_lz4.c:690 compress_lz4.c:708 #, c-format msgid "could not end compression: %s" msgstr "圧縮を終了できませんでした: %s" @@ -564,17 +574,17 @@ msgstr "書き込み中にエラーが発生しました: %s" msgid "error during writing: %m" msgstr "書き込み中にエラーが発生しました: %m" -#: compress_lz4.c:698 +#: compress_lz4.c:700 #, c-format msgid "could not write to output file: %m" msgstr "出力ファイルに書き込めませんでした: %m" -#: compress_lz4.c:711 +#: compress_lz4.c:718 #, c-format msgid "could not end decompression: %s" msgstr "展開を終了できませんでした: %s" -#: compress_lz4.c:726 compress_none.c:156 +#: compress_lz4.c:735 compress_none.c:156 #, c-format msgid "could not close file: %m" msgstr "ファイルをクローズできませんでした: %m" @@ -635,17 +645,17 @@ msgstr "サーバーバージョンの不一致のため処理を中断します msgid "server version: %s; %s version: %s" msgstr "サーバーバージョン: %s、%s バージョン: %s" -#: connectdb.c:282 pg_dumpall.c:1790 +#: connectdb.c:282 pg_dumpall.c:1801 #, c-format msgid "executing %s" msgstr "%s を実行しています" -#: connectdb.c:288 pg_backup_db.c:210 pg_dumpall.c:1796 +#: connectdb.c:288 pg_backup_db.c:210 pg_dumpall.c:1807 #, c-format msgid "query failed: %s" msgstr "問い合わせが失敗しました: %s" -#: connectdb.c:289 pg_backup_db.c:212 pg_dumpall.c:1797 +#: connectdb.c:289 pg_backup_db.c:212 pg_dumpall.c:1808 #, c-format msgid "Query was: %s" msgstr "問い合わせ: %s" @@ -794,455 +804,455 @@ msgstr "pgpipe: ソケットを接続できませんでした: エラーコー msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: 接続を受け付けられませんでした: エラーコード %d" -#: pg_backup_archiver.c:269 pg_backup_archiver.c:1745 +#: pg_backup_archiver.c:270 pg_backup_archiver.c:1746 #, c-format msgid "could not close output file: %m" msgstr "出力ファイルをクローズできませんでした: %m" -#: pg_backup_archiver.c:313 pg_backup_archiver.c:317 +#: pg_backup_archiver.c:314 pg_backup_archiver.c:318 #, c-format msgid "archive items not in correct section order" msgstr "アーカイブ項目が正しいセクション順ではありません" -#: pg_backup_archiver.c:323 +#: pg_backup_archiver.c:324 #, c-format msgid "unexpected section code %d" msgstr "想定外のセクションコード %d" -#: pg_backup_archiver.c:360 +#: pg_backup_archiver.c:361 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "このアーカイブファイル形式での並列はサポートしていません" -#: pg_backup_archiver.c:364 +#: pg_backup_archiver.c:365 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "8.0 より古い pg_dump で作られたアーカイブでの並列リストアはサポートしていません" -#: pg_backup_archiver.c:385 +#: pg_backup_archiver.c:386 #, c-format msgid "cannot restore from compressed archive (%s)" msgstr "圧縮アーカイブから復元できませんでした(%s)" -#: pg_backup_archiver.c:405 +#: pg_backup_archiver.c:406 #, c-format msgid "connecting to database for restore" msgstr "リストアのためデータベースに接続しています" -#: pg_backup_archiver.c:407 +#: pg_backup_archiver.c:408 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "1.3より古いアーカイブではデータベースへの直接接続はサポートされていません" -#: pg_backup_archiver.c:450 +#: pg_backup_archiver.c:451 #, c-format msgid "implied no-schema restore" msgstr "暗黙的にスキーマなしのリストアを行います" -#: pg_backup_archiver.c:529 +#: pg_backup_archiver.c:530 #, c-format msgid "dropping %s %s" msgstr "%s %sを削除しています" -#: pg_backup_archiver.c:661 +#: pg_backup_archiver.c:662 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "文\"%s\"中に IF EXISTS を挿入すべき場所が見つかりませでした" -#: pg_backup_archiver.c:855 pg_backup_archiver.c:857 +#: pg_backup_archiver.c:856 pg_backup_archiver.c:858 #, c-format msgid "warning from original dump file: %s" msgstr "オリジナルのダンプファイルからの警告: %s" -#: pg_backup_archiver.c:891 +#: pg_backup_archiver.c:892 #, c-format msgid "creating %s \"%s.%s\"" msgstr "%s \"%s.%s\"を作成しています" -#: pg_backup_archiver.c:894 +#: pg_backup_archiver.c:895 #, c-format msgid "creating %s \"%s\"" msgstr "%s \"%s\"を作成しています" -#: pg_backup_archiver.c:944 +#: pg_backup_archiver.c:945 #, c-format msgid "connecting to new database \"%s\"" msgstr "新しいデータベース\"%s\"に接続しています" -#: pg_backup_archiver.c:971 +#: pg_backup_archiver.c:972 #, c-format msgid "processing %s" msgstr "%sを処理しています" -#: pg_backup_archiver.c:993 +#: pg_backup_archiver.c:994 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "テーブル\"%s.%s\"のデータを処理しています" -#: pg_backup_archiver.c:1063 +#: pg_backup_archiver.c:1064 #, c-format msgid "executing %s %s" msgstr "%s %sを実行しています" -#: pg_backup_archiver.c:1132 +#: pg_backup_archiver.c:1133 #, c-format msgid "disabling triggers for %s" msgstr "%sのトリガを無効にしています" -#: pg_backup_archiver.c:1158 +#: pg_backup_archiver.c:1159 #, c-format msgid "enabling triggers for %s" msgstr "%sのトリガを有効にしています" -#: pg_backup_archiver.c:1223 +#: pg_backup_archiver.c:1224 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "内部エラー -- WriteDataはDataDumperルーチンのコンテクスト外では呼び出せません" -#: pg_backup_archiver.c:1418 +#: pg_backup_archiver.c:1419 #, c-format msgid "large-object output not supported in chosen format" msgstr "選択した形式ではラージオブジェクト出力をサポートしていません" -#: pg_backup_archiver.c:1481 +#: pg_backup_archiver.c:1482 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "%d個のラージオブジェクトを復元しました" -#: pg_backup_archiver.c:1508 pg_backup_tar.c:683 +#: pg_backup_archiver.c:1509 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "OID %uのラージオブジェクトをリストアしています" -#: pg_backup_archiver.c:1520 +#: pg_backup_archiver.c:1521 #, c-format msgid "could not create large object %u: %s" msgstr "ラージオブジェクト %u を作成できませんでした: %s" -#: pg_backup_archiver.c:1525 pg_dump.c:4100 +#: pg_backup_archiver.c:1526 pg_dump.c:4100 #, c-format msgid "could not open large object %u: %s" msgstr "ラージオブジェクト %u をオープンできませんでした: %s" -#: pg_backup_archiver.c:1581 +#: pg_backup_archiver.c:1582 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "TOCファイル\"%s\"をオープンできませんでした: %m" -#: pg_backup_archiver.c:1609 +#: pg_backup_archiver.c:1610 #, c-format msgid "line ignored: %s" msgstr "行を無視しました: %s" -#: pg_backup_archiver.c:1616 pg_backup_db.c:548 +#: pg_backup_archiver.c:1617 pg_backup_db.c:548 #, c-format msgid "could not find entry for ID %d" msgstr "ID %dのエントリがありませんでした" -#: pg_backup_archiver.c:1639 pg_backup_directory.c:187 +#: pg_backup_archiver.c:1640 pg_backup_directory.c:187 #: pg_backup_directory.c:563 #, c-format msgid "could not close TOC file: %m" msgstr "TOCファイルをクローズできませんでした: %m" -#: pg_backup_archiver.c:1726 pg_backup_custom.c:151 pg_backup_directory.c:301 +#: pg_backup_archiver.c:1727 pg_backup_custom.c:151 pg_backup_directory.c:301 #: pg_backup_directory.c:550 pg_backup_directory.c:616 #: pg_backup_directory.c:634 pg_dumpall.c:554 #, c-format msgid "could not open output file \"%s\": %m" msgstr "出力ファイル\"%s\"をオープンできませんでした: %m" -#: pg_backup_archiver.c:1728 pg_backup_custom.c:157 +#: pg_backup_archiver.c:1729 pg_backup_custom.c:157 #, c-format msgid "could not open output file: %m" msgstr "出力ファイルをオープンできませんでした: %m" -#: pg_backup_archiver.c:1811 +#: pg_backup_archiver.c:1812 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "ラージオブジェクトデータを%zuバイト書き出しました(結果は%d)" -#: pg_backup_archiver.c:1817 +#: pg_backup_archiver.c:1818 #, c-format msgid "could not write to large object: %s" msgstr "ラージオブジェクトに書き込めませんでした: %s" -#: pg_backup_archiver.c:1907 +#: pg_backup_archiver.c:1908 #, c-format msgid "while INITIALIZING:" msgstr "初期化中:" -#: pg_backup_archiver.c:1912 +#: pg_backup_archiver.c:1913 #, c-format msgid "while PROCESSING TOC:" msgstr "TOC処理中:" -#: pg_backup_archiver.c:1917 +#: pg_backup_archiver.c:1918 #, c-format msgid "while FINALIZING:" msgstr "終了処理中:" -#: pg_backup_archiver.c:1922 +#: pg_backup_archiver.c:1923 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "TOCエントリ%d; %u %u %s %s %s から" -#: pg_backup_archiver.c:1998 +#: pg_backup_archiver.c:1999 #, c-format msgid "bad dumpId" msgstr "不正なdumpId" -#: pg_backup_archiver.c:2019 +#: pg_backup_archiver.c:2020 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "TABLE DATA項目に対する不正なテーブルdumpId" -#: pg_backup_archiver.c:2111 +#: pg_backup_archiver.c:2112 #, c-format msgid "unexpected data offset flag %d" msgstr "想定外のデータオフセットフラグ %d" -#: pg_backup_archiver.c:2124 +#: pg_backup_archiver.c:2125 #, c-format msgid "file offset in dump file is too large" msgstr "ダンプファイルのファイルオフセットが大きすぎます" -#: pg_backup_archiver.c:2235 +#: pg_backup_archiver.c:2236 #, c-format msgid "directory name too long: \"%s\"" msgstr "ディレクトリ名が長すぎます: \"%s\"" -#: pg_backup_archiver.c:2285 +#: pg_backup_archiver.c:2286 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "ディレクトリ\"%s\"は有効なアーカイブではないようです(\"toc.dat\"がありません)" -#: pg_backup_archiver.c:2293 pg_backup_custom.c:168 pg_backup_custom.c:813 +#: pg_backup_archiver.c:2294 pg_backup_custom.c:168 pg_backup_custom.c:813 #: pg_backup_directory.c:172 pg_backup_directory.c:358 #, c-format msgid "could not open input file \"%s\": %m" msgstr "入力ファイル\"%s\"をオープンできませんでした: %m" -#: pg_backup_archiver.c:2300 pg_backup_custom.c:174 +#: pg_backup_archiver.c:2301 pg_backup_custom.c:174 #, c-format msgid "could not open input file: %m" msgstr "入力ファイルをオープンできませんでした: %m" -#: pg_backup_archiver.c:2306 +#: pg_backup_archiver.c:2307 #, c-format msgid "could not read input file: %m" msgstr "入力ファイルを読み込めませんでした: %m" -#: pg_backup_archiver.c:2308 +#: pg_backup_archiver.c:2309 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "入力ファイルが小さすぎます(読み取り%lu、想定は 5)" -#: pg_backup_archiver.c:2340 +#: pg_backup_archiver.c:2341 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "入力ファイルがテキスト形式のようです。psqlを使用してください。" -#: pg_backup_archiver.c:2346 +#: pg_backup_archiver.c:2347 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "入力ファイルが有効なアーカイブではないようです(小さすぎる?)" -#: pg_backup_archiver.c:2352 +#: pg_backup_archiver.c:2353 #, c-format -msgid "input file does not appear to be a valid archive" -msgstr "入力ファイルが有効なアーカイブではないようです" +msgid "input file does not appear to be a valid tar archive" +msgstr "入力ファイルが有効なtarアーカイブではないようです" -#: pg_backup_archiver.c:2361 +#: pg_backup_archiver.c:2362 #, c-format msgid "could not close input file: %m" msgstr "入力ファイルをクローズできませんでした: %m" -#: pg_backup_archiver.c:2440 +#: pg_backup_archiver.c:2441 #, c-format msgid "could not open stdout for appending: %m" msgstr "標準出力を追記用にオープンできませんでした: %m" -#: pg_backup_archiver.c:2485 +#: pg_backup_archiver.c:2486 #, c-format msgid "unrecognized file format \"%d\"" msgstr "認識不能のファイル形式\"%d\"" -#: pg_backup_archiver.c:2566 pg_backup_archiver.c:4797 +#: pg_backup_archiver.c:2567 pg_backup_archiver.c:4798 #, c-format msgid "finished item %d %s %s" msgstr "項目 %d %s %s の処理が完了" -#: pg_backup_archiver.c:2570 pg_backup_archiver.c:4810 +#: pg_backup_archiver.c:2571 pg_backup_archiver.c:4811 #, c-format msgid "worker process failed: exit code %d" msgstr "ワーカープロセスの処理失敗: 終了コード %d" -#: pg_backup_archiver.c:2668 +#: pg_backup_archiver.c:2669 #, c-format msgid "unexpected TOC entry in WriteToc(): %d %s %s" msgstr "WriteToc()で想定外のTOCエントリ: %d %s %s" -#: pg_backup_archiver.c:2672 pg_backup_custom.c:440 pg_backup_custom.c:506 -#: pg_backup_custom.c:635 pg_backup_custom.c:871 pg_backup_tar.c:1029 -#: pg_backup_tar.c:1034 +#: pg_backup_archiver.c:2673 pg_backup_custom.c:440 pg_backup_custom.c:506 +#: pg_backup_custom.c:635 pg_backup_custom.c:871 pg_backup_tar.c:1004 +#: pg_backup_tar.c:1009 #, c-format msgid "error during file seek: %m" msgstr "ファイルシーク中にエラーがありました: %m" -#: pg_backup_archiver.c:2730 +#: pg_backup_archiver.c:2731 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "エントリID%dは範囲外です -- おそらくTOCの破損です" -#: pg_backup_archiver.c:2813 +#: pg_backup_archiver.c:2814 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "WITH OIDSと定義されたテーブルのリストアは今後サポートされません" -#: pg_backup_archiver.c:2895 +#: pg_backup_archiver.c:2896 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "認識不能のエンコーディング\"%s\"" -#: pg_backup_archiver.c:2901 +#: pg_backup_archiver.c:2902 #, c-format msgid "invalid ENCODING item: %s" msgstr "不正なENCODING項目: %s" -#: pg_backup_archiver.c:2919 +#: pg_backup_archiver.c:2920 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "不正なSTDSTRINGS項目: %s" -#: pg_backup_archiver.c:2944 +#: pg_backup_archiver.c:2945 #, c-format msgid "schema \"%s\" not found" msgstr "スキーマ \"%s\"が見つかりません" -#: pg_backup_archiver.c:2951 +#: pg_backup_archiver.c:2952 #, c-format msgid "table \"%s\" not found" msgstr "テーブル\"%s\"が見つかりません" -#: pg_backup_archiver.c:2958 +#: pg_backup_archiver.c:2959 #, c-format msgid "index \"%s\" not found" msgstr "インデックス\"%s\"が見つかりません" -#: pg_backup_archiver.c:2965 +#: pg_backup_archiver.c:2966 #, c-format msgid "function \"%s\" not found" msgstr "関数\"%s\"が見つかりません" -#: pg_backup_archiver.c:2972 +#: pg_backup_archiver.c:2973 #, c-format msgid "trigger \"%s\" not found" msgstr "トリガ\"%s\"が見つかりません" -#: pg_backup_archiver.c:3469 +#: pg_backup_archiver.c:3470 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "セッションユーザーを\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3611 +#: pg_backup_archiver.c:3612 #, c-format msgid "could not set \"search_path\" to \"%s\": %s" msgstr "\"search_path\"を\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3672 +#: pg_backup_archiver.c:3673 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "\"default_tablespace\"を\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3721 +#: pg_backup_archiver.c:3722 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "\"default_table_access_method\"を設定できませんでした: %s" -#: pg_backup_archiver.c:3770 +#: pg_backup_archiver.c:3771 #, c-format msgid "could not alter table access method: %s" msgstr "テーブルアクセスメソッドを変更できませんでした: %s" -#: pg_backup_archiver.c:3871 +#: pg_backup_archiver.c:3872 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "オブジェクトタイプ%sに対する所有者の設定方法がわかりません" -#: pg_backup_archiver.c:4006 +#: pg_backup_archiver.c:4007 #, c-format msgid "unexpected TOC entry in _printTocEntry(): %d %s %s" msgstr "_printTocEntry()で想定外のTOCエントリ: %d %s %s" -#: pg_backup_archiver.c:4154 +#: pg_backup_archiver.c:4155 #, c-format msgid "did not find magic string in file header" msgstr "ファイルヘッダにマジック文字列がありませんでした" -#: pg_backup_archiver.c:4168 +#: pg_backup_archiver.c:4169 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ファイルヘッダ内のバージョン(%d.%d)はサポートされていません" -#: pg_backup_archiver.c:4173 +#: pg_backup_archiver.c:4174 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "整数のサイズ(%lu)に関する健全性検査が失敗しました" -#: pg_backup_archiver.c:4177 +#: pg_backup_archiver.c:4178 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "アーカイブはより大きなサイズの整数を持つマシンで作成されました、一部の操作が失敗する可能性があります" -#: pg_backup_archiver.c:4187 +#: pg_backup_archiver.c:4188 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "想定した形式(%d)はファイル内にある形式(%d)と異なります" -#: pg_backup_archiver.c:4209 +#: pg_backup_archiver.c:4210 #, c-format msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" msgstr "アーカイブは圧縮されていますが、このインストールでは圧縮をサポートしていません (%s)-- データは利用できません" -#: pg_backup_archiver.c:4245 +#: pg_backup_archiver.c:4246 #, c-format msgid "invalid creation date in header" msgstr "ヘッダ内の作成日付が不正です" -#: pg_backup_archiver.c:4379 +#: pg_backup_archiver.c:4380 #, c-format msgid "processing item %d %s %s" msgstr "項目 %d %s %s を処理しています" -#: pg_backup_archiver.c:4464 +#: pg_backup_archiver.c:4465 #, c-format msgid "entering main parallel loop" msgstr "メインの並列ループに入ります" -#: pg_backup_archiver.c:4475 +#: pg_backup_archiver.c:4476 #, c-format msgid "skipping item %d %s %s" msgstr "項目 %d %s %s をスキップしています" -#: pg_backup_archiver.c:4484 +#: pg_backup_archiver.c:4485 #, c-format msgid "launching item %d %s %s" msgstr "項目 %d %s %s に着手します" -#: pg_backup_archiver.c:4538 +#: pg_backup_archiver.c:4539 #, c-format msgid "finished main parallel loop" msgstr "メインの並列ループが終了しました" -#: pg_backup_archiver.c:4574 +#: pg_backup_archiver.c:4575 #, c-format msgid "processing missed item %d %s %s" msgstr "やり残し項目 %d %s %s を処理しています" -#: pg_backup_archiver.c:5116 +#: pg_backup_archiver.c:5117 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "テーブル\"%s\"を作成できませんでした、このテーブルのデータは復元されません" @@ -1283,7 +1293,7 @@ msgid "unrecognized data block type %d while restoring archive" msgstr "アーカイブのりストア中に認識不可のデータブロックタイプ%dがありました" #: pg_backup_custom.c:750 pg_backup_custom.c:804 pg_backup_custom.c:946 -#: pg_backup_tar.c:1032 +#: pg_backup_tar.c:1007 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "アーカイブファイルのシーク位置を決定できませんでした: %m" @@ -1472,33 +1482,33 @@ msgstr "想定外のCOPY文の構文: \"%s\"" msgid "invalid OID for large object (%u)" msgstr "ラージオブジェクトの不正なOID(%u)" -#: pg_backup_tar.c:1048 +#: pg_backup_tar.c:1023 #, c-format msgid "could not close temporary file: %m" msgstr "一時ファイルを開けませんでした: %m" -#: pg_backup_tar.c:1051 +#: pg_backup_tar.c:1026 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "実際のファイル長(%lld)が想定(%lld)と一致しません" -#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 +#: pg_backup_tar.c:1072 pg_backup_tar.c:1103 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "tar アーカイブ内でファイル\"%s\"のヘッダがありませんでした" -#: pg_backup_tar.c:1115 +#: pg_backup_tar.c:1090 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "このアーカイブ形式では、順不同でのデータのリストアはサポートされていません: \"%s\"は必要ですが、アーカイブファイル内で\"%s\"より前に来ました。" -#: pg_backup_tar.c:1162 +#: pg_backup_tar.c:1137 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "不完全なtarヘッダがありました(%luバイト)" -#: pg_backup_tar.c:1201 +#: pg_backup_tar.c:1176 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "破損したtarヘッダが%sにありました(想定 %d、算出結果 %d) ファイル位置 %llu" @@ -2134,7 +2144,7 @@ msgstr "スタンバイサーバーからの並列ダンプはこのサーバー msgid "invalid output format \"%s\" specified" msgstr "不正な出力形式\"%s\"が指定されました" -#: pg_dump.c:1641 pg_dump.c:1697 pg_dump.c:1750 pg_dumpall.c:1594 +#: pg_dump.c:1641 pg_dump.c:1697 pg_dump.c:1750 pg_dumpall.c:1605 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" @@ -2259,8 +2269,8 @@ msgstr "行レベルセキュリティポリシーを読み取ります" msgid "unexpected policy command type: %c" msgstr "想定外のポリシコマンドタイプ: \"%c\"" -#: pg_dump.c:4801 pg_dump.c:5358 pg_dump.c:7987 pg_dump.c:13467 pg_dump.c:19678 -#: pg_dump.c:19680 pg_dump.c:20312 +#: pg_dump.c:4801 pg_dump.c:5358 pg_dump.c:7987 pg_dump.c:13467 pg_dump.c:19681 +#: pg_dump.c:19683 pg_dump.c:20315 #, c-format msgid "could not parse %s array" msgstr "%s配列をパースできませんでした" @@ -2295,7 +2305,7 @@ msgstr "OID %uのスキーマは存在しません" msgid "cannot dump statistics for relation kind \"%c\"" msgstr "リレーション種別 '%c' の統計情報はダンプできません" -#: pg_dump.c:7521 pg_dump.c:19005 +#: pg_dump.c:7521 pg_dump.c:19008 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "健全性検査に失敗しました、OID %2$u であるシーケンスの OID %1$u である親テーブルがありません" @@ -2513,88 +2523,88 @@ msgstr "ビュー\"%s\"の定義が空のようです(長さが0)" msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDSは今後サポートされません(テーブル\"%s\")" -#: pg_dump.c:18082 +#: pg_dump.c:18085 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "テーブル\"%2$s\"の列番号%1$dは不正です" -#: pg_dump.c:18160 +#: pg_dump.c:18163 #, c-format msgid "could not parse index statistic columns" msgstr "インデックス統計列をパースできませんでした" -#: pg_dump.c:18162 +#: pg_dump.c:18165 #, c-format msgid "could not parse index statistic values" msgstr "インデックス統計値をパースできませんでした" -#: pg_dump.c:18164 +#: pg_dump.c:18167 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "インデックス統計に対して列と値の数が合致しません" -#: pg_dump.c:18393 +#: pg_dump.c:18396 #, c-format msgid "missing index for constraint \"%s\"" msgstr "制約\"%s\"のインデックスが見つかりません" -#: pg_dump.c:18662 +#: pg_dump.c:18665 #, c-format msgid "unrecognized constraint type: %c" msgstr "制約のタイプが識別できません: %c" -#: pg_dump.c:18715 +#: pg_dump.c:18718 #, c-format msgid "unrecognized sequence type: %s" msgstr "認識されないシーケンスの型\"%s\"" -#: pg_dump.c:18848 pg_dump.c:19086 +#: pg_dump.c:18851 pg_dump.c:19089 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "シーケンス\"%s\"のデータを得るための問い合わせが%d行返却しました(想定は1)" -#: pg_dump.c:18884 +#: pg_dump.c:18887 #, c-format msgid "unrecognized sequence type: %d" msgstr "認識されないシーケンスの型: %d" -#: pg_dump.c:19109 +#: pg_dump.c:19112 #, c-format msgid "failed to get data for sequence \"%s\"; user may lack SELECT privilege on the sequence or the sequence may have been concurrently dropped" msgstr "シーケンス \"%s\" のデータ取得に失敗しました; ユーザーはこのシーケンスへの SELECT 権限を持っていないか、シーケンスが同時に削除された可能性があります" -#: pg_dump.c:19430 +#: pg_dump.c:19433 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "テーブル\"%2$s\"のルール\"%1$s\"を得るための問い合わせが失敗しました: 間違った行数が返却されました" -#: pg_dump.c:19583 +#: pg_dump.c:19586 #, c-format msgid "could not find referenced extension %u" msgstr "親の機能拡張%uが見つかりません" -#: pg_dump.c:19682 +#: pg_dump.c:19685 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "機能拡張に対して設定と条件の数が一致しません" -#: pg_dump.c:19814 +#: pg_dump.c:19817 #, c-format msgid "reading dependency data" msgstr "データの依存データを読み込んでいます" -#: pg_dump.c:19900 +#: pg_dump.c:19903 #, c-format msgid "no referencing object %u %u" msgstr "参照元オブジェクト%u %uがありません" -#: pg_dump.c:19911 +#: pg_dump.c:19914 #, c-format msgid "no referenced object %u %u" msgstr "参照先オブジェクト%u %uがありません" -#: pg_dump.c:20346 pg_dump.c:20384 pg_dumpall.c:1842 pg_restore.c:642 +#: pg_dump.c:20349 pg_dump.c:20387 pg_dumpall.c:1853 pg_restore.c:642 #: pg_restore.c:688 #, c-format msgid "%s filter for \"%s\" is not allowed" @@ -2760,52 +2770,69 @@ msgid "role name starting with \"pg_\" skipped (%s)" msgstr "\"pg_\"で始まるロール名はスキップされました(%s)" #. translator: %s represents a numeric role OID -#: pg_dumpall.c:1127 pg_dumpall.c:1185 pg_dumpall.c:1194 +#: pg_dumpall.c:1127 #, c-format -msgid "found orphaned pg_auth_members entry for role %s" -msgstr "ロール %s に対する pg_auth_members エントリがありましたが、このロールは存在しません" +msgid "ignoring role grant for missing role with OID %s" +msgstr "存在しないOID %s のロールに対するGRANTを無視します" -#: pg_dumpall.c:1160 +#: pg_dumpall.c:1165 #, c-format msgid "could not find a legal dump ordering for memberships in role \"%s\"" msgstr "ロール\"%s\"のメンバーシップに対して正当なダンプ順序が見つかりませんでした" -#: pg_dumpall.c:1315 +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1191 +#, c-format +msgid "ignoring role grant to missing role with OID %s" +msgstr "存在しないOID %s のロールへのGRANTを無視します" + +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1206 +#, c-format +msgid "grant of role \"%s\" to \"%s\" has invalid grantor OID %s" +msgstr "ロール \"%s\"から\"%s\"へのGRANTの権限付与者 OID %s が不正です" + +#: pg_dumpall.c:1208 +#, c-format +msgid "This grant will be dumped without GRANTED BY." +msgstr "このGRANTは GRANTED BY なしでダンプされます。" + +#: pg_dumpall.c:1326 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "パラメータ\"%2$s\"のACLリスト(%1$s)をパースできませんでした" -#: pg_dumpall.c:1442 +#: pg_dumpall.c:1453 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "テーブル空間\"%2$s\"のACLリスト(%1$s)をパースできませんでした" -#: pg_dumpall.c:1656 +#: pg_dumpall.c:1667 #, c-format msgid "excluding database \"%s\"" msgstr "データベース\"%s\"を除外します" -#: pg_dumpall.c:1660 +#: pg_dumpall.c:1671 #, c-format msgid "dumping database \"%s\"" msgstr "データベース\"%s\"をダンプしています" -#: pg_dumpall.c:1693 +#: pg_dumpall.c:1704 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "データベース\"%s\"のダンプが失敗しました、終了します" -#: pg_dumpall.c:1699 +#: pg_dumpall.c:1710 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "出力ファイル\"%s\"を再オープンできませんでした: %m" -#: pg_dumpall.c:1743 +#: pg_dumpall.c:1754 #, c-format msgid "running \"%s\"" msgstr "\"%s\"を実行しています" -#: pg_dumpall.c:1862 +#: pg_dumpall.c:1873 msgid "unsupported filter object" msgstr "サポートされていないフィルターオブジェクト" @@ -3148,6 +3175,9 @@ msgstr "" #~ msgid "found database \"%s\" (OID: %u) in file \"%s\"" #~ msgstr "ファイル \"%3$s\" 内でデータベース \"%1$s\" (OID: %2$u) を検出しました。" +#~ msgid "found orphaned pg_auth_members entry for role %s" +#~ msgstr "ロール %s に対する pg_auth_members エントリがありましたが、このロールは存在しません" + #~ msgid "ignored %d error in file \"%s\"" #~ msgid_plural "ignored %d errors in file \"%s\"" #~ msgstr[0] "ファイル \"%2$s\" 内のエラー%1$d件を無視しました" diff --git a/src/bin/pg_dump/po/ru.po b/src/bin/pg_dump/po/ru.po index 953ad1c2bde..6aa4f19d513 100644 --- a/src/bin/pg_dump/po/ru.po +++ b/src/bin/pg_dump/po/ru.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_dump (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:57+0200\n" -"PO-Revision-Date: 2026-02-07 09:21+0200\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:50+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -43,7 +43,7 @@ msgstr "подсказка: " #: ../../common/compression.c:132 ../../common/compression.c:141 #: ../../common/compression.c:150 compress_gzip.c:441 compress_gzip.c:448 -#: compress_io.c:108 compress_lz4.c:800 compress_lz4.c:807 compress_zstd.c:26 +#: compress_io.c:108 compress_lz4.c:809 compress_lz4.c:816 compress_zstd.c:26 #: compress_zstd.c:32 #, c-format msgid "this build does not support compression with %s" @@ -132,7 +132,7 @@ msgstr "не удалось прочитать вывод команды \"%s\": msgid "no data was returned by command \"%s\"" msgstr "команда \"%s\" не выдала данные" -#: ../../common/exec.c:405 parallel.c:1611 +#: ../../common/exec.c:405 parallel.c:1613 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" @@ -141,17 +141,27 @@ msgstr "ошибка в %s(): %m" msgid "out of memory" msgstr "нехватка памяти" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format @@ -547,7 +557,7 @@ msgstr "не удалось распаковать данные: %s" msgid "could not free LZ4 decompression context: %s" msgstr "не удалось освободить контекст распаковки LZ4: %s" -#: compress_lz4.c:260 compress_lz4.c:267 compress_lz4.c:689 compress_lz4.c:704 +#: compress_lz4.c:260 compress_lz4.c:267 compress_lz4.c:690 compress_lz4.c:708 #, c-format msgid "could not end compression: %s" msgstr "не удалось завершить сжатие: %s" @@ -572,17 +582,17 @@ msgstr "ошибка при записи: %s" msgid "error during writing: %m" msgstr "ошибка при записи: %m" -#: compress_lz4.c:698 +#: compress_lz4.c:700 #, c-format msgid "could not write to output file: %m" msgstr "не удалось записать в выходной файл: %m" -#: compress_lz4.c:711 +#: compress_lz4.c:718 #, c-format msgid "could not end decompression: %s" msgstr "не удалось завершить распаковку: %s" -#: compress_lz4.c:726 compress_none.c:156 +#: compress_lz4.c:735 compress_none.c:156 #, c-format msgid "could not close file: %m" msgstr "не удалось закрыть файл: %m" @@ -643,17 +653,17 @@ msgstr "продолжение работы с другой версией се msgid "server version: %s; %s version: %s" msgstr "версия сервера: %s; версия %s: %s" -#: connectdb.c:282 pg_dumpall.c:1790 +#: connectdb.c:282 pg_dumpall.c:1801 #, c-format msgid "executing %s" msgstr "выполняется %s" -#: connectdb.c:288 pg_backup_db.c:210 pg_dumpall.c:1796 +#: connectdb.c:288 pg_backup_db.c:210 pg_dumpall.c:1807 #, c-format msgid "query failed: %s" msgstr "ошибка при выполнении запроса: %s" -#: connectdb.c:289 pg_backup_db.c:212 pg_dumpall.c:1797 +#: connectdb.c:289 pg_backup_db.c:212 pg_dumpall.c:1808 #, c-format msgid "Query was: %s" msgstr "Выполнялся запрос: %s" @@ -735,22 +745,27 @@ msgstr "ошибка в %s() (код ошибки: %d)" msgid "could not create communication channels: %m" msgstr "не удалось создать каналы межпроцессного взаимодействия: %m" -#: parallel.c:1018 +#: parallel.c:980 +#, c-format +msgid "could not create worker thread: %m" +msgstr "не удалось создать рабочий поток: %m" + +#: parallel.c:1020 #, c-format msgid "could not create worker process: %m" msgstr "не удалось создать рабочий процесс: %m" -#: parallel.c:1148 +#: parallel.c:1150 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "от ведущего процесса получена нераспознанная команда: \"%s\"" -#: parallel.c:1191 parallel.c:1429 +#: parallel.c:1193 parallel.c:1431 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "от рабочего процесса получено ошибочное сообщение: \"%s\"" -#: parallel.c:1323 +#: parallel.c:1325 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -763,157 +778,157 @@ msgstr "" "этой таблицы после того, как родительский процесс pg_dump получил для неё " "начальную блокировку ACCESS SHARE." -#: parallel.c:1412 +#: parallel.c:1414 #, c-format msgid "a worker process died unexpectedly" msgstr "рабочий процесс неожиданно прервался" -#: parallel.c:1534 parallel.c:1652 +#: parallel.c:1536 parallel.c:1654 #, c-format msgid "could not write to the communication channel: %m" msgstr "не удалось записать в канал взаимодействия: %m" -#: parallel.c:1736 +#: parallel.c:1738 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: не удалось создать сокет (код ошибки: %d)" -#: parallel.c:1747 +#: parallel.c:1749 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: не удалось привязаться к сокету (код ошибки: %d)" -#: parallel.c:1754 +#: parallel.c:1756 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: не удалось начать приём (код ошибки: %d)" -#: parallel.c:1761 +#: parallel.c:1763 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: ошибка в %s() (код ошибки: %d)" -#: parallel.c:1772 +#: parallel.c:1774 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: не удалось создать второй сокет (код ошибки: %d)" -#: parallel.c:1781 +#: parallel.c:1783 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: не удалось подключить сокет (код ошибки: %d)" -#: parallel.c:1790 +#: parallel.c:1792 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: не удалось принять соединение (код ошибки: %d)" -#: pg_backup_archiver.c:269 pg_backup_archiver.c:1745 +#: pg_backup_archiver.c:270 pg_backup_archiver.c:1746 #, c-format msgid "could not close output file: %m" msgstr "не удалось закрыть выходной файл: %m" -#: pg_backup_archiver.c:313 pg_backup_archiver.c:317 +#: pg_backup_archiver.c:314 pg_backup_archiver.c:318 #, c-format msgid "archive items not in correct section order" msgstr "в последовательности элементов архива нарушен порядок разделов" -#: pg_backup_archiver.c:323 +#: pg_backup_archiver.c:324 #, c-format msgid "unexpected section code %d" msgstr "неожиданный код раздела %d" -#: pg_backup_archiver.c:360 +#: pg_backup_archiver.c:361 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "" "параллельное восстановление не поддерживается с выбранным форматом архивного " "файла" -#: pg_backup_archiver.c:364 +#: pg_backup_archiver.c:365 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "" "параллельное восстановление возможно только для архивов, созданных pg_dump " "версии 8.0 и новее" -#: pg_backup_archiver.c:385 +#: pg_backup_archiver.c:386 #, c-format msgid "cannot restore from compressed archive (%s)" msgstr "восстановить данные из сжатого архива нельзя (%s)" -#: pg_backup_archiver.c:405 +#: pg_backup_archiver.c:406 #, c-format msgid "connecting to database for restore" msgstr "подключение к базе данных для восстановления" -#: pg_backup_archiver.c:407 +#: pg_backup_archiver.c:408 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "" "прямые подключения к базе данных не поддерживаются в архивах до версии 1.3" -#: pg_backup_archiver.c:450 +#: pg_backup_archiver.c:451 #, c-format msgid "implied no-schema restore" msgstr "подразумевается восстановление без схемы" -#: pg_backup_archiver.c:529 +#: pg_backup_archiver.c:530 #, c-format msgid "dropping %s %s" msgstr "удаляется %s %s" -#: pg_backup_archiver.c:661 +#: pg_backup_archiver.c:662 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "не удалось определить, куда добавить IF EXISTS в оператор \"%s\"" -#: pg_backup_archiver.c:855 pg_backup_archiver.c:857 +#: pg_backup_archiver.c:856 pg_backup_archiver.c:858 #, c-format msgid "warning from original dump file: %s" msgstr "предупреждение из исходного файла: %s" -#: pg_backup_archiver.c:891 +#: pg_backup_archiver.c:892 #, c-format msgid "creating %s \"%s.%s\"" msgstr "создаётся %s \"%s.%s\"" -#: pg_backup_archiver.c:894 +#: pg_backup_archiver.c:895 #, c-format msgid "creating %s \"%s\"" msgstr "создаётся %s \"%s\"" -#: pg_backup_archiver.c:944 +#: pg_backup_archiver.c:945 #, c-format msgid "connecting to new database \"%s\"" msgstr "подключение к новой базе данных \"%s\"" -#: pg_backup_archiver.c:971 +#: pg_backup_archiver.c:972 #, c-format msgid "processing %s" msgstr "обрабатывается %s" -#: pg_backup_archiver.c:993 +#: pg_backup_archiver.c:994 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "обрабатываются данные таблицы \"%s.%s\"" -#: pg_backup_archiver.c:1063 +#: pg_backup_archiver.c:1064 #, c-format msgid "executing %s %s" msgstr "выполняется %s %s" -#: pg_backup_archiver.c:1132 +#: pg_backup_archiver.c:1133 #, c-format msgid "disabling triggers for %s" msgstr "отключаются триггеры таблицы %s" -#: pg_backup_archiver.c:1158 +#: pg_backup_archiver.c:1159 #, c-format msgid "enabling triggers for %s" msgstr "включаются триггеры таблицы %s" -#: pg_backup_archiver.c:1223 +#: pg_backup_archiver.c:1224 #, c-format msgid "" "internal error -- WriteData cannot be called outside the context of a " @@ -922,12 +937,12 @@ msgstr "" "внутренняя ошибка -- WriteData нельзя вызывать вне контекста процедуры " "DataDumper" -#: pg_backup_archiver.c:1418 +#: pg_backup_archiver.c:1419 #, c-format msgid "large-object output not supported in chosen format" msgstr "выбранный формат не поддерживает выгрузку больших объектов" -#: pg_backup_archiver.c:1481 +#: pg_backup_archiver.c:1482 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" @@ -935,55 +950,55 @@ msgstr[0] "восстановлен %d большой объект" msgstr[1] "восстановлено %d больших объекта" msgstr[2] "восстановлено %d больших объектов" -#: pg_backup_archiver.c:1508 pg_backup_tar.c:683 +#: pg_backup_archiver.c:1509 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "восстановление большого объекта с OID %u" -#: pg_backup_archiver.c:1520 +#: pg_backup_archiver.c:1521 #, c-format msgid "could not create large object %u: %s" msgstr "не удалось создать большой объект %u: %s" -#: pg_backup_archiver.c:1525 pg_dump.c:4100 +#: pg_backup_archiver.c:1526 pg_dump.c:4100 #, c-format msgid "could not open large object %u: %s" msgstr "не удалось открыть большой объект %u: %s" -#: pg_backup_archiver.c:1581 +#: pg_backup_archiver.c:1582 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "не удалось открыть файл оглавления \"%s\": %m" -#: pg_backup_archiver.c:1609 +#: pg_backup_archiver.c:1610 #, c-format msgid "line ignored: %s" msgstr "строка проигнорирована: %s" -#: pg_backup_archiver.c:1616 pg_backup_db.c:548 +#: pg_backup_archiver.c:1617 pg_backup_db.c:548 #, c-format msgid "could not find entry for ID %d" msgstr "не найдена запись для ID %d" -#: pg_backup_archiver.c:1639 pg_backup_directory.c:187 +#: pg_backup_archiver.c:1640 pg_backup_directory.c:187 #: pg_backup_directory.c:563 #, c-format msgid "could not close TOC file: %m" msgstr "не удалось закрыть файл оглавления: %m" -#: pg_backup_archiver.c:1726 pg_backup_custom.c:151 pg_backup_directory.c:301 +#: pg_backup_archiver.c:1727 pg_backup_custom.c:151 pg_backup_directory.c:301 #: pg_backup_directory.c:550 pg_backup_directory.c:616 #: pg_backup_directory.c:634 pg_dumpall.c:554 #, c-format msgid "could not open output file \"%s\": %m" msgstr "не удалось открыть выходной файл \"%s\": %m" -#: pg_backup_archiver.c:1728 pg_backup_custom.c:157 +#: pg_backup_archiver.c:1729 pg_backup_custom.c:157 #, c-format msgid "could not open output file: %m" msgstr "не удалось открыть выходной файл: %m" -#: pg_backup_archiver.c:1811 +#: pg_backup_archiver.c:1812 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" @@ -991,238 +1006,238 @@ msgstr[0] "записан %zu байт данных большого объек msgstr[1] "записано %zu байта данных большого объекта (результат = %d)" msgstr[2] "записано %zu байт данных большого объекта (результат = %d)" -#: pg_backup_archiver.c:1817 +#: pg_backup_archiver.c:1818 #, c-format msgid "could not write to large object: %s" msgstr "не удалось записать данные в большой объект: %s" -#: pg_backup_archiver.c:1907 +#: pg_backup_archiver.c:1908 #, c-format msgid "while INITIALIZING:" msgstr "при инициализации:" -#: pg_backup_archiver.c:1912 +#: pg_backup_archiver.c:1913 #, c-format msgid "while PROCESSING TOC:" msgstr "при обработке оглавления:" -#: pg_backup_archiver.c:1917 +#: pg_backup_archiver.c:1918 #, c-format msgid "while FINALIZING:" msgstr "при завершении:" -#: pg_backup_archiver.c:1922 +#: pg_backup_archiver.c:1923 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "из записи оглавления %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1998 +#: pg_backup_archiver.c:1999 #, c-format msgid "bad dumpId" msgstr "неверный dumpId" -#: pg_backup_archiver.c:2019 +#: pg_backup_archiver.c:2020 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "неверный dumpId таблицы в элементе TABLE DATA" -#: pg_backup_archiver.c:2111 +#: pg_backup_archiver.c:2112 #, c-format msgid "unexpected data offset flag %d" msgstr "неожиданный флаг смещения данных: %d" -#: pg_backup_archiver.c:2124 +#: pg_backup_archiver.c:2125 #, c-format msgid "file offset in dump file is too large" msgstr "слишком большое смещение в файле выгрузки" -#: pg_backup_archiver.c:2235 +#: pg_backup_archiver.c:2236 #, c-format msgid "directory name too long: \"%s\"" msgstr "слишком длинное имя каталога: \"%s\"" -#: pg_backup_archiver.c:2285 +#: pg_backup_archiver.c:2286 #, c-format msgid "" "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not " "exist)" msgstr "каталог \"%s\" не похож на архивный (в нём отсутствует \"toc.dat\")" -#: pg_backup_archiver.c:2293 pg_backup_custom.c:168 pg_backup_custom.c:813 +#: pg_backup_archiver.c:2294 pg_backup_custom.c:168 pg_backup_custom.c:813 #: pg_backup_directory.c:172 pg_backup_directory.c:358 #, c-format msgid "could not open input file \"%s\": %m" msgstr "не удалось открыть входной файл \"%s\": %m" -#: pg_backup_archiver.c:2300 pg_backup_custom.c:174 +#: pg_backup_archiver.c:2301 pg_backup_custom.c:174 #, c-format msgid "could not open input file: %m" msgstr "не удалось открыть входной файл: %m" -#: pg_backup_archiver.c:2306 +#: pg_backup_archiver.c:2307 #, c-format msgid "could not read input file: %m" msgstr "не удалось прочитать входной файл: %m" -#: pg_backup_archiver.c:2308 +#: pg_backup_archiver.c:2309 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "входной файл слишком короткий (прочитано байт: %lu, ожидалось: 5)" -#: pg_backup_archiver.c:2340 +#: pg_backup_archiver.c:2341 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "" "входной файл, видимо, имеет текстовый формат. Загрузите его с помощью psql." -#: pg_backup_archiver.c:2346 +#: pg_backup_archiver.c:2347 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "входной файл не похож на архив (возможно, слишком мал?)" -#: pg_backup_archiver.c:2352 +#: pg_backup_archiver.c:2353 #, c-format -msgid "input file does not appear to be a valid archive" -msgstr "входной файл не похож на архив" +msgid "input file does not appear to be a valid tar archive" +msgstr "входной файл не похож на архив tar" -#: pg_backup_archiver.c:2361 +#: pg_backup_archiver.c:2362 #, c-format msgid "could not close input file: %m" msgstr "не удалось закрыть входной файл: %m" -#: pg_backup_archiver.c:2440 +#: pg_backup_archiver.c:2441 #, c-format msgid "could not open stdout for appending: %m" msgstr "не удалось открыть stdout для добавления вывода: %m" -#: pg_backup_archiver.c:2485 +#: pg_backup_archiver.c:2486 #, c-format msgid "unrecognized file format \"%d\"" msgstr "неопознанный формат файла: \"%d\"" -#: pg_backup_archiver.c:2566 pg_backup_archiver.c:4797 +#: pg_backup_archiver.c:2567 pg_backup_archiver.c:4837 #, c-format msgid "finished item %d %s %s" msgstr "закончен объект %d %s %s" -#: pg_backup_archiver.c:2570 pg_backup_archiver.c:4810 +#: pg_backup_archiver.c:2571 pg_backup_archiver.c:4850 #, c-format msgid "worker process failed: exit code %d" msgstr "рабочий процесс завершился с кодом возврата %d" -#: pg_backup_archiver.c:2668 +#: pg_backup_archiver.c:2669 #, c-format msgid "unexpected TOC entry in WriteToc(): %d %s %s" msgstr "неожиданная запись оглавления в WriteToc(): %d %s %s" -#: pg_backup_archiver.c:2672 pg_backup_custom.c:440 pg_backup_custom.c:506 -#: pg_backup_custom.c:635 pg_backup_custom.c:871 pg_backup_tar.c:1029 -#: pg_backup_tar.c:1034 +#: pg_backup_archiver.c:2673 pg_backup_custom.c:440 pg_backup_custom.c:506 +#: pg_backup_custom.c:635 pg_backup_custom.c:871 pg_backup_tar.c:1004 +#: pg_backup_tar.c:1009 #, c-format msgid "error during file seek: %m" msgstr "ошибка при перемещении в файле: %m" -#: pg_backup_archiver.c:2730 +#: pg_backup_archiver.c:2731 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "ID записи %d вне диапазона - возможно повреждено оглавление" -#: pg_backup_archiver.c:2813 +#: pg_backup_archiver.c:2814 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "восстановление таблиц со свойством WITH OIDS больше не поддерживается" -#: pg_backup_archiver.c:2895 +#: pg_backup_archiver.c:2896 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "нераспознанная кодировка \"%s\"" -#: pg_backup_archiver.c:2901 +#: pg_backup_archiver.c:2902 #, c-format msgid "invalid ENCODING item: %s" msgstr "неверный элемент ENCODING: %s" -#: pg_backup_archiver.c:2919 +#: pg_backup_archiver.c:2920 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "неверный элемент STDSTRINGS: %s" -#: pg_backup_archiver.c:2944 +#: pg_backup_archiver.c:2945 #, c-format msgid "schema \"%s\" not found" msgstr "схема \"%s\" не найдена" -#: pg_backup_archiver.c:2951 +#: pg_backup_archiver.c:2952 #, c-format msgid "table \"%s\" not found" msgstr "таблица \"%s\" не найдена" -#: pg_backup_archiver.c:2958 +#: pg_backup_archiver.c:2959 #, c-format msgid "index \"%s\" not found" msgstr "индекс \"%s\" не найден" -#: pg_backup_archiver.c:2965 +#: pg_backup_archiver.c:2966 #, c-format msgid "function \"%s\" not found" msgstr "функция \"%s\" не найдена" -#: pg_backup_archiver.c:2972 +#: pg_backup_archiver.c:2973 #, c-format msgid "trigger \"%s\" not found" msgstr "триггер \"%s\" не найден" -#: pg_backup_archiver.c:3469 +#: pg_backup_archiver.c:3509 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "не удалось переключить пользователя сеанса на \"%s\": %s" -#: pg_backup_archiver.c:3611 +#: pg_backup_archiver.c:3651 #, c-format msgid "could not set \"search_path\" to \"%s\": %s" msgstr "не удалось присвоить \"search_path\" значение \"%s\": %s" -#: pg_backup_archiver.c:3672 +#: pg_backup_archiver.c:3712 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "не удалось задать для \"default_tablespace\" значение %s: %s" -#: pg_backup_archiver.c:3721 +#: pg_backup_archiver.c:3761 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "не удалось задать \"default_table_access_method\": %s" -#: pg_backup_archiver.c:3770 +#: pg_backup_archiver.c:3810 #, c-format msgid "could not alter table access method: %s" msgstr "не удалось изменить табличный метод доступа: %s" -#: pg_backup_archiver.c:3871 +#: pg_backup_archiver.c:3911 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "неизвестно, как назначить владельца для объекта типа \"%s\"" -#: pg_backup_archiver.c:4006 +#: pg_backup_archiver.c:4046 #, c-format msgid "unexpected TOC entry in _printTocEntry(): %d %s %s" msgstr "неожиданная запись оглавления в _printTocEntry(): %d %s %s" -#: pg_backup_archiver.c:4154 +#: pg_backup_archiver.c:4194 #, c-format msgid "did not find magic string in file header" msgstr "в заголовке файла не найдена нужная сигнатура" -#: pg_backup_archiver.c:4168 +#: pg_backup_archiver.c:4208 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "неподдерживаемая версия (%d.%d) в заголовке файла" -#: pg_backup_archiver.c:4173 +#: pg_backup_archiver.c:4213 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "несоответствие размера integer (%lu)" -#: pg_backup_archiver.c:4177 +#: pg_backup_archiver.c:4217 #, c-format msgid "" "archive was made on a machine with larger integers, some operations might " @@ -1231,12 +1246,12 @@ msgstr "" "архив был сделан на компьютере большей разрядности -- возможен сбой " "некоторых операций" -#: pg_backup_archiver.c:4187 +#: pg_backup_archiver.c:4227 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "ожидаемый формат (%d) отличается от формата, указанного в файле (%d)" -#: pg_backup_archiver.c:4209 +#: pg_backup_archiver.c:4249 #, c-format msgid "" "archive is compressed, but this installation does not support compression " @@ -1245,42 +1260,42 @@ msgstr "" "архив сжат, но установленная версия не поддерживает сжатие (%s) -- данные " "будут недоступны" -#: pg_backup_archiver.c:4245 +#: pg_backup_archiver.c:4285 #, c-format msgid "invalid creation date in header" msgstr "неверная дата создания в заголовке" -#: pg_backup_archiver.c:4379 +#: pg_backup_archiver.c:4419 #, c-format msgid "processing item %d %s %s" msgstr "обработка объекта %d %s %s" -#: pg_backup_archiver.c:4464 +#: pg_backup_archiver.c:4504 #, c-format msgid "entering main parallel loop" msgstr "вход в основной параллельный цикл" -#: pg_backup_archiver.c:4475 +#: pg_backup_archiver.c:4515 #, c-format msgid "skipping item %d %s %s" msgstr "объект %d %s %s пропускается" -#: pg_backup_archiver.c:4484 +#: pg_backup_archiver.c:4524 #, c-format msgid "launching item %d %s %s" msgstr "объект %d %s %s запускается" -#: pg_backup_archiver.c:4538 +#: pg_backup_archiver.c:4578 #, c-format msgid "finished main parallel loop" msgstr "основной параллельный цикл закончен" -#: pg_backup_archiver.c:4574 +#: pg_backup_archiver.c:4614 #, c-format msgid "processing missed item %d %s %s" msgstr "обработка пропущенного объекта %d %s %s" -#: pg_backup_archiver.c:5116 +#: pg_backup_archiver.c:5156 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "создать таблицу \"%s\" не удалось, её данные не будут восстановлены" @@ -1326,7 +1341,7 @@ msgid "unrecognized data block type %d while restoring archive" msgstr "нераспознанный тип блока данных %d при восстановлении архива" #: pg_backup_custom.c:750 pg_backup_custom.c:804 pg_backup_custom.c:946 -#: pg_backup_tar.c:1032 +#: pg_backup_tar.c:1007 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "не удалось определить позицию в файле архива: %m" @@ -1520,22 +1535,22 @@ msgstr "недопустимый синтаксис оператора COPY: \"% msgid "invalid OID for large object (%u)" msgstr "неверный OID для большого объекта (%u)" -#: pg_backup_tar.c:1048 +#: pg_backup_tar.c:1023 #, c-format msgid "could not close temporary file: %m" msgstr "не удалось закрыть временный файл: %m" -#: pg_backup_tar.c:1051 +#: pg_backup_tar.c:1026 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "действительная длина файла (%lld) не равна ожидаемой (%lld)" -#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 +#: pg_backup_tar.c:1072 pg_backup_tar.c:1103 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "в архиве tar не найден заголовок для файла \"%s\"" -#: pg_backup_tar.c:1115 +#: pg_backup_tar.c:1090 #, c-format msgid "" "restoring data out of order is not supported in this archive format: \"%s\" " @@ -1545,7 +1560,7 @@ msgstr "" "поддерживается: требуется компонент \"%s\", но в файле архива прежде идёт " "\"%s\"." -#: pg_backup_tar.c:1162 +#: pg_backup_tar.c:1137 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" @@ -1553,7 +1568,7 @@ msgstr[0] "найден неполный заголовок tar (размер %l msgstr[1] "найден неполный заголовок tar (размер %lu байта)" msgstr[2] "найден неполный заголовок tar (размер %lu байт)" -#: pg_backup_tar.c:1201 +#: pg_backup_tar.c:1176 #, c-format msgid "" "corrupt tar header found in %s (expected %d, computed %d) file position %llu" @@ -2282,7 +2297,7 @@ msgstr "" msgid "invalid output format \"%s\" specified" msgstr "указан неверный формат вывода: \"%s\"" -#: pg_dump.c:1641 pg_dump.c:1697 pg_dump.c:1750 pg_dumpall.c:1594 +#: pg_dump.c:1641 pg_dump.c:1697 pg_dump.c:1750 pg_dumpall.c:1605 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное имя (слишком много компонентов): %s" @@ -2408,8 +2423,8 @@ msgstr "чтение политик защиты на уровне строк" msgid "unexpected policy command type: %c" msgstr "нераспознанный тип команды в политике: %c" -#: pg_dump.c:4801 pg_dump.c:5358 pg_dump.c:7987 pg_dump.c:13467 pg_dump.c:19678 -#: pg_dump.c:19680 pg_dump.c:20312 +#: pg_dump.c:4801 pg_dump.c:5358 pg_dump.c:7987 pg_dump.c:13467 pg_dump.c:19681 +#: pg_dump.c:19683 pg_dump.c:20315 #, c-format msgid "could not parse %s array" msgstr "не удалось разобрать массив %s" @@ -2445,7 +2460,7 @@ msgstr "схема с OID %u не существует" msgid "cannot dump statistics for relation kind \"%c\"" msgstr "для отношения типа \"%c\" нельзя выгрузить статистику" -#: pg_dump.c:7521 pg_dump.c:19005 +#: pg_dump.c:7521 pg_dump.c:19008 #, c-format msgid "" "failed sanity check, parent table with OID %u of sequence with OID %u not " @@ -2462,13 +2477,13 @@ msgstr "" "нарушение целостности: таблица с OID %u, фигурирующим в " "pg_partitioned_table, не найдена" -#: pg_dump.c:7931 pg_dump.c:8224 pg_dump.c:8687 pg_dump.c:9334 pg_dump.c:9473 +#: pg_dump.c:7929 pg_dump.c:8224 pg_dump.c:8687 pg_dump.c:9334 pg_dump.c:9473 #: pg_dump.c:9618 pg_dump.c:9718 #, c-format msgid "unrecognized table OID %u" msgstr "нераспознанный OID таблицы %u" -#: pg_dump.c:7935 +#: pg_dump.c:7933 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "неожиданно получены данные индекса для таблицы \"%s\"" @@ -2696,44 +2711,44 @@ msgstr "определение представления \"%s\" пустое ( msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "свойство WITH OIDS больше не поддерживается (таблица \"%s\")" -#: pg_dump.c:18082 +#: pg_dump.c:18085 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "неверный номер столбца %d для таблицы \"%s\"" -#: pg_dump.c:18160 +#: pg_dump.c:18163 #, c-format msgid "could not parse index statistic columns" msgstr "не удалось разобрать столбцы статистики в индексе" -#: pg_dump.c:18162 +#: pg_dump.c:18165 #, c-format msgid "could not parse index statistic values" msgstr "не удалось разобрать значения статистики в индексе" -#: pg_dump.c:18164 +#: pg_dump.c:18167 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "" "столбцы, задающие статистику индекса, не соответствуют значениям по " "количеству" -#: pg_dump.c:18393 +#: pg_dump.c:18396 #, c-format msgid "missing index for constraint \"%s\"" msgstr "отсутствует индекс для ограничения \"%s\"" -#: pg_dump.c:18662 +#: pg_dump.c:18665 #, c-format msgid "unrecognized constraint type: %c" msgstr "нераспознанный тип ограничения: %c" -#: pg_dump.c:18715 +#: pg_dump.c:18718 #, c-format msgid "unrecognized sequence type: %s" msgstr "нераспознанный тип последовательности: %s" -#: pg_dump.c:18848 pg_dump.c:19086 +#: pg_dump.c:18851 pg_dump.c:19089 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "" @@ -2748,12 +2763,12 @@ msgstr[2] "" "запрос на получение данных последовательности \"%s\" вернул %d строк " "(ожидалась 1)" -#: pg_dump.c:18884 +#: pg_dump.c:18887 #, c-format msgid "unrecognized sequence type: %d" msgstr "нераспознанный тип последовательности: %d" -#: pg_dump.c:19109 +#: pg_dump.c:19112 #, c-format msgid "" "failed to get data for sequence \"%s\"; user may lack SELECT privilege on " @@ -2762,7 +2777,7 @@ msgstr "" "не удалось получить данные последовательности \"%s\"; возможно, пользователь " "не имеет права SELECT для неё или она была удалена" -#: pg_dump.c:19430 +#: pg_dump.c:19433 #, c-format msgid "" "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows " @@ -2771,32 +2786,32 @@ msgstr "" "запрос на получение правила \"%s\" для таблицы \"%s\" возвратил неверное " "число строк" -#: pg_dump.c:19583 +#: pg_dump.c:19586 #, c-format msgid "could not find referenced extension %u" msgstr "не удалось найти упомянутое расширение %u" -#: pg_dump.c:19682 +#: pg_dump.c:19685 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "конфигурации расширения не соответствуют условиям по количеству" -#: pg_dump.c:19814 +#: pg_dump.c:19817 #, c-format msgid "reading dependency data" msgstr "чтение информации о зависимостях" -#: pg_dump.c:19900 +#: pg_dump.c:19903 #, c-format msgid "no referencing object %u %u" msgstr "нет подчинённого объекта %u %u" -#: pg_dump.c:19911 +#: pg_dump.c:19914 #, c-format msgid "no referenced object %u %u" msgstr "нет вышестоящего объекта %u %u" -#: pg_dump.c:20346 pg_dump.c:20384 pg_dumpall.c:1842 pg_restore.c:642 +#: pg_dump.c:20349 pg_dump.c:20387 pg_dumpall.c:1853 pg_restore.c:642 #: pg_restore.c:688 #, c-format msgid "%s filter for \"%s\" is not allowed" @@ -2989,54 +3004,71 @@ msgid "role name starting with \"pg_\" skipped (%s)" msgstr "имя роли, начинающееся с \"pg_\", пропущено (%s)" #. translator: %s represents a numeric role OID -#: pg_dumpall.c:1127 pg_dumpall.c:1185 pg_dumpall.c:1194 +#: pg_dumpall.c:1127 #, c-format -msgid "found orphaned pg_auth_members entry for role %s" -msgstr "обнаружена потерянная запись pg_auth_members для роли %s" +msgid "ignoring role grant for missing role with OID %s" +msgstr "назначение прав для отсутствующей роли с OID %s игнорируется" -#: pg_dumpall.c:1160 +#: pg_dumpall.c:1165 #, c-format msgid "could not find a legal dump ordering for memberships in role \"%s\"" msgstr "не удалось найти подходящий порядок выгрузки для членов роли \"%s\"" -#: pg_dumpall.c:1315 +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1191 +#, c-format +msgid "ignoring role grant to missing role with OID %s" +msgstr "назначение прав отсутствующей роли с OID %s игнорируется" + +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1206 +#, c-format +msgid "grant of role \"%s\" to \"%s\" has invalid grantor OID %s" +msgstr "роль \"%s\" назначена \"%s\" с некорректным OID праводателя %s" + +#: pg_dumpall.c:1208 +#, c-format +msgid "This grant will be dumped without GRANTED BY." +msgstr "Это назначение будет выгружено без GRANTED BY." + +#: pg_dumpall.c:1326 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "не удалось разобрать список ACL (%s) для параметра \"%s\"" -#: pg_dumpall.c:1442 +#: pg_dumpall.c:1453 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "" "не удалось разобрать список управления доступом (%s) для табл. пространства " "\"%s\"" -#: pg_dumpall.c:1656 +#: pg_dumpall.c:1667 #, c-format msgid "excluding database \"%s\"" msgstr "база данных \"%s\" исключается" -#: pg_dumpall.c:1660 +#: pg_dumpall.c:1671 #, c-format msgid "dumping database \"%s\"" msgstr "выгрузка базы данных \"%s\"" -#: pg_dumpall.c:1693 +#: pg_dumpall.c:1704 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "ошибка при обработке базы \"%s\", pg_dump завершается" -#: pg_dumpall.c:1699 +#: pg_dumpall.c:1710 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "не удалось повторно открыть выходной файл \"%s\": %m" -#: pg_dumpall.c:1743 +#: pg_dumpall.c:1754 #, c-format msgid "running \"%s\"" msgstr "выполняется \"%s\"" -#: pg_dumpall.c:1862 +#: pg_dumpall.c:1873 msgid "unsupported filter object" msgstr "неподдерживаемый объект фильтра" @@ -3363,6 +3395,10 @@ msgstr "" "ввода.\n" "\n" +#, c-format +#~ msgid "found orphaned pg_auth_members entry for role %s" +#~ msgstr "обнаружена потерянная запись pg_auth_members для роли %s" + #, c-format #~ msgid "options -s/--schema-only and -a/--data-only cannot be used together" #~ msgstr "параметры -s/--schema-only и -a/--data-only исключают друг друга" diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 9512e2d89e5..99bdbcd0867 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -851,6 +851,60 @@ 'postgres', ], }, + statistics_only_with_schema => { + dump_cmd => [ + 'pg_dump', '--no-sync', + '--format' => 'custom', + '--file' => "$tempdir/statistics_only_with_schema.dump", + '--statistics-only', + '--schema' => 'dump_test', + 'postgres', + ], + restore_cmd => [ + 'pg_restore', + '--format' => 'custom', + '--file' => "$tempdir/statistics_only_with_schema.sql", + '--statistics-only', + '--schema' => 'dump_test', + "$tempdir/statistics_only_with_schema.dump", + ], + }, + statistics_only_with_table => { + dump_cmd => [ + 'pg_dump', '--no-sync', + '--format' => 'custom', + '--file' => "$tempdir/statistics_only_with_table.dump", + '--statistics', + 'postgres', + ], + restore_cmd => [ + 'pg_restore', + '--format' => 'custom', + '--file' => "$tempdir/statistics_only_with_table.sql", + '--statistics-only', + '--table' => 'test_table', + '--schema' => 'dump_test', + "$tempdir/statistics_only_with_table.dump", + ], + }, + statistics_only_with_index => { + dump_cmd => [ + 'pg_dump', '--no-sync', + '--format' => 'custom', + '--file' => "$tempdir/statistics_only_with_index.dump", + '--statistics', + 'postgres', + ], + restore_cmd => [ + 'pg_restore', + '--format' => 'custom', + '--file' => "$tempdir/statistics_only_with_index.sql", + '--statistics-only', + '--index' => '"dump_test"\'s post-data index', + '--schema' => 'dump_test', + "$tempdir/statistics_only_with_index.dump", + ], + }, no_schema => { dump_cmd => [ 'pg_dump', '--no-sync', @@ -931,8 +985,7 @@ no_table_access_method => 1, pg_dumpall_dbprivs => 1, pg_dumpall_exclude => 1, - schema_only => 1, - schema_only_with_statistics => 1,); + schema_only => 1,); # This is where the actual tests are defined. my %tests = ( @@ -1148,7 +1201,6 @@ no_large_objects => 1, no_owner => 1, schema_only => 1, - schema_only_with_statistics => 1, }, }, @@ -1702,7 +1754,6 @@ }, unlike => { schema_only => 1, - schema_only_with_statistics => 1, no_large_objects => 1, }, }, @@ -1727,7 +1778,6 @@ binary_upgrade => 1, no_large_objects => 1, schema_only => 1, - schema_only_with_statistics => 1, }, }, @@ -1750,7 +1800,6 @@ binary_upgrade => 1, no_large_objects => 1, schema_only => 1, - schema_only_with_statistics => 1, }, }, @@ -1917,7 +1966,6 @@ unlike => { no_large_objects => 1, schema_only => 1, - schema_only_with_statistics => 1, }, }, @@ -2100,7 +2148,6 @@ exclude_test_table => 1, exclude_test_table_data => 1, schema_only => 1, - schema_only_with_statistics => 1, only_dump_measurement => 1, }, }, @@ -2126,7 +2173,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - schema_only_with_statistics => 1, only_dump_measurement => 1, }, }, @@ -2167,7 +2213,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - schema_only_with_statistics => 1, only_dump_measurement => 1, }, }, @@ -2191,7 +2236,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - schema_only_with_statistics => 1, only_dump_measurement => 1, }, }, @@ -2216,7 +2260,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - schema_only_with_statistics => 1, only_dump_measurement => 1, }, }, @@ -2240,7 +2283,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - schema_only_with_statistics => 1, only_dump_measurement => 1, }, }, @@ -2264,7 +2306,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - schema_only_with_statistics => 1, only_dump_measurement => 1, }, }, @@ -3746,7 +3787,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - schema_only_with_statistics => 1, }, }, @@ -3919,7 +3959,6 @@ unlike => { binary_upgrade => 1, schema_only => 1, - schema_only_with_statistics => 1, exclude_measurement => 1, only_dump_test_schema => 1, test_schema_plus_large_objects => 1, @@ -4802,7 +4841,6 @@ no_large_objects => 1, no_privs => 1, schema_only => 1, - schema_only_with_statistics => 1, }, }, @@ -4921,7 +4959,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - schema_only_with_statistics => 1, only_dump_measurement => 1, }, }, @@ -4938,7 +4975,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - schema_only_with_statistics => 1, only_dump_measurement => 1, }, }, @@ -5137,7 +5173,8 @@ no_schema => 1, section_post_data => 1, statistics_only => 1, - schema_only_with_statistics => 1, + statistics_only_with_schema => 1, + statistics_only_with_index => 1, }, unlike => { exclude_dump_test_schema => 1, @@ -5166,7 +5203,9 @@ section_data => 1, section_post_data => 1, statistics_only => 1, - schema_only_with_statistics => 1, + statistics_only_with_schema => 1, + statistics_only_with_index => 1, + statistics_only_with_table => 1, }, unlike => { no_statistics => 1, diff --git a/src/bin/pg_resetwal/po/de.po b/src/bin/pg_resetwal/po/de.po index daead7311c3..f1f74cef93b 100644 --- a/src/bin/pg_resetwal/po/de.po +++ b/src/bin/pg_resetwal/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-04 18:51+0000\n" +"POT-Creation-Date: 2026-08-08 06:21+0000\n" "PO-Revision-Date: 2026-02-05 14:15+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -94,17 +94,27 @@ msgstr "konnte Datei »%s« nicht schreiben: %m" msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" diff --git a/src/bin/pg_resetwal/po/ru.po b/src/bin/pg_resetwal/po/ru.po index b5c0ea47bb3..f148eb61c02 100644 --- a/src/bin/pg_resetwal/po/ru.po +++ b/src/bin/pg_resetwal/po/ru.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_resetxlog (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:57+0200\n" -"PO-Revision-Date: 2026-02-07 09:15+0200\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:50+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -98,17 +98,27 @@ msgstr "не удалось записать файл \"%s\": %m" msgid "could not fsync file \"%s\": %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/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" diff --git a/src/bin/pg_rewind/po/de.po b/src/bin/pg_rewind/po/de.po index 6c1093dafe5..f99b579f066 100644 --- a/src/bin/pg_rewind/po/de.po +++ b/src/bin/pg_rewind/po/de.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL) 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-04-03 12:24+0000\n" -"PO-Revision-Date: 2025-04-03 16:19+0200\n" +"POT-Creation-Date: 2026-08-08 06:23+0000\n" +"PO-Revision-Date: 2026-08-08 09:53+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -36,18 +36,18 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " -#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#: ../../common/controldata_utils.c:97 file_ops.c:349 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:102 +#: ../../common/controldata_utils.c:110 file_ops.c:364 local_source.c:102 #: local_source.c:161 parsexlog.c:371 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:373 +#: ../../common/controldata_utils.c:119 file_ops.c:367 parsexlog.c:373 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" @@ -84,7 +84,7 @@ msgstr "" msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../../common/controldata_utils.c:249 file_ops.c:117 +#: ../../common/controldata_utils.c:249 file_ops.c:120 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" @@ -95,24 +95,34 @@ msgstr "konnte Datei »%s« nicht schreiben: %m" msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" #: ../../common/file_utils.c:123 ../../common/file_utils.c:588 -#: ../../fe_utils/archive.c:86 file_ops.c:417 +#: ../../fe_utils/archive.c:86 file_ops.c:353 file_ops.c:440 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" @@ -123,12 +133,12 @@ msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" msgid "this build does not support sync method \"%s\"" msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" -#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 file_ops.c:388 +#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 file_ops.c:411 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 file_ops.c:462 +#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 file_ops.c:485 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" @@ -250,107 +260,142 @@ msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s« msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" -#: file_ops.c:67 +#: file_ops.c:52 +#, c-format +msgid "target file path is unsafe for open: \"%s\"" +msgstr "Zieldateipfad ist zum Öffnen nicht sicher: »%s«" + +#: file_ops.c:70 #, c-format msgid "could not open target file \"%s\": %m" msgstr "konnte Zieldatei »%s« nicht öffnen: %m" -#: file_ops.c:81 +#: file_ops.c:84 #, c-format msgid "could not close target file \"%s\": %m" msgstr "konnte Zieldatei »%s« nicht schließen: %m" -#: file_ops.c:101 +#: file_ops.c:104 #, c-format msgid "could not seek in target file \"%s\": %m" msgstr "konnte Positionszeiger in Zieldatei »%s« nicht setzen: %m" -#: file_ops.c:150 file_ops.c:177 +#: file_ops.c:153 file_ops.c:180 #, c-format msgid "undefined file type for \"%s\"" msgstr "undefinierter Dateityp für »%s«" -#: file_ops.c:173 +#: file_ops.c:176 #, c-format msgid "invalid action (CREATE) for regular file" msgstr "ungültige Aktion (CREATE) für normale Datei" -#: file_ops.c:200 +#: file_ops.c:195 +#, c-format +msgid "target file path is unsafe for removal: \"%s\"" +msgstr "Zieldateipfad ist zum Entfernen nicht sicher: »%s«" + +#: file_ops.c:206 #, c-format msgid "could not remove file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" #: file_ops.c:218 #, c-format +msgid "target file path is unsafe for truncation: \"%s\"" +msgstr "Zieldateipfad ist für das Kürzen nicht sicher: »%s«" + +#: file_ops.c:227 +#, c-format msgid "could not open file \"%s\" for truncation: %m" msgstr "konnte Datei »%s« nicht zum Kürzen öffnen: %m" -#: file_ops.c:222 +#: file_ops.c:231 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "konnte Datei »%s« nicht auf %u kürzen: %m" -#: file_ops.c:238 +#: file_ops.c:243 +#, c-format +msgid "target directory path is unsafe for directory creation: \"%s\"" +msgstr "Zielverzeichnispfad ist zum Erstellen des Verzeichnisses nicht sicher: »%s«" + +#: file_ops.c:251 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: file_ops.c:252 +#: file_ops.c:261 +#, c-format +msgid "target directory path is unsafe for directory removal: \"%s\"" +msgstr "Zielverzeichnispfad ist zum Entfernen des Verzeichnisses nicht sicher: »%s«" + +#: file_ops.c:269 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht löschen: %m" -#: file_ops.c:266 +#: file_ops.c:279 +#, c-format +msgid "target symlink path is unsafe for creation: \"%s\"" +msgstr "Ziel-Symlink-Pfad ist zum Erstellen nicht sicher: »%s«" + +#: file_ops.c:286 #, c-format msgid "could not create symbolic link at \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: file_ops.c:280 +#: file_ops.c:296 +#, c-format +msgid "target symlink path is unsafe for removal: \"%s\"" +msgstr "Ziel-Symlink-Pfad ist zum Entfernen nicht sicher: »%s«" + +#: file_ops.c:303 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht löschen: %m" -#: file_ops.c:441 +#: file_ops.c:464 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" -#: file_ops.c:444 +#: file_ops.c:467 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang" -#: file_ops.c:466 +#: file_ops.c:489 #, c-format msgid "could not close directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht schließen: %m" -#: filemap.c:297 +#: filemap.c:298 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "Datendatei »%s« in der Quelle ist keine normale Datei" -#: filemap.c:302 filemap.c:335 +#: filemap.c:303 filemap.c:336 #, c-format msgid "duplicate source file \"%s\"" msgstr "doppelte Quelldatei »%s«" -#: filemap.c:390 +#: filemap.c:391 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "unerwartete Seitenänderung für nicht normale Datei »%s«" -#: filemap.c:743 filemap.c:845 +#: filemap.c:744 filemap.c:846 #, c-format msgid "unknown file type for \"%s\"" msgstr "unbekannter Dateityp für »%s«" -#: filemap.c:778 +#: filemap.c:779 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "Datei »%s« hat unterschiedlichen Typ in Quelle und Ziel" -#: filemap.c:850 +#: filemap.c:851 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "konnte nicht entscheiden, was mit Datei »%s« zu tun ist" @@ -927,147 +972,147 @@ msgstr "ungültiger Datensatz-Offset bei %X/%X: mindestens %u erwartet, %u erhal msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: xlogreader.c:670 xlogreader.c:1135 +#: xlogreader.c:670 xlogreader.c:1145 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "ungültige Datensatzlänge bei %X/%X: mindestens %u erwartet, %u erhalten" -#: xlogreader.c:759 +#: xlogreader.c:760 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: xlogreader.c:772 +#: xlogreader.c:773 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" -#: xlogreader.c:1143 +#: xlogreader.c:1153 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: xlogreader.c:1156 xlogreader.c:1172 +#: xlogreader.c:1166 xlogreader.c:1182 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" -#: xlogreader.c:1210 +#: xlogreader.c:1220 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X" -#: xlogreader.c:1244 +#: xlogreader.c:1254 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige magische Zahl %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1259 xlogreader.c:1301 +#: xlogreader.c:1269 xlogreader.c:1311 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige Info-Bits %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1275 +#: xlogreader.c:1285 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %, pg_control database system identifier is %" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %, Datenbanksystemidentifikator in pg_control ist %" -#: xlogreader.c:1283 +#: xlogreader.c:1293 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf" -#: xlogreader.c:1289 +#: xlogreader.c:1299 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf" -#: xlogreader.c:1321 +#: xlogreader.c:1331 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "unerwartete Pageaddr %X/%X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1347 +#: xlogreader.c:1357 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1759 +#: xlogreader.c:1771 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u außer der Reihe bei %X/%X" -#: xlogreader.c:1783 +#: xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" -#: xlogreader.c:1790 +#: xlogreader.c:1802 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" -#: xlogreader.c:1826 +#: xlogreader.c:1838 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1842 +#: xlogreader.c:1854 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" -#: xlogreader.c:1856 +#: xlogreader.c:1868 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1871 +#: xlogreader.c:1883 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" -#: xlogreader.c:1887 +#: xlogreader.c:1899 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" -#: xlogreader.c:1899 +#: xlogreader.c:1911 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: xlogreader.c:1966 +#: xlogreader.c:1978 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: xlogreader.c:1992 +#: xlogreader.c:2004 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden" -#: xlogreader.c:2076 +#: xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen" -#: xlogreader.c:2083 +#: xlogreader.c:2095 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d" -#: xlogreader.c:2110 xlogreader.c:2127 +#: xlogreader.c:2122 xlogreader.c:2139 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d" -#: xlogreader.c:2136 +#: xlogreader.c:2148 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d" -#: xlogreader.c:2144 +#: xlogreader.c:2156 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" diff --git a/src/bin/pg_rewind/po/ja.po b/src/bin/pg_rewind/po/ja.po index 80cdf4e73ba..6e5834eefda 100644 --- a/src/bin/pg_rewind/po/ja.po +++ b/src/bin/pg_rewind/po/ja.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL 18)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-03-31 09:53+0900\n" -"PO-Revision-Date: 2025-03-31 16:34+0900\n" +"POT-Creation-Date: 2026-05-12 14:55+0900\n" +"PO-Revision-Date: 2026-05-15 11:48+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -40,18 +40,18 @@ msgstr "詳細: " msgid "hint: " msgstr "ヒント: " -#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#: ../../common/controldata_utils.c:97 file_ops.c:349 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m" -#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:102 +#: ../../common/controldata_utils.c:110 file_ops.c:364 local_source.c:102 #: local_source.c:161 parsexlog.c:371 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み取りに失敗しました: %m" -#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:373 +#: ../../common/controldata_utils.c:119 file_ops.c:367 parsexlog.c:373 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" @@ -87,7 +87,7 @@ msgstr "" msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: ../../common/controldata_utils.c:249 file_ops.c:117 +#: ../../common/controldata_utils.c:249 file_ops.c:120 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" @@ -98,24 +98,34 @@ msgstr "ファイル\"%s\"を書き出せませんでした: %m" msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "メモリ不足です\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません(内部エラー)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "メモリ割り当て要求サイズ %zu * %zu が不正です\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "ファイル\"%s\"に対してファイルシステムを同期できませんでした: %m" #: ../../common/file_utils.c:123 ../../common/file_utils.c:588 -#: ../../fe_utils/archive.c:86 file_ops.c:417 +#: ../../fe_utils/archive.c:86 file_ops.c:353 file_ops.c:440 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" @@ -126,12 +136,12 @@ msgstr "ファイル\"%s\"のstatに失敗しました: %m" msgid "this build does not support sync method \"%s\"" msgstr "このビルドでは同期方式\"%s\"をサポートしていません" -#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 file_ops.c:388 +#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 file_ops.c:411 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 file_ops.c:462 +#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 file_ops.c:485 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" @@ -253,107 +263,142 @@ msgstr "シェルコマンドの引数に改行(LF)または復帰(CR)が含ま msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "データベース名に改行(LF)または復帰(CR)が含まれています: \"%s\"\n" -#: file_ops.c:67 +#: file_ops.c:52 +#, c-format +msgid "target file path is unsafe for open: \"%s\"" +msgstr "対象ファイルパスは安全でないため open できません: \"%s\"" + +#: file_ops.c:70 #, c-format msgid "could not open target file \"%s\": %m" msgstr "ターゲットファイル\"%s\"をオープンできませんでした: %m" -#: file_ops.c:81 +#: file_ops.c:84 #, c-format msgid "could not close target file \"%s\": %m" msgstr "ターゲットファイル\"%s\"をクローズできませんでした: %m" -#: file_ops.c:101 +#: file_ops.c:104 #, c-format msgid "could not seek in target file \"%s\": %m" msgstr "ターゲットファイル\"%s\"をシークできませんでした: %m" -#: file_ops.c:150 file_ops.c:177 +#: file_ops.c:153 file_ops.c:180 #, c-format msgid "undefined file type for \"%s\"" msgstr "\"%s\"に対する未定義のファイルタイプ" -#: file_ops.c:173 +#: file_ops.c:176 #, c-format msgid "invalid action (CREATE) for regular file" msgstr "通常のファイルに対する不正なアクション(CREATE)です" -#: file_ops.c:200 +#: file_ops.c:195 +#, c-format +msgid "target file path is unsafe for removal: \"%s\"" +msgstr "対象ファイルパスは安全でないため削除できません: \"%s\"" + +#: file_ops.c:206 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ファイル\"%s\"を削除できませんでした: %m" #: file_ops.c:218 #, c-format +msgid "target file path is unsafe for truncation: \"%s\"" +msgstr "対象ファイルパスは安全でないため切り詰めできません: \"%s\"" + +#: file_ops.c:227 +#, c-format msgid "could not open file \"%s\" for truncation: %m" msgstr "ファイル\"%s\"を切り詰めのためにオープンできませんでした: %m" -#: file_ops.c:222 +#: file_ops.c:231 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "ファイル\"%s\"を%uバイトに切り詰められませんでした: %m" -#: file_ops.c:238 +#: file_ops.c:243 +#, c-format +msgid "target directory path is unsafe for directory creation: \"%s\"" +msgstr "対象ディレクトリパスは安全でないため作成はできません: \"%s\"" + +#: file_ops.c:251 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" -#: file_ops.c:252 +#: file_ops.c:261 +#, c-format +msgid "target directory path is unsafe for directory removal: \"%s\"" +msgstr "対象ディレクトリパスは安全でないため削除はできません: \"%s\"" + +#: file_ops.c:269 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を削除できませんでした: %m" -#: file_ops.c:266 +#: file_ops.c:279 +#, c-format +msgid "target symlink path is unsafe for creation: \"%s\"" +msgstr "対象シンボリックリンクのパスは安全でないため作成はできません: \"%s\"" + +#: file_ops.c:286 #, c-format msgid "could not create symbolic link at \"%s\": %m" msgstr "\"%s\"にシンボリックリンクを作成できませんでした: %m" -#: file_ops.c:280 +#: file_ops.c:296 +#, c-format +msgid "target symlink path is unsafe for removal: \"%s\"" +msgstr "対象シンボリックリンクのパスは安全でないため削除はできません: \"%s\"" + +#: file_ops.c:303 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を削除できませんでした: %m" -#: file_ops.c:441 +#: file_ops.c:464 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: file_ops.c:444 +#: file_ops.c:467 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" -#: file_ops.c:466 +#: file_ops.c:489 #, c-format msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m" -#: filemap.c:297 +#: filemap.c:298 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "ソースのデータファイル\"%s\"は通常のファイルではありません" -#: filemap.c:302 filemap.c:335 +#: filemap.c:303 filemap.c:336 #, c-format msgid "duplicate source file \"%s\"" msgstr "ソースファイル\"%s\"が重複しています" -#: filemap.c:390 +#: filemap.c:391 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "非通常ファイル\"%s\"に対する想定外のページの書き換えです" -#: filemap.c:743 filemap.c:845 +#: filemap.c:744 filemap.c:846 #, c-format msgid "unknown file type for \"%s\"" msgstr "\"%s\"に対する未知のファイルタイプ" -#: filemap.c:778 +#: filemap.c:779 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "ファイル\"%s\"はソースとターゲットとで異なるタイプです" -#: filemap.c:850 +#: filemap.c:851 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "ファイル\"%s\"の処理を決定できませんでした" @@ -925,147 +970,147 @@ msgstr "%X/%Xのレコードオフセットが無効です:最低でも%uを期 msgid "contrecord is requested by %X/%X" msgstr "%X/%Xではcontrecordが必要です" -#: xlogreader.c:670 xlogreader.c:1135 +#: xlogreader.c:670 xlogreader.c:1145 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "%X/%Xのレコード長が無効です:最低でも%uを期待していましたが、実際は%uでした" -#: xlogreader.c:759 +#: xlogreader.c:760 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "%X/%Xで contrecord フラグがありません" -#: xlogreader.c:772 +#: xlogreader.c:773 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "%3$X/%4$Xの継続レコードの長さ%1$u(正しくは%2$lld)は不正です" -#: xlogreader.c:1143 +#: xlogreader.c:1153 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "%2$X/%3$XのリソースマネージャID %1$uが無効です" -#: xlogreader.c:1156 xlogreader.c:1172 +#: xlogreader.c:1166 xlogreader.c:1182 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "直前のリンク%1$X/%2$Xが不正なレコードが%3$X/%4$Xにあります" -#: xlogreader.c:1210 +#: xlogreader.c:1220 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "%X/%Xのレコード内のリソースマネージャデータのチェックサムが不正です" -#: xlogreader.c:1244 +#: xlogreader.c:1254 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%2$s、LSN %3$X/%4$X、オフセット%5$uで不正なマジックナンバー%1$04X" -#: xlogreader.c:1259 xlogreader.c:1301 +#: xlogreader.c:1269 xlogreader.c:1311 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント %2$s、LSN %3$X/%4$X、オフセット%5$uで不正な情報ビット列%1$04X" -#: xlogreader.c:1275 +#: xlogreader.c:1285 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %, pg_control database system identifier is %" msgstr "WALファイルは異なるデータベースシステム由来のものです: WALファイルのデータベースシステム識別子は %で、pg_control におけるデータベースシステム識別子は %です" -#: xlogreader.c:1283 +#: xlogreader.c:1293 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのセグメントサイズが正しくありません" -#: xlogreader.c:1289 +#: xlogreader.c:1299 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのXLOG_BLCKSZが正しくありません" -#: xlogreader.c:1321 +#: xlogreader.c:1331 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%3$s、LSN %4$X/%5$X、オフセット%6$uで想定外のページアドレス%1$X/%2$X" -#: xlogreader.c:1347 +#: xlogreader.c:1357 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%3$s、LSN %4$X/%5$X、オフセット%6$uで異常な順序のタイムラインID %1$u(%2$uの後)" -#: xlogreader.c:1759 +#: xlogreader.c:1769 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %uが%X/%Xで無効です" -#: xlogreader.c:1783 +#: xlogreader.c:1793 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません" -#: xlogreader.c:1790 +#: xlogreader.c:1800 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATAが設定されていませんが、%2$X/%3$Xのデータ長は%1$u" -#: xlogreader.c:1826 +#: xlogreader.c:1836 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEが設定されていますが、%4$X/%5$Xでホールオフセット%1$u、長さ%2$u、ブロックイメージ長%3$u" -#: xlogreader.c:1842 +#: xlogreader.c:1852 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEが設定されていませんが、%3$X/%4$Xにホールオフセット%1$u、長さ%2$u" -#: xlogreader.c:1856 +#: xlogreader.c:1866 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSEDが設定されていますが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" -#: xlogreader.c:1871 +#: xlogreader.c:1881 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEもBKPIMAGE_COMPRESSEDも設定されていませんが、%2$X/%3$Xにおいてブロックイメージ長が%1$uです" -#: xlogreader.c:1887 +#: xlogreader.c:1897 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません" -#: xlogreader.c:1899 +#: xlogreader.c:1909 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "%2$X/%3$Xにおけるblock_id %1$uが無効です" -#: xlogreader.c:1966 +#: xlogreader.c:1976 #, c-format msgid "record with invalid length at %X/%X" msgstr "%X/%Xのレコードのサイズが無効です" -#: xlogreader.c:1992 +#: xlogreader.c:2002 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "WALレコード中のID %dのバックアップブロックを特定できませんでした" -#: xlogreader.c:2076 +#: xlogreader.c:2086 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "%X/%Xで不正なブロック%dが指定されているためイメージが復元できませんでした" -#: xlogreader.c:2083 +#: xlogreader.c:2093 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "%X/%Xでブロック%dのイメージが不正な状態であるため復元できませんでした" -#: xlogreader.c:2110 xlogreader.c:2127 +#: xlogreader.c:2120 xlogreader.c:2137 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "%1$X/%2$Xで、ブロック%4$dがこのビルドでサポートされない圧縮方式%3$sで圧縮されているため復元できませんでした" -#: xlogreader.c:2136 +#: xlogreader.c:2146 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "%X/%Xでブロック%dのイメージが不明な方式で圧縮されているため復元できませんでした" -#: xlogreader.c:2144 +#: xlogreader.c:2154 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "%X/%Xのブロック%dが伸張できませんでした" diff --git a/src/bin/pg_rewind/po/ru.po b/src/bin/pg_rewind/po/ru.po index 3e0809832e9..f0ea63318b0 100644 --- a/src/bin/pg_rewind/po/ru.po +++ b/src/bin/pg_rewind/po/ru.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-21 05:19+0200\n" -"PO-Revision-Date: 2026-02-07 09:14+0200\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 21:23+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -37,18 +37,18 @@ msgstr "подробности: " msgid "hint: " msgstr "подсказка: " -#: ../../common/controldata_utils.c:97 file_ops.c:326 +#: ../../common/controldata_utils.c:97 file_ops.c:349 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не удалось открыть файл \"%s\" для чтения: %m" -#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:102 +#: ../../common/controldata_utils.c:110 file_ops.c:364 local_source.c:102 #: local_source.c:161 parsexlog.c:371 #, c-format msgid "could not read file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" -#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:373 +#: ../../common/controldata_utils.c:119 file_ops.c:367 parsexlog.c:373 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)" @@ -85,7 +85,7 @@ msgstr "" msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" -#: ../../common/controldata_utils.c:249 file_ops.c:117 +#: ../../common/controldata_utils.c:249 file_ops.c:120 #, c-format msgid "could not write file \"%s\": %m" msgstr "не удалось записать файл \"%s\": %m" @@ -96,24 +96,34 @@ msgstr "не удалось записать файл \"%s\": %m" msgid "could not fsync file \"%s\": %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/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" #: ../../common/file_utils.c:123 ../../common/file_utils.c:588 -#: ../../fe_utils/archive.c:86 file_ops.c:330 file_ops.c:417 +#: ../../fe_utils/archive.c:86 file_ops.c:353 file_ops.c:440 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалось получить информацию о файле \"%s\": %m" @@ -124,12 +134,12 @@ msgstr "не удалось получить информацию о файле msgid "this build does not support sync method \"%s\"" msgstr "эта сборка программы не поддерживает метод синхронизации \"%s\"" -#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 file_ops.c:388 +#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 file_ops.c:411 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалось открыть каталог \"%s\": %m" -#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 file_ops.c:462 +#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 file_ops.c:485 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не удалось прочитать каталог \"%s\": %m" @@ -254,77 +264,112 @@ msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "" "имя базы данных содержит символ новой строки или перевода каретки: \"%s\"\n" -#: file_ops.c:67 +#: file_ops.c:52 +#, c-format +msgid "target file path is unsafe for open: \"%s\"" +msgstr "целевой путь небезопасен для открытия файла: \"%s\"" + +#: file_ops.c:70 #, c-format msgid "could not open target file \"%s\": %m" msgstr "не удалось открыть целевой файл \"%s\": %m" -#: file_ops.c:81 +#: file_ops.c:84 #, c-format msgid "could not close target file \"%s\": %m" msgstr "не удалось закрыть целевой файл \"%s\": %m" -#: file_ops.c:101 +#: file_ops.c:104 #, c-format msgid "could not seek in target file \"%s\": %m" msgstr "не удалось переместиться в целевом файле \"%s\": %m" -#: file_ops.c:150 file_ops.c:177 +#: file_ops.c:153 file_ops.c:180 #, c-format msgid "undefined file type for \"%s\"" msgstr "неопределённый тип файла \"%s\"" -#: file_ops.c:173 +#: file_ops.c:176 #, c-format msgid "invalid action (CREATE) for regular file" msgstr "неверное действие (CREATE) для обычного файла" -#: file_ops.c:200 +#: file_ops.c:195 +#, c-format +msgid "target file path is unsafe for removal: \"%s\"" +msgstr "целевой путь небезопасен для удаления файла: \"%s\"" + +#: file_ops.c:206 #, c-format msgid "could not remove file \"%s\": %m" msgstr "не удалось стереть файл \"%s\": %m" #: file_ops.c:218 #, c-format +msgid "target file path is unsafe for truncation: \"%s\"" +msgstr "целевой путь небезопасен для усечения файла: \"%s\"" + +#: file_ops.c:227 +#, c-format msgid "could not open file \"%s\" for truncation: %m" msgstr "не удалось открыть файл \"%s\" для усечения: %m" -#: file_ops.c:222 +#: file_ops.c:231 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "не удалось обрезать файл \"%s\" до нужного размера (%u): %m" -#: file_ops.c:238 +#: file_ops.c:243 +#, c-format +msgid "target directory path is unsafe for directory creation: \"%s\"" +msgstr "целевой путь небезопасен для создания каталога: \"%s\"" + +#: file_ops.c:251 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не удалось создать каталог \"%s\": %m" -#: file_ops.c:252 +#: file_ops.c:261 +#, c-format +msgid "target directory path is unsafe for directory removal: \"%s\"" +msgstr "целевой путь небезопасен для удаления каталога: \"%s\"" + +#: file_ops.c:269 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ошибка при удалении каталога \"%s\": %m" -#: file_ops.c:266 +#: file_ops.c:279 +#, c-format +msgid "target symlink path is unsafe for creation: \"%s\"" +msgstr "целевой путь небезопасен для создания символической ссылки: \"%s\"" + +#: file_ops.c:286 #, c-format msgid "could not create symbolic link at \"%s\": %m" msgstr "не удалось создать символическую ссылку \"%s\": %m" -#: file_ops.c:280 +#: file_ops.c:296 +#, c-format +msgid "target symlink path is unsafe for removal: \"%s\"" +msgstr "целевой путь небезопасен для удаления символической ссылки: \"%s\"" + +#: file_ops.c:303 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "ошибка при удалении символической ссылки \"%s\": %m" -#: file_ops.c:441 +#: file_ops.c:464 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: file_ops.c:444 +#: file_ops.c:467 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "целевой путь символической ссылки \"%s\" слишком длинный" -#: file_ops.c:466 +#: file_ops.c:489 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не удалось закрыть каталог \"%s\": %m" @@ -1069,23 +1114,23 @@ msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте WAL " "%s, LSN %X/%X, смещение %u" -#: xlogreader.c:1769 +#: xlogreader.c:1771 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: xlogreader.c:1793 +#: xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: xlogreader.c:1800 +#: xlogreader.c:1802 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" -#: xlogreader.c:1836 +#: xlogreader.c:1838 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -1094,21 +1139,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: xlogreader.c:1852 +#: xlogreader.c:1854 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина " "%u в позиции %X/%X" -#: xlogreader.c:1866 +#: xlogreader.c:1868 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/" "%X" -#: xlogreader.c:1881 +#: xlogreader.c:1883 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -1117,41 +1162,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " "блока равна %u в позиции %X/%X" -#: xlogreader.c:1897 +#: xlogreader.c:1899 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: xlogreader.c:1909 +#: xlogreader.c:1911 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: xlogreader.c:1976 +#: xlogreader.c:1978 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: xlogreader.c:2002 +#: xlogreader.c:2004 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: xlogreader.c:2086 +#: xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: xlogreader.c:2093 +#: xlogreader.c:2095 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "" "не удалось восстановить образ в позиции %X/%X с неверным состоянием, блок %d" -#: xlogreader.c:2120 xlogreader.c:2137 +#: xlogreader.c:2122 xlogreader.c:2139 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -1160,7 +1205,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " "поддерживается этой сборкой, блок %d" -#: xlogreader.c:2146 +#: xlogreader.c:2148 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -1168,7 +1213,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " "блок %d" -#: xlogreader.c:2154 +#: xlogreader.c:2156 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалось развернуть образ в позиции %X/%X, блок %d" diff --git a/src/bin/pg_rewind/po/sv.po b/src/bin/pg_rewind/po/sv.po index ed614e4ef5d..ed4a6134b78 100644 --- a/src/bin/pg_rewind/po/sv.po +++ b/src/bin/pg_rewind/po/sv.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:23+0000\n" -"PO-Revision-Date: 2026-02-07 09:30+0100\n" +"POT-Creation-Date: 2026-08-09 17:55+0000\n" +"PO-Revision-Date: 2026-08-09 22:38+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -37,18 +37,18 @@ msgstr "detalj: " msgid "hint: " msgstr "tips: " -#: ../../common/controldata_utils.c:97 file_ops.c:326 +#: ../../common/controldata_utils.c:97 file_ops.c:349 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:102 +#: ../../common/controldata_utils.c:110 file_ops.c:364 local_source.c:102 #: local_source.c:161 parsexlog.c:371 #, c-format msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" -#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:373 +#: ../../common/controldata_utils.c:119 file_ops.c:367 parsexlog.c:373 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" @@ -84,7 +84,7 @@ msgstr "" msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: ../../common/controldata_utils.c:249 file_ops.c:117 +#: ../../common/controldata_utils.c:249 file_ops.c:120 #, c-format msgid "could not write file \"%s\": %m" msgstr "kunde inte skriva fil \"%s\": %m" @@ -95,24 +95,34 @@ msgstr "kunde inte skriva fil \"%s\": %m" msgid "could not fsync file \"%s\": %m" msgstr "kunde inte fsync:a fil \"%s\": %m" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "slut på minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ogiltig storlek %zu + %zu för minnesallokering\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ogiltig storlek %zu * %zu för minnesallokering\n" + #: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" #: ../../common/file_utils.c:123 ../../common/file_utils.c:588 -#: ../../fe_utils/archive.c:86 file_ops.c:417 +#: ../../fe_utils/archive.c:86 file_ops.c:353 file_ops.c:440 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() på fil \"%s\": %m" @@ -123,12 +133,12 @@ msgstr "kunde inte göra stat() på fil \"%s\": %m" msgid "this build does not support sync method \"%s\"" msgstr "detta bygge stöder inte synkmetod \"%s\"" -#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 file_ops.c:388 +#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 file_ops.c:411 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 file_ops.c:462 +#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 file_ops.c:485 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" @@ -250,82 +260,112 @@ msgstr "shell-kommandots argument innehåller nyrad eller vagnretur: \"%s\"\n" msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "databasnamnet innehåller nyrad eller vagnretur: \"%s\"\n" -#: file_ops.c:67 +#: file_ops.c:52 +#, c-format +msgid "target file path is unsafe for open: \"%s\"" +msgstr "sökvägen till fil är inte säker att öppna: \"%s\"" + +#: file_ops.c:70 #, c-format msgid "could not open target file \"%s\": %m" msgstr "kunde inte öppna målfil \"%s\": %m" -#: file_ops.c:81 +#: file_ops.c:84 #, c-format msgid "could not close target file \"%s\": %m" msgstr "kunde inte stänga målfil \"%s\": %m" -#: file_ops.c:101 +#: file_ops.c:104 #, c-format msgid "could not seek in target file \"%s\": %m" msgstr "kunde inte söka i målfil \"%s\": %m" -#: file_ops.c:150 file_ops.c:177 +#: file_ops.c:153 file_ops.c:180 #, c-format msgid "undefined file type for \"%s\"" msgstr "odefinierad filtyp på \"%s\"" -#: file_ops.c:173 +#: file_ops.c:176 #, c-format msgid "invalid action (CREATE) for regular file" msgstr "ogiltig aktion (CREATE) för vanlig fil" -#: file_ops.c:200 +#: file_ops.c:195 +#, c-format +msgid "target file path is unsafe for removal: \"%s\"" +msgstr "sökvägen till fil är inte säker för borttagning: \"%s\"" + +#: file_ops.c:206 #, c-format msgid "could not remove file \"%s\": %m" msgstr "kunde inte ta bort fil \"%s\": %m" #: file_ops.c:218 #, c-format +msgid "target file path is unsafe for truncation: \"%s\"" +msgstr "sökvägen till fil är inte säker för trunkering: \"%s\"" + +#: file_ops.c:227 +#, c-format msgid "could not open file \"%s\" for truncation: %m" msgstr "kunde inte öppna fil \"%s\" för trunkering: %m" -#: file_ops.c:222 +#: file_ops.c:231 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "kunde inte trunkera fil \"%s\" till %u: %m" -#: file_ops.c:238 +#: file_ops.c:243 +#, c-format +msgid "target directory path is unsafe for directory creation: \"%s\"" +msgstr "sökvägen till katalog är inte säker att skapa: \"%s\"" + +#: file_ops.c:251 #, c-format msgid "could not create directory \"%s\": %m" msgstr "kunde inte skapa katalog \"%s\": %m" -#: file_ops.c:252 +#: file_ops.c:261 +#, c-format +msgid "target directory path is unsafe for directory removal: \"%s\"" +msgstr "sökvägen till katalog är inte säker att ta bort: \"%s\"" + +#: file_ops.c:269 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "kunde inte ta bort katalog \"%s\": %m" -#: file_ops.c:266 +#: file_ops.c:279 +#, c-format +msgid "target symlink path is unsafe for creation: \"%s\"" +msgstr "sökvägen till symlänk är inte säker att skapa: \"%s\"" + +#: file_ops.c:286 #, c-format msgid "could not create symbolic link at \"%s\": %m" msgstr "kunde inte skapa en symnbolisk länk vid \"%s\": %m" -#: file_ops.c:280 +#: file_ops.c:296 #, c-format -msgid "could not remove symbolic link \"%s\": %m" -msgstr "kan inte ta bort symbolisk länk \"%s\": %m" +msgid "target symlink path is unsafe for removal: \"%s\"" +msgstr "sökvägen till symlänk är inte säker att ta bort: \"%s\"" -#: file_ops.c:330 +#: file_ops.c:303 #, c-format -msgid "could not stat file \"%s\" for reading: %m" -msgstr "kunde inte göra stat() på filen \"%s\" för läsning: %m" +msgid "could not remove symbolic link \"%s\": %m" +msgstr "kan inte ta bort symbolisk länk \"%s\": %m" -#: file_ops.c:441 +#: file_ops.c:464 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: file_ops.c:444 +#: file_ops.c:467 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "mål för symbolisk länk \"%s\" är för lång" -#: file_ops.c:466 +#: file_ops.c:489 #, c-format msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" @@ -993,82 +1033,82 @@ msgstr "oväntad sidadress %X/%X i WAL-segment %s, LSN %X/%X, offset %u" msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "ej-i-sekvens för tidslinje-ID %u (efter %u) i WAL-segment %s, LSN %X/%X, offset %u" -#: xlogreader.c:1769 +#: xlogreader.c:1771 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "ej-i-sekvens block_id %u vid %X/%X" -#: xlogreader.c:1793 +#: xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA är satt men ingen data inkluderad vid %X/%X" -#: xlogreader.c:1800 +#: xlogreader.c:1802 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA är ej satt men datalängden är %u vid %X/%X" -#: xlogreader.c:1836 +#: xlogreader.c:1838 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE är satt men håloffset %u längd %u blockavbildlängd %u vid %X/%X" -#: xlogreader.c:1852 +#: xlogreader.c:1854 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE är inte satt men håloffset %u längd %u vid %X/%X" -#: xlogreader.c:1866 +#: xlogreader.c:1868 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED är satt men blockavbildlängd %u vid %X/%X" -#: xlogreader.c:1881 +#: xlogreader.c:1883 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men blockavbildlängd är %u vid %X/%X" -#: xlogreader.c:1897 +#: xlogreader.c:1899 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL är satt men ingen tidigare rel vid %X/%X" -#: xlogreader.c:1909 +#: xlogreader.c:1911 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ogiltig block_id %u vid %X/%X" -#: xlogreader.c:1976 +#: xlogreader.c:1978 #, c-format msgid "record with invalid length at %X/%X" msgstr "post med ogiltig längd vid %X/%X" -#: xlogreader.c:2002 +#: xlogreader.c:2004 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "kunde inte hitta backup-block med ID %d i WAL-post" -#: xlogreader.c:2086 +#: xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt block %d angivet" -#: xlogreader.c:2093 +#: xlogreader.c:2095 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt state, block %d" -#: xlogreader.c:2120 xlogreader.c:2137 +#: xlogreader.c:2122 xlogreader.c:2139 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med %s stöds inte av bygget, block %d" -#: xlogreader.c:2146 +#: xlogreader.c:2148 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med okänd metod, block %d" -#: xlogreader.c:2154 +#: xlogreader.c:2156 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "kunde inte packa upp avbild vid %X/%X, block %d" diff --git a/src/bin/pg_test_fsync/po/de.po b/src/bin/pg_test_fsync/po/de.po index c3635a75886..eb67b40aefa 100644 --- a/src/bin/pg_test_fsync/po/de.po +++ b/src/bin/pg_test_fsync/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-06-16 07:54+0000\n" +"POT-Creation-Date: 2026-08-08 06:24+0000\n" "PO-Revision-Date: 2024-05-26 22:03+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -16,119 +16,129 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:276 +#: ../../../src/common/logging.c:279 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:283 +#: ../../../src/common/logging.c:286 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../../src/common/logging.c:294 +#: ../../../src/common/logging.c:297 #, c-format msgid "detail: " msgstr "Detail: " -#: ../../../src/common/logging.c:301 +#: ../../../src/common/logging.c:304 #, c-format msgid "hint: " msgstr "Tipp: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:38 +#: pg_test_fsync.c:37 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr " %13.3f Op./s %6.0f µs/Op.\n" -#: pg_test_fsync.c:56 +#: pg_test_fsync.c:55 #, c-format msgid "could not create thread for alarm" msgstr "konnte Thread für Alarm nicht erzeugen" -#: pg_test_fsync.c:101 +#: pg_test_fsync.c:100 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: pg_test_fsync.c:165 +#: pg_test_fsync.c:163 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "Aufruf: %s [-f DATEINAME] [-s SEK-PRO-TEST]\n" -#: pg_test_fsync.c:191 +#: pg_test_fsync.c:189 #, c-format msgid "invalid argument for option %s" msgstr "ungültiges Argument für Option %s" -#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 +#: pg_test_fsync.c:190 pg_test_fsync.c:202 pg_test_fsync.c:211 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_test_fsync.c:198 +#: pg_test_fsync.c:196 #, c-format msgid "%s must be in range %u..%u" msgstr "%s muss im Bereich %u..%u sein" -#: pg_test_fsync.c:211 +#: pg_test_fsync.c:209 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_test_fsync.c:217 +#: pg_test_fsync.c:215 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" msgstr[0] "%u Sekunde pro Test\n" msgstr[1] "%u Sekunden pro Test\n" -#: pg_test_fsync.c:222 +#: pg_test_fsync.c:220 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "O_DIRECT wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n" -#: pg_test_fsync.c:224 +#: pg_test_fsync.c:222 #, c-format msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" msgstr "F_NOCACHE wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n" -#: pg_test_fsync.c:226 +#: pg_test_fsync.c:224 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "Direct-I/O wird auf dieser Plattform nicht unterstützt.\n" -#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 -#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 -#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 +#: pg_test_fsync.c:249 pg_test_fsync.c:339 pg_test_fsync.c:361 +#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 +#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 msgid "could not open output file" msgstr "konnte Ausgabedatei nicht öffnen" -#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 -#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 -#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 -#: pg_test_fsync.c:592 +#: pg_test_fsync.c:253 pg_test_fsync.c:323 pg_test_fsync.c:348 +#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 +#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 +#: pg_test_fsync.c:590 msgid "write failed" msgstr "Schreiben fehlgeschlagen" -#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 -#: pg_test_fsync.c:535 pg_test_fsync.c:567 +#: pg_test_fsync.c:257 pg_test_fsync.c:372 pg_test_fsync.c:396 +#: pg_test_fsync.c:533 pg_test_fsync.c:565 msgid "fsync failed" msgstr "fsync fehlgeschlagen" -#: pg_test_fsync.c:298 +#: pg_test_fsync.c:296 #, c-format msgid "" "\n" @@ -137,7 +147,7 @@ msgstr "" "\n" "Vergleich von Datei-Sync-Methoden bei einem Schreibvorgang aus %dkB:\n" -#: pg_test_fsync.c:300 +#: pg_test_fsync.c:298 #, c-format msgid "" "\n" @@ -146,21 +156,21 @@ msgstr "" "\n" "Vergleich von Datei-Sync-Methoden bei zwei Schreibvorgängen aus je %dkB:\n" -#: pg_test_fsync.c:301 +#: pg_test_fsync.c:299 #, c-format msgid "(in \"wal_sync_method\" preference order, except fdatasync is Linux's default)\n" msgstr "(in Rangordnung von »wal_sync_method«, außer dass fdatasync auf Linux Standard ist)\n" -#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 +#: pg_test_fsync.c:310 pg_test_fsync.c:413 pg_test_fsync.c:480 msgid "n/a*" msgstr "entf.*" -#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 -#: pg_test_fsync.c:500 +#: pg_test_fsync.c:329 pg_test_fsync.c:401 pg_test_fsync.c:439 +#: pg_test_fsync.c:498 msgid "n/a" msgstr "entf." -#: pg_test_fsync.c:446 +#: pg_test_fsync.c:444 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -169,7 +179,7 @@ msgstr "" "* Dieses Dateisystem und die Mount-Optionen unterstützen kein Direct-I/O,\n" " z.B. ext4 im Journaled-Modus.\n" -#: pg_test_fsync.c:454 +#: pg_test_fsync.c:452 #, c-format msgid "" "\n" @@ -178,7 +188,7 @@ msgstr "" "\n" "Vergleich von open_sync mit verschiedenen Schreibgrößen:\n" -#: pg_test_fsync.c:455 +#: pg_test_fsync.c:453 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -187,27 +197,27 @@ msgstr "" "(Damit werden die Kosten für das Schreiben von 16kB in verschieden Größen mit\n" "open_sync verglichen.)\n" -#: pg_test_fsync.c:458 +#: pg_test_fsync.c:456 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16kB open_sync schreiben" -#: pg_test_fsync.c:459 +#: pg_test_fsync.c:457 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8kB open_sync schreiben" -#: pg_test_fsync.c:460 +#: pg_test_fsync.c:458 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4kB open_sync schreiben" -#: pg_test_fsync.c:461 +#: pg_test_fsync.c:459 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2kB open_sync schreiben" -#: pg_test_fsync.c:462 +#: pg_test_fsync.c:460 msgid "16 * 1kB open_sync writes" msgstr "16 * 1kB open_sync schreiben" -#: pg_test_fsync.c:516 +#: pg_test_fsync.c:514 #, c-format msgid "" "\n" @@ -216,7 +226,7 @@ msgstr "" "\n" "Probe ob fsync auf einem anderen Dateideskriptor funktioniert:\n" -#: pg_test_fsync.c:517 +#: pg_test_fsync.c:515 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -225,7 +235,7 @@ msgstr "" "(Wenn die Zeiten ähnlich sind, dann kann fsync() auf einem anderen Deskriptor\n" "geschriebene Daten syncen.)\n" -#: pg_test_fsync.c:582 +#: pg_test_fsync.c:580 #, c-format msgid "" "\n" diff --git a/src/bin/pg_test_fsync/po/ru.po b/src/bin/pg_test_fsync/po/ru.po index 2ed3322d0e6..b1881565122 100644 --- a/src/bin/pg_test_fsync/po/ru.po +++ b/src/bin/pg_test_fsync/po/ru.po @@ -1,13 +1,13 @@ # Russian message translation file for pg_test_fsync # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017, 2021, 2022, 2024. +# SPDX-FileCopyrightText: 2017, 2021, 2022, 2024, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_test_fsync (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2024-09-04 18:11+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:50+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -37,17 +37,27 @@ msgstr "подробности: " msgid "hint: " msgstr "подсказка: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #. translator: maintain alignment with NA_FORMAT #: pg_test_fsync.c:37 #, c-format @@ -101,7 +111,7 @@ msgstr[2] "на тест отводится %u сек.\n" #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "" -"O_DIRECT на этой платформе не поддерживается для open_datasync и open_sync.\n" +"O_DIRECT на этой платформе поддерживается для open_datasync и open_sync.\n" #: pg_test_fsync.c:222 #, c-format diff --git a/src/bin/pg_test_timing/po/de.po b/src/bin/pg_test_timing/po/de.po index a2dc1da6317..e5813205c8f 100644 --- a/src/bin/pg_test_timing/po/de.po +++ b/src/bin/pg_test_timing/po/de.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-05 12:12+0000\n" +"POT-Creation-Date: 2026-08-08 06:21+0000\n" "PO-Revision-Date: 2026-05-06 15:50+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -18,17 +18,27 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" diff --git a/src/bin/pg_test_timing/po/ja.po b/src/bin/pg_test_timing/po/ja.po index b20da6b9d4d..1d177aa3695 100644 --- a/src/bin/pg_test_timing/po/ja.po +++ b/src/bin/pg_test_timing/po/ja.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-14 10:48+0900\n" -"PO-Revision-Date: 2022-05-10 15:27+0900\n" -"Last-Translator: Michihide Hotta \n" +"POT-Creation-Date: 2026-05-12 14:56+0900\n" +"PO-Revision-Date: 2026-05-15 11:52+0900\n" +"Last-Translator: Kyotaro Horiguchi \n" "Language-Team: \n" "Language: ja\n" "MIME-Version: 1.0\n" @@ -18,6 +18,27 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 +#, c-format +msgid "out of memory\n" +msgstr "メモリ不足です\n" + +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "nullポインタは複製できません(内部エラー)\n" + +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "メモリ割り当て要求サイズ %zu * %zu が不正です\n" + #: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" @@ -56,8 +77,8 @@ msgstr "クロックの時刻が逆行していることを検出しました。 #: pg_test_timing.c:152 #, c-format -msgid "Time warp: %d ms\n" -msgstr "逆行した時間: %d ms\n" +msgid "Time warp: %d us\n" +msgstr "逆行した時間: %d us\n" #: pg_test_timing.c:175 #, c-format diff --git a/src/bin/pg_test_timing/po/ru.po b/src/bin/pg_test_timing/po/ru.po index 6fdaef839ba..c088febd59f 100644 --- a/src/bin/pg_test_timing/po/ru.po +++ b/src/bin/pg_test_timing/po/ru.po @@ -1,13 +1,13 @@ # Russian message translation file for pg_test_timing # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017, 2021, 2024. +# SPDX-FileCopyrightText: 2017, 2021, 2024, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-09-02 09:29+0300\n" -"PO-Revision-Date: 2024-09-04 19:59+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:50+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -17,17 +17,27 @@ 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" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" @@ -68,8 +78,8 @@ msgstr "Обнаружен обратный ход часов.\n" #: pg_test_timing.c:152 #, c-format -msgid "Time warp: %d ms\n" -msgstr "Сдвиг времени: %d мс\n" +msgid "Time warp: %d us\n" +msgstr "Сдвиг времени: %d мкс\n" #: pg_test_timing.c:175 #, c-format diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index 7fd4b3886da..0c150ad4467 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -2058,6 +2058,7 @@ check_new_cluster_logical_replication_slots(void) int nslots_on_old; int nslots_on_new; int max_replication_slots; + char *output_plugin_libraries; char *wal_level; /* Logical slots can be migrated since PG17. */ @@ -2091,10 +2092,10 @@ check_new_cluster_logical_replication_slots(void) PQclear(res); res = executeQueryOrDie(conn, "SELECT setting FROM pg_settings " - "WHERE name IN ('wal_level', 'max_replication_slots') " + "WHERE name IN ('wal_level', 'output_plugin_libraries', 'max_replication_slots') " "ORDER BY name DESC;"); - if (PQntuples(res) != 2) + if (PQntuples(res) != 3) pg_fatal("could not determine parameter settings on new cluster"); wal_level = PQgetvalue(res, 0, 0); @@ -2103,7 +2104,85 @@ check_new_cluster_logical_replication_slots(void) pg_fatal("\"wal_level\" must be \"logical\" but is set to \"%s\"", wal_level); - max_replication_slots = atoi(PQgetvalue(res, 1, 0)); + output_plugin_libraries = PQgetvalue(res, 1, 0); + + /* + * Make sure the output_plugin_libraries setting covers all plugins needed + * by any migrated slots. + */ + if (nslots_on_old > 0) + { + char *guc_copy = pg_strdup(output_plugin_libraries); + char **allowed_plugins; + char output_path[MAXPGPATH]; + FILE *script = NULL; + + if (!SplitGUCList(guc_copy, ',', &allowed_plugins)) + { + /* + * Should not happen. (Frontend and backend GUC_LIST_QUOTE parsing + * have to remain compatible for pg_dump at minimum.) + */ + pg_fatal("could not parse \"output_plugin_libraries\" setting '%s'", + output_plugin_libraries); + } + + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, + "disallowed_output_plugins.txt"); + + for (int dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) + { + LogicalSlotInfoArr *slot_arr = &old_cluster.dbarr.dbs[dbnum].slot_arr; + + for (int slotnum = 0; slotnum < slot_arr->nslots; slotnum++) + { + LogicalSlotInfo *slot = &slot_arr->slots[slotnum]; + bool allowed = false; + + /* + * We expect the output_plugin_libraries length to be small in + * practice; O(n*m) shouldn't be a problem here. + */ + for (char **p = allowed_plugins; *p; p++) + { + if (strcmp(slot->plugin, *p) == 0) + { + allowed = true; + break; + } + } + + if (!allowed) + { + if (script == NULL && + (script = fopen_priv(output_path, "w")) == NULL) + pg_fatal("could not open file \"%s\": %m", output_path); + + fprintf(script, "The slot \"%s\" uses plugin \"%s\"\n", + slot->slotname, slot->plugin); + } + } + } + + if (script) + { + fclose(script); + + pg_log(PG_REPORT, "fatal"); + pg_fatal("Your installation contains logical replication slots with plugins\n" + "that are not allowed by the new cluster's output_plugin_libraries\n" + "setting. You can add trusted plugins to output_plugin_libraries\n" + "and/or remove affected slots, and then restart the upgrade.\n" + "A list of the problematic slots is in the file:\n" + " %s", output_path); + } + + pg_free(allowed_plugins); + pg_free(guc_copy); + } + + max_replication_slots = atoi(PQgetvalue(res, 2, 0)); if (nslots_on_old > max_replication_slots) pg_fatal("\"max_replication_slots\" (%d) must be greater than or equal to the number of " diff --git a/src/bin/pg_upgrade/po/de.po b/src/bin/pg_upgrade/po/de.po index 3369224f211..839047819d8 100644 --- a/src/bin/pg_upgrade/po/de.po +++ b/src/bin/pg_upgrade/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL) 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-07 14:20+0000\n" +"POT-Creation-Date: 2026-08-08 06:20+0000\n" "PO-Revision-Date: 2025-08-08 00:01+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -15,17 +15,27 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" @@ -240,8 +250,8 @@ msgstr "Eine Liste der Problemspalten ist in der Datei:" #: check.c:431 check.c:1038 check.c:1189 check.c:1272 check.c:1361 check.c:1452 #: check.c:1584 check.c:1656 check.c:1757 check.c:1804 check.c:1884 -#: check.c:2189 check.c:2208 check.c:2254 check.c:2307 file.c:378 file.c:415 -#: function.c:208 option.c:519 version.c:79 version.c:162 +#: check.c:2194 check.c:2213 check.c:2259 check.c:2312 file.c:378 file.c:415 +#: function.c:208 option.c:519 version.c:97 version.c:180 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" @@ -450,7 +460,7 @@ msgid "template0 must not allow connections, i.e. its pg_database.datallowconn m msgstr "template0 darf keine Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss falsch sein" #: check.c:1203 check.c:1324 check.c:1420 check.c:1548 check.c:1624 -#: check.c:1710 check.c:1770 check.c:1853 check.c:2221 check.c:2363 +#: check.c:1710 check.c:1770 check.c:1853 check.c:2226 check.c:2368 #: function.c:229 #, c-format msgid "fatal" @@ -656,12 +666,12 @@ msgstr "" msgid "Checking for objects affected by Unicode update" msgstr "Prüfe auf vom Unicode-Update betroffene Objekte" -#: check.c:2033 version.c:121 +#: check.c:2038 version.c:139 #, c-format msgid "warning" msgstr "Warnung" -#: check.c:2034 +#: check.c:2039 #, c-format msgid "" "Your installation contains relations that might be affected by a new version of Unicode.\n" @@ -673,52 +683,52 @@ msgstr "" "betroffenen Relationen ist in der Datei:\n" " %s" -#: check.c:2070 +#: check.c:2075 #, c-format msgid "Checking for new cluster logical replication slots" msgstr "Prüfe logische Replikations-Slots des neuen Clusters" -#: check.c:2078 +#: check.c:2083 #, c-format msgid "could not count the number of logical replication slots" msgstr "konnte Anzahl der logischen Replikations-Slots nicht zählen" -#: check.c:2083 +#: check.c:2088 #, c-format msgid "expected 0 logical replication slots but found %d" msgstr "0 logische Replikations-Slots erwartet aber %d gefunden" -#: check.c:2093 check.c:2144 +#: check.c:2098 check.c:2149 #, c-format msgid "could not determine parameter settings on new cluster" msgstr "konnte Parametereinstellung im neuen Cluster nicht ermitteln" -#: check.c:2098 +#: check.c:2103 #, c-format msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" msgstr "»wal_level« muss »logical« sein, aber es ist auf »%s« gesetzt" -#: check.c:2104 +#: check.c:2109 #, c-format msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of logical replication slots (%d) on the old cluster" msgstr "»max_replication_slots« (%d) muss größer als oder gleich der Anzahl der logischen Replikations-Slots (%d) im alten Cluster sein" -#: check.c:2136 +#: check.c:2141 #, c-format msgid "Checking for new cluster configuration for subscriptions" msgstr "Prüfe Konfiguration für Subskriptionen im neuen Cluster" -#: check.c:2148 +#: check.c:2153 #, c-format msgid "\"max_active_replication_origins\" (%d) must be greater than or equal to the number of subscriptions (%d) on the old cluster" msgstr "»max_active_replication_origins« (%d) muss größer als oder gleich der Anzahl der Subskriptionen (%d) im alten Cluster sein" -#: check.c:2170 +#: check.c:2175 #, c-format msgid "Checking for valid logical replication slots" msgstr "Prüfe auf gültige logische Replikations-Slots" -#: check.c:2222 +#: check.c:2227 #, c-format msgid "" "Your installation contains logical replication slots that cannot be upgraded.\n" @@ -734,12 +744,12 @@ msgstr "" "Eine Liste der problematischen Slots ist in der Datei:\n" " %s" -#: check.c:2282 +#: check.c:2287 #, c-format msgid "Checking for subscription state" msgstr "Prüfe Subskriptionszustand" -#: check.c:2364 +#: check.c:2369 #, c-format msgid "" "Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" @@ -799,7 +809,7 @@ msgstr "Im alten Cluster fehlen Cluster-Zustandsinformationen:" msgid "The target cluster lacks cluster state information:" msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:" -#: controldata.c:217 dump.c:50 exec.c:118 pg_upgrade.c:606 pg_upgrade.c:646 +#: controldata.c:217 dump.c:54 exec.c:118 pg_upgrade.c:606 pg_upgrade.c:646 #: pg_upgrade.c:995 relfilenumber.c:610 server.c:34 util.c:337 #, c-format msgid "%s" @@ -1053,7 +1063,7 @@ msgstr "nicht erkannter Transfermodus" msgid "Creating dump of global objects" msgstr "Erzeuge Dump der globalen Objekte" -#: dump.c:32 +#: dump.c:33 #, c-format msgid "Creating dump of database schemas" msgstr "Erzeuge Dump der Datenbankschemas" @@ -1740,7 +1750,7 @@ msgstr "konnte Arbeitsprozess nicht erzeugen: %m" msgid "could not create worker thread: %m" msgstr "konnte Arbeits-Thread nicht erzeugen: %m" -#: parallel.c:294 task.c:404 +#: parallel.c:294 task.c:406 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" @@ -2012,17 +2022,17 @@ msgstr "verknüpfe »%s« nach »%s«" msgid "should never happen" msgstr "sollte nie vorkommen" -#: server.c:39 server.c:143 util.c:248 util.c:278 +#: server.c:39 server.c:145 util.c:248 util.c:278 #, c-format msgid "Failure, exiting\n" msgstr "Fehlgeschlagen, Programm wird beendet\n" -#: server.c:133 +#: server.c:135 #, c-format msgid "executing: %s" msgstr "führe aus: %s" -#: server.c:139 +#: server.c:141 #, c-format msgid "" "SQL command failed\n" @@ -2033,17 +2043,17 @@ msgstr "" "%s\n" "%s" -#: server.c:169 +#: server.c:171 #, c-format msgid "could not open version file \"%s\": %m" msgstr "konnte Versionsdatei »%s« nicht öffnen: %m" -#: server.c:173 +#: server.c:175 #, c-format msgid "could not parse version file \"%s\"" msgstr "konnte Versionsdatei »%s« nicht interpretieren" -#: server.c:299 +#: server.c:301 #, c-format msgid "" "\n" @@ -2052,7 +2062,7 @@ msgstr "" "\n" "%s" -#: server.c:303 +#: server.c:305 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -2061,7 +2071,7 @@ msgstr "" "konnte nicht mit dem Postmaster für den alten Cluster verbinden, gestartet mit dem Befehl:\n" "%s" -#: server.c:307 +#: server.c:309 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -2070,22 +2080,22 @@ msgstr "" "konnte nicht mit dem Postmaster für den neuen Cluster verbinden, gestartet mit dem Befehl:\n" "%s" -#: server.c:321 +#: server.c:323 #, c-format msgid "pg_ctl failed to start the source server, or connection failed" msgstr "pg_ctl konnte den Quellserver nicht starten, oder Verbindung fehlgeschlagen" -#: server.c:323 +#: server.c:325 #, c-format msgid "pg_ctl failed to start the target server, or connection failed" msgstr "pg_ctl konnte den Zielserver nicht starten, oder Verbindung fehlgeschlagen" -#: server.c:368 task.c:195 +#: server.c:370 task.c:197 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: server.c:381 +#: server.c:383 #, c-format msgid "libpq environment variable %s has a non-local server value: %s" msgstr "libpq-Umgebungsvariable %s hat einen nicht lokalen Serverwert: %s" @@ -2114,12 +2124,12 @@ msgstr "konnte »stat« für Tablespace-Verzeichnis »%s« nicht ausführen: %m" msgid "tablespace path \"%s\" is not a directory" msgstr "Tablespace-Pfad »%s« ist kein Verzeichnis" -#: task.c:216 task.c:267 task.c:282 task.c:293 +#: task.c:218 task.c:269 task.c:284 task.c:295 #, c-format msgid "connection failure: %s" msgstr "Verbindungsfehler: %s" -#: task.c:395 +#: task.c:397 #, c-format msgid "invalid socket" msgstr "ungültiges Socket" @@ -2139,12 +2149,12 @@ msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" msgid "ok" msgstr "ok" -#: version.c:44 +#: version.c:62 #, c-format msgid "Checking for hash indexes" msgstr "Prüfe auf Hash-Indexe" -#: version.c:123 +#: version.c:141 #, c-format msgid "" "\n" @@ -2159,7 +2169,7 @@ msgstr "" "daher mit dem Befehl REINDEX reindiziert werden. Nach dem Upgrade\n" "werden Sie Anweisungen zum REINDEX erhalten." -#: version.c:129 +#: version.c:147 #, c-format msgid "" "\n" @@ -2179,17 +2189,17 @@ msgstr "" "ungültigen Indexe neu zu erzeugen. Bis dahin werden diese Indexe nicht\n" "verwendet werden." -#: version.c:187 +#: version.c:205 #, c-format msgid "Checking for extension updates" msgstr "Prüfe auf Aktualisierungen von Erweiterungen" -#: version.c:201 +#: version.c:219 #, c-format msgid "notice" msgstr "Hinweis" -#: version.c:202 +#: version.c:220 #, c-format msgid "" "\n" diff --git a/src/bin/pg_upgrade/po/ru.po b/src/bin/pg_upgrade/po/ru.po index 178a13f7a78..7fcf1c59260 100644 --- a/src/bin/pg_upgrade/po/ru.po +++ b/src/bin/pg_upgrade/po/ru.po @@ -1,14 +1,14 @@ # Russian message translation file for pg_upgrade # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Alexander Lakhin +# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026 Alexander Lakhin # Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2025-09-13 22:22+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:50+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -18,17 +18,27 @@ 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" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" @@ -262,7 +272,7 @@ msgstr "Список проблемных столбцов приведён в #: check.c:431 check.c:1038 check.c:1189 check.c:1272 check.c:1361 check.c:1452 #: check.c:1584 check.c:1656 check.c:1757 check.c:1804 check.c:1884 #: check.c:2194 check.c:2213 check.c:2259 check.c:2312 file.c:378 file.c:415 -#: function.c:208 option.c:519 version.c:79 version.c:162 +#: function.c:208 option.c:519 version.c:97 version.c:180 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалось открыть файл \"%s\": %m" @@ -706,7 +716,7 @@ msgstr "" msgid "Checking for objects affected by Unicode update" msgstr "Проверка объектов, затрагиваемых обновлением Unicode" -#: check.c:2038 version.c:121 +#: check.c:2038 version.c:139 #, c-format msgid "warning" msgstr "предупреждение" @@ -876,7 +886,7 @@ msgstr "В исходном кластере не хватает информа msgid "The target cluster lacks cluster state information:" msgstr "В целевом кластере не хватает информации о состоянии кластера:" -#: controldata.c:217 dump.c:50 exec.c:118 pg_upgrade.c:606 pg_upgrade.c:646 +#: controldata.c:217 dump.c:54 exec.c:118 pg_upgrade.c:606 pg_upgrade.c:646 #: pg_upgrade.c:995 relfilenumber.c:610 server.c:34 util.c:337 #, c-format msgid "%s" @@ -1167,7 +1177,7 @@ msgstr "нераспознанный режим передачи данных" msgid "Creating dump of global objects" msgstr "Формирование выгрузки глобальных объектов" -#: dump.c:32 +#: dump.c:33 #, c-format msgid "Creating dump of database schemas" msgstr "Формирование выгрузки схем базы данных" @@ -1955,7 +1965,7 @@ msgstr "не удалось создать рабочий процесс: %m" msgid "could not create worker thread: %m" msgstr "не удалось создать рабочий поток: %m" -#: parallel.c:294 task.c:404 +#: parallel.c:294 task.c:406 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" @@ -2234,17 +2244,17 @@ msgstr "создание ссылки на \"%s\" в \"%s\"" msgid "should never happen" msgstr "невозможный случай" -#: server.c:39 server.c:143 util.c:248 util.c:278 +#: server.c:39 server.c:145 util.c:248 util.c:278 #, c-format msgid "Failure, exiting\n" msgstr "Ошибка, выполняется выход\n" -#: server.c:133 +#: server.c:135 #, c-format msgid "executing: %s" msgstr "выполняется: %s" -#: server.c:139 +#: server.c:141 #, c-format msgid "" "SQL command failed\n" @@ -2255,17 +2265,17 @@ msgstr "" "%s\n" "%s" -#: server.c:169 +#: server.c:171 #, c-format msgid "could not open version file \"%s\": %m" msgstr "не удалось открыть файл с версией \"%s\": %m" -#: server.c:173 +#: server.c:175 #, c-format msgid "could not parse version file \"%s\"" msgstr "не удалось разобрать файл с версией \"%s\"" -#: server.c:299 +#: server.c:301 #, c-format msgid "" "\n" @@ -2274,7 +2284,7 @@ msgstr "" "\n" "%s" -#: server.c:303 +#: server.c:305 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -2284,7 +2294,7 @@ msgstr "" "командой:\n" "%s" -#: server.c:307 +#: server.c:309 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -2294,26 +2304,26 @@ msgstr "" "командой:\n" "%s" -#: server.c:321 +#: server.c:323 #, c-format msgid "pg_ctl failed to start the source server, or connection failed" msgstr "" "программа pg_ctl не смогла запустить исходный сервер, либо к нему не удалось " "подключиться" -#: server.c:323 +#: server.c:325 #, c-format msgid "pg_ctl failed to start the target server, or connection failed" msgstr "" "программа pg_ctl не смогла запустить целевой сервер, либо к нему не удалось " "подключиться" -#: server.c:368 task.c:195 +#: server.c:370 task.c:197 #, c-format msgid "out of memory" msgstr "нехватка памяти" -#: server.c:381 +#: server.c:383 #, c-format msgid "libpq environment variable %s has a non-local server value: %s" msgstr "" @@ -2344,12 +2354,12 @@ msgstr "" msgid "tablespace path \"%s\" is not a directory" msgstr "путь табличного пространства \"%s\" не указывает на каталог" -#: task.c:216 task.c:267 task.c:282 task.c:293 +#: task.c:218 task.c:269 task.c:284 task.c:295 #, c-format msgid "connection failure: %s" msgstr "ошибка подключения: %s" -#: task.c:395 +#: task.c:397 #, c-format msgid "invalid socket" msgstr "неверный сокет" @@ -2369,12 +2379,12 @@ msgstr "ошибка при обращении к каталогу \"%s\": %m" msgid "ok" msgstr "ок" -#: version.c:44 +#: version.c:62 #, c-format msgid "Checking for hash indexes" msgstr "Проверка хеш-индексов" -#: version.c:123 +#: version.c:141 #, c-format msgid "" "\n" @@ -2389,7 +2399,7 @@ msgstr "" "перестроить с помощью команды REINDEX. По завершении обновления вы получите\n" "инструкции по выполнению REINDEX." -#: version.c:129 +#: version.c:147 #, c-format msgid "" "\n" @@ -2408,17 +2418,17 @@ msgstr "" "будучи выполненным администратором БД в psql, пересоздаст все неправильные\n" "индексы; до этого никакие хеш-индексы не будут использоваться." -#: version.c:187 +#: version.c:205 #, c-format msgid "Checking for extension updates" msgstr "Проверка обновлённых расширений" -#: version.c:201 +#: version.c:219 #, c-format msgid "notice" msgstr "замечание" -#: version.c:202 +#: version.c:220 #, c-format msgid "" "\n" diff --git a/src/bin/pg_upgrade/t/003_logical_slots.pl b/src/bin/pg_upgrade/t/003_logical_slots.pl index 75db4911730..a1ba6293899 100644 --- a/src/bin/pg_upgrade/t/003_logical_slots.pl +++ b/src/bin/pg_upgrade/t/003_logical_slots.pl @@ -62,7 +62,7 @@ $oldpub->start; $oldpub->safe_psql( 'postgres', qq[ - SELECT pg_create_logical_replication_slot('test_slot1', 'test_decoding'); + SELECT pg_create_logical_replication_slot('test_slot1', 'pgoutput'); SELECT pg_create_logical_replication_slot('test_slot2', 'test_decoding'); ]); $oldpub->stop(); @@ -89,6 +89,48 @@ # old cluster. Both slots will be used for subsequent tests. $newpub->append_conf('postgresql.conf', "max_replication_slots = 2"); +# ------------------------------ +# TEST: Confirm pg_upgrade fails when slot plugins are prohibited by the new cluster + +$newpub->append_conf('postgresql.conf', + "output_plugin_libraries = 'pgoutput'"); + +command_checks_all( + [@pg_upgrade_cmd], + 1, + [ + qr/Your installation contains logical replication slots with plugins/, + qr/that are not allowed by the new cluster's output_plugin_libraries/, + ], + [qr//], + 'run of pg_upgrade where the old cluster has untrusted output plugins'); + +my $slots_filename; + +# Find a txt file that contains a list of logical replication slots that cannot +# be upgraded. We cannot predict the file's path because the output directory +# contains a milliseconds timestamp. File::Find::find must be used. +find( + sub { + if ($File::Find::name =~ m/disallowed_output_plugins\.txt/) + { + $slots_filename = $File::Find::name; + } + }, + $newpub->data_dir . "/pg_upgrade_output.d"); + +# Check the report. +my $content = slurp_file($slots_filename); +like( + $content, + qr/The slot "test_slot2" uses plugin "test_decoding"/m, + 'the previous test failed due to prohibited plugins'); +unlike($content, qr/test_slot1/m, 'allowed plugin is not reported'); + +# Fix things for the next tests. +$newpub->append_conf('postgresql.conf', + "output_plugin_libraries = 'pgoutput, test_decoding'"); + # ------------------------------ # TEST: Confirm pg_upgrade fails when the slot still has unconsumed WAL records @@ -124,11 +166,6 @@ ); # Verify the reason why the logical replication slot cannot be upgraded -my $slots_filename; - -# Find a txt file that contains a list of logical replication slots that cannot -# be upgraded. We cannot predict the file's path because the output directory -# contains a milliseconds timestamp. File::Find::find must be used. find( sub { if ($File::Find::name =~ m/invalid_logical_slots\.txt/) diff --git a/src/bin/pg_verifybackup/po/de.po b/src/bin/pg_verifybackup/po/de.po index a04ee41add8..9391cc019ae 100644 --- a/src/bin/pg_verifybackup/po/de.po +++ b/src/bin/pg_verifybackup/po/de.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-05 12:10+0000\n" -"PO-Revision-Date: 2026-05-06 16:09+0200\n" +"POT-Creation-Date: 2026-08-08 06:18+0000\n" +"PO-Revision-Date: 2026-08-08 09:38+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -111,17 +111,27 @@ msgstr "Zielpuffer ist zu klein" msgid "OpenSSL failure" msgstr "OpenSSL-Fehler" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/jsonapi.c:2484 msgid "Recursive descent parser cannot use incremental lexer." msgstr "Parser mit rekursivem Abstieg kann inkrementellen Lexer nicht benutzen." @@ -468,12 +478,17 @@ msgstr "Eingabedatei scheint kein gültiges Tar-Archiv zu sein" msgid "tar member has empty name" msgstr "Tar-Mitglied hat leeren Namen" -#: ../../fe_utils/astreamer_tar.c:328 +#: ../../fe_utils/astreamer_tar.c:309 +#, c-format +msgid "tar member has unsafe path name: \"%s\"" +msgstr "Tar-Mitglied hat unsicheren Pfadnamen: »%s«" + +#: ../../fe_utils/astreamer_tar.c:332 #, c-format msgid "pax extensions to tar format are not supported" msgstr "PAX-Erweiterungen des Tar-Formats werden nicht unterstützt" -#: ../../fe_utils/astreamer_tar.c:357 +#: ../../fe_utils/astreamer_tar.c:361 #, c-format msgid "COPY stream ended before last file was finished" msgstr "COPY-Strom endete vor dem Ende der letzten Datei" diff --git a/src/bin/pg_verifybackup/po/ru.po b/src/bin/pg_verifybackup/po/ru.po index a4f76ac9518..451aa09e6a2 100644 --- a/src/bin/pg_verifybackup/po/ru.po +++ b/src/bin/pg_verifybackup/po/ru.po @@ -1,10 +1,10 @@ -# SPDX-FileCopyrightText: 2020, 2021, 2022, 2023, 2024, 2025 Alexander Lakhin +# SPDX-FileCopyrightText: 2020, 2021, 2022, 2023, 2024, 2025, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2025-09-13 19:04+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:51+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -92,7 +92,7 @@ msgid "could not fsync file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" #: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 -#: ../../common/jsonapi.c:2410 ../../common/parse_manifest.c:157 +#: ../../common/jsonapi.c:2459 ../../common/parse_manifest.c:157 #: ../../common/parse_manifest.c:852 #, c-format msgid "out of memory" @@ -111,102 +111,112 @@ msgstr "буфер назначения слишком мал" msgid "OpenSSL failure" msgstr "ошибка OpenSSL" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" -#: ../../common/jsonapi.c:2435 +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + +#: ../../common/jsonapi.c:2484 msgid "Recursive descent parser cannot use incremental lexer." msgstr "" "Инкрементальный лексический анализатор не подходит для нисходящего " "рекурсивного разбора." -#: ../../common/jsonapi.c:2437 +#: ../../common/jsonapi.c:2486 msgid "Incremental parser requires incremental lexer." msgstr "" "Для инкрементального разбора требуется инкрементальный лексический " "анализатор." -#: ../../common/jsonapi.c:2439 +#: ../../common/jsonapi.c:2488 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "" "Слишком большая вложенность JSON, максимальная допустимая глубина: 6400." -#: ../../common/jsonapi.c:2441 +#: ../../common/jsonapi.c:2490 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%.*s\"." -#: ../../common/jsonapi.c:2445 +#: ../../common/jsonapi.c:2494 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../../common/jsonapi.c:2449 +#: ../../common/jsonapi.c:2498 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%.*s\"." -#: ../../common/jsonapi.c:2452 +#: ../../common/jsonapi.c:2501 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2455 +#: ../../common/jsonapi.c:2504 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2458 +#: ../../common/jsonapi.c:2507 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "Ожидалось \":\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2461 +#: ../../common/jsonapi.c:2510 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2464 +#: ../../common/jsonapi.c:2513 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../../common/jsonapi.c:2466 +#: ../../common/jsonapi.c:2515 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2469 +#: ../../common/jsonapi.c:2518 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2472 +#: ../../common/jsonapi.c:2521 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Ожидалась строка, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2475 +#: ../../common/jsonapi.c:2524 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Ошибочный элемент \"%.*s\"." -#: ../../common/jsonapi.c:2481 +#: ../../common/jsonapi.c:2530 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../../common/jsonapi.c:2483 +#: ../../common/jsonapi.c:2532 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../../common/jsonapi.c:2486 +#: ../../common/jsonapi.c:2535 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -214,22 +224,22 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../../common/jsonapi.c:2495 +#: ../../common/jsonapi.c:2544 #, c-format msgid "" "Unicode escape value could not be translated to the server's encoding %s." msgstr "Спецкод Unicode нельзя преобразовать в серверную кодировку %s." -#: ../../common/jsonapi.c:2502 +#: ../../common/jsonapi.c:2551 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../../common/jsonapi.c:2504 +#: ../../common/jsonapi.c:2553 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее слово суррогата Unicode должно следовать за старшим словом." -#: ../../common/jsonapi.c:2526 +#: ../../common/jsonapi.c:2575 msgid "out of memory while constructing error description" msgstr "нехватка памяти при составлении описания ошибки" @@ -412,7 +422,7 @@ msgstr "не удалось установить уровень сжатия %d: #: ../../fe_utils/astreamer_gzip.c:140 ../../fe_utils/astreamer_gzip.c:273 #: ../../fe_utils/astreamer_lz4.c:102 ../../fe_utils/astreamer_lz4.c:300 -#: ../../fe_utils/astreamer_zstd.c:133 ../../fe_utils/astreamer_zstd.c:288 +#: ../../fe_utils/astreamer_zstd.c:130 ../../fe_utils/astreamer_zstd.c:285 #, c-format msgid "this build does not support compression with %s" msgstr "эта сборка программы не поддерживает сжатие %s" @@ -433,7 +443,7 @@ msgid "could not initialize compression library" msgstr "не удалось инициализировать библиотеку сжатия" #: ../../fe_utils/astreamer_gzip.c:320 ../../fe_utils/astreamer_lz4.c:356 -#: ../../fe_utils/astreamer_zstd.c:333 +#: ../../fe_utils/astreamer_zstd.c:330 #, c-format msgid "could not decompress data: %s" msgstr "не удалось распаковать данные: %s" @@ -448,8 +458,8 @@ msgstr "не удалось создать контекст сжатия lz4: %s msgid "could not write lz4 header: %s" msgstr "не удалось записать заголовок lz4: %s" -#: ../../fe_utils/astreamer_lz4.c:191 ../../fe_utils/astreamer_zstd.c:185 -#: ../../fe_utils/astreamer_zstd.c:227 +#: ../../fe_utils/astreamer_lz4.c:191 ../../fe_utils/astreamer_zstd.c:182 +#: ../../fe_utils/astreamer_zstd.c:224 #, c-format msgid "could not compress data: %s" msgstr "не удалось сжать данные: %s" @@ -464,22 +474,32 @@ msgstr "не удалось завершить сжатие lz4: %s" msgid "could not initialize compression library: %s" msgstr "не удалось инициализировать библиотеку сжатия: %s" -#: ../../fe_utils/astreamer_tar.c:244 -#, c-format -msgid "tar file trailer exceeds 2 blocks" -msgstr "окончание файла tar занимает больше 2 блоков" - -#: ../../fe_utils/astreamer_tar.c:249 astreamer_verify.c:130 +#: ../../fe_utils/astreamer_tar.c:254 astreamer_verify.c:130 #, c-format msgid "unexpected state while parsing tar archive" msgstr "неожиданное состояние при разборе архива tar" -#: ../../fe_utils/astreamer_tar.c:292 +#: ../../fe_utils/astreamer_tar.c:300 +#, c-format +msgid "input file does not appear to be a valid tar archive" +msgstr "входной файл не похож на архив tar" + +#: ../../fe_utils/astreamer_tar.c:307 #, c-format msgid "tar member has empty name" msgstr "пустое имя у компонента tar" -#: ../../fe_utils/astreamer_tar.c:326 +#: ../../fe_utils/astreamer_tar.c:309 +#, c-format +msgid "tar member has unsafe path name: \"%s\"" +msgstr "компонент tar имеет небезопасный путь: \"%s\"" + +#: ../../fe_utils/astreamer_tar.c:332 +#, c-format +msgid "pax extensions to tar format are not supported" +msgstr "расширения PAX для формата tar не поддерживаются" + +#: ../../fe_utils/astreamer_tar.c:361 #, c-format msgid "COPY stream ended before last file was finished" msgstr "поток COPY закончился до завершения последнего файла" @@ -499,12 +519,12 @@ msgstr "не удалось установить для zstd уровень сж msgid "could not set compression worker count to %d: %s" msgstr "не удалось установить число потоков сжатия %d: %s" -#: ../../fe_utils/astreamer_zstd.c:120 +#: ../../fe_utils/astreamer_zstd.c:119 #, c-format msgid "could not enable long-distance mode: %s" msgstr "не удалось включить режим большой дистанции: %s" -#: ../../fe_utils/astreamer_zstd.c:279 +#: ../../fe_utils/astreamer_zstd.c:276 #, c-format msgid "could not create zstd decompression context" msgstr "не удалось создать контекст распаковки zstd" @@ -855,6 +875,10 @@ msgstr "" msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" +#, fuzzy, c-format +#~ msgid "tar file trailer exceeds 2 blocks" +#~ msgstr "окончание файла tar занимает больше 2 блоков" + #~ msgid "parsing failed" #~ msgstr "ошибка при разборе" diff --git a/src/bin/pg_waldump/po/de.po b/src/bin/pg_waldump/po/de.po index 8c5487e6487..7f67ee9469b 100644 --- a/src/bin/pg_waldump/po/de.po +++ b/src/bin/pg_waldump/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_waldump (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-04-03 12:20+0000\n" +"POT-Creation-Date: 2026-08-08 06:19+0000\n" "PO-Revision-Date: 2025-04-03 16:18+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -36,17 +36,27 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 pg_waldump.c:199 #: pg_waldump.c:532 @@ -462,147 +472,147 @@ msgstr "ungültiger Datensatz-Offset bei %X/%X: mindestens %u erwartet, %u erhal msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: xlogreader.c:670 xlogreader.c:1135 +#: xlogreader.c:670 xlogreader.c:1145 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "ungültige Datensatzlänge bei %X/%X: mindestens %u erwartet, %u erhalten" -#: xlogreader.c:759 +#: xlogreader.c:760 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: xlogreader.c:772 +#: xlogreader.c:773 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" -#: xlogreader.c:1143 +#: xlogreader.c:1153 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: xlogreader.c:1156 xlogreader.c:1172 +#: xlogreader.c:1166 xlogreader.c:1182 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" -#: xlogreader.c:1210 +#: xlogreader.c:1220 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X" -#: xlogreader.c:1244 +#: xlogreader.c:1254 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige magische Zahl %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1259 xlogreader.c:1301 +#: xlogreader.c:1269 xlogreader.c:1311 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige Info-Bits %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1275 +#: xlogreader.c:1285 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %, pg_control database system identifier is %" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %, Datenbanksystemidentifikator in pg_control ist %" -#: xlogreader.c:1283 +#: xlogreader.c:1293 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf" -#: xlogreader.c:1289 +#: xlogreader.c:1299 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf" -#: xlogreader.c:1321 +#: xlogreader.c:1331 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "unerwartete Pageaddr %X/%X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1347 +#: xlogreader.c:1357 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1759 +#: xlogreader.c:1771 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u außer der Reihe bei %X/%X" -#: xlogreader.c:1783 +#: xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" -#: xlogreader.c:1790 +#: xlogreader.c:1802 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" -#: xlogreader.c:1826 +#: xlogreader.c:1838 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1842 +#: xlogreader.c:1854 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" -#: xlogreader.c:1856 +#: xlogreader.c:1868 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1871 +#: xlogreader.c:1883 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" -#: xlogreader.c:1887 +#: xlogreader.c:1899 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" -#: xlogreader.c:1899 +#: xlogreader.c:1911 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: xlogreader.c:1966 +#: xlogreader.c:1978 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: xlogreader.c:1992 +#: xlogreader.c:2004 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden" -#: xlogreader.c:2076 +#: xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen" -#: xlogreader.c:2083 +#: xlogreader.c:2095 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d" -#: xlogreader.c:2110 xlogreader.c:2127 +#: xlogreader.c:2122 xlogreader.c:2139 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d" -#: xlogreader.c:2136 +#: xlogreader.c:2148 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d" -#: xlogreader.c:2144 +#: xlogreader.c:2156 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" diff --git a/src/bin/pg_waldump/po/ru.po b/src/bin/pg_waldump/po/ru.po index 175ed305c62..90cd6e9a511 100644 --- a/src/bin/pg_waldump/po/ru.po +++ b/src/bin/pg_waldump/po/ru.po @@ -1,13 +1,13 @@ # Russian message translation file for pg_waldump # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2022, 2023, 2024, 2025 Alexander Lakhin +# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2022, 2023, 2024, 2025, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_waldump (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2025-08-30 22:30+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:51+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -37,17 +37,27 @@ msgstr "подробности: " msgid "hint: " msgstr "подсказка: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 pg_waldump.c:199 #: pg_waldump.c:532 @@ -587,23 +597,23 @@ msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте WAL " "%s, LSN %X/%X, смещение %u" -#: xlogreader.c:1769 +#: xlogreader.c:1771 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: xlogreader.c:1793 +#: xlogreader.c:1795 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: xlogreader.c:1800 +#: xlogreader.c:1802 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не установлен, но длина данных равна %u в позиции %X/%X" -#: xlogreader.c:1836 +#: xlogreader.c:1838 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -612,21 +622,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: xlogreader.c:1852 +#: xlogreader.c:1854 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не установлен, но для пропуска заданы смещение %u и длина " "%u в позиции %X/%X" -#: xlogreader.c:1866 +#: xlogreader.c:1868 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/" "%X" -#: xlogreader.c:1881 +#: xlogreader.c:1883 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -635,41 +645,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " "блока равна %u в позиции %X/%X" -#: xlogreader.c:1897 +#: xlogreader.c:1899 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: xlogreader.c:1909 +#: xlogreader.c:1911 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: xlogreader.c:1976 +#: xlogreader.c:1978 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: xlogreader.c:2002 +#: xlogreader.c:2004 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: xlogreader.c:2086 +#: xlogreader.c:2088 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: xlogreader.c:2093 +#: xlogreader.c:2095 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "" "не удалось восстановить образ в позиции %X/%X с неверным состоянием, блок %d" -#: xlogreader.c:2120 xlogreader.c:2137 +#: xlogreader.c:2122 xlogreader.c:2139 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -678,7 +688,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " "поддерживается этой сборкой, блок %d" -#: xlogreader.c:2146 +#: xlogreader.c:2148 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -686,7 +696,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " "блок %d" -#: xlogreader.c:2154 +#: xlogreader.c:2156 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалось развернуть образ в позиции %X/%X, блок %d" diff --git a/src/bin/pg_walsummary/meson.build b/src/bin/pg_walsummary/meson.build index fe9af967b12..7e8e7b4216e 100644 --- a/src/bin/pg_walsummary/meson.build +++ b/src/bin/pg_walsummary/meson.build @@ -25,6 +25,7 @@ tests += { 'tests': [ 't/001_basic.pl', 't/002_blocks.pl', + 't/003_tli_switch.pl', ], } } diff --git a/src/bin/pg_walsummary/po/de.po b/src/bin/pg_walsummary/po/de.po index 2c180942bf5..6241940f69c 100644 --- a/src/bin/pg_walsummary/po/de.po +++ b/src/bin/pg_walsummary/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_walsummary (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-06-21 16:53+0000\n" +"POT-Creation-Date: 2026-08-08 06:24+0000\n" "PO-Revision-Date: 2024-06-22 07:35+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -15,76 +15,86 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:276 +#: ../../../src/common/logging.c:279 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:283 +#: ../../../src/common/logging.c:286 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../../src/common/logging.c:294 +#: ../../../src/common/logging.c:297 #, c-format msgid "detail: " msgstr "Detail: " -#: ../../../src/common/logging.c:301 +#: ../../../src/common/logging.c:304 #, c-format msgid "hint: " msgstr "Tipp: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" -#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 -#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 -#: pg_walsummary.c:109 +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + +#: ../../common/file_utils.c:69 ../../common/file_utils.c:370 +#: ../../common/file_utils.c:428 ../../common/file_utils.c:502 +#: pg_walsummary.c:108 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../../common/file_utils.c:76 +#: ../../common/file_utils.c:75 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" -#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../common/file_utils.c:123 ../../common/file_utils.c:588 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../common/file_utils.c:133 ../../common/file_utils.c:243 #: ../../fe_utils/option_utils.c:99 #, c-format msgid "this build does not support sync method \"%s\"" msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" -#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/file_utils.c:156 ../../common/file_utils.c:304 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/file_utils.c:174 ../../common/file_utils.c:338 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" -#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#: ../../common/file_utils.c:440 ../../common/file_utils.c:510 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../../common/file_utils.c:498 +#: ../../common/file_utils.c:520 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" @@ -104,22 +114,22 @@ msgstr "%s muss im Bereich %d..%d sein" msgid "unrecognized sync method: %s" msgstr "unbekannte Sync-Methode: %s" -#: pg_walsummary.c:87 pg_walsummary.c:95 +#: pg_walsummary.c:86 pg_walsummary.c:94 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_walsummary.c:94 +#: pg_walsummary.c:93 #, c-format msgid "no input files specified" msgstr "keine Eingabedateien angegeben" -#: pg_walsummary.c:252 +#: pg_walsummary.c:251 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: pg_walsummary.c:267 +#: pg_walsummary.c:266 #, c-format msgid "" "%s prints the contents of a WAL summary file.\n" @@ -128,17 +138,17 @@ msgstr "" "%s gibt den Inhalt einer WAL-Summary-Datei aus.\n" "\n" -#: pg_walsummary.c:268 +#: pg_walsummary.c:267 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_walsummary.c:269 +#: pg_walsummary.c:268 #, c-format msgid " %s [OPTION]... FILE...\n" msgstr " %s [OPTION]... DATEI...\n" -#: pg_walsummary.c:270 +#: pg_walsummary.c:269 #, c-format msgid "" "\n" @@ -147,27 +157,27 @@ msgstr "" "\n" "Optionen:\n" -#: pg_walsummary.c:271 +#: pg_walsummary.c:270 #, c-format msgid " -i, --individual list block numbers individually, not as ranges\n" msgstr " -i, --individual Blocknummern einzeln auflisten, nicht als Bereich\n" -#: pg_walsummary.c:272 +#: pg_walsummary.c:271 #, c-format msgid " -q, --quiet don't print anything, just parse the files\n" msgstr " -q, --quiet nichts ausgeben, nur die Dateien parsen\n" -#: pg_walsummary.c:273 +#: pg_walsummary.c:272 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_walsummary.c:274 +#: pg_walsummary.c:273 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_walsummary.c:276 +#: pg_walsummary.c:275 #, c-format msgid "" "\n" @@ -176,7 +186,7 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_walsummary.c:277 +#: pg_walsummary.c:276 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" diff --git a/src/bin/pg_walsummary/po/ru.po b/src/bin/pg_walsummary/po/ru.po index 0fe35651185..f4f1bd7a26b 100644 --- a/src/bin/pg_walsummary/po/ru.po +++ b/src/bin/pg_walsummary/po/ru.po @@ -1,10 +1,10 @@ -# Alexander Lakhin , 2024. +# SPDX-FileCopyrightText: 2024, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_walsummary (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2024-09-05 14:47+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:51+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -35,17 +35,27 @@ msgstr "подробности: " msgid "hint: " msgstr "подсказка: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #: pg_walsummary.c:108 diff --git a/src/bin/pg_walsummary/t/002_blocks.pl b/src/bin/pg_walsummary/t/002_blocks.pl index 0f98c7df82e..fcb701e1b98 100644 --- a/src/bin/pg_walsummary/t/002_blocks.pl +++ b/src/bin/pg_walsummary/t/002_blocks.pl @@ -93,13 +93,14 @@ split(m@/@, $end_lsn); ok(-f $filename, "WAL summary file exists"); -# Run pg_walsummary on it. We expect exactly two blocks to be modified, -# block 0 and one other. +# Run pg_walsummary on it. We expect exactly three blocks to be modified, +# block 0 (old tuple), another block (new tuple), and the block for the VM. my ($stdout, $stderr) = run_command([ 'pg_walsummary', '-i', $filename ]); note($stdout); @lines = split(/\n/, $stdout); like($stdout, qr/FORK main: block 0$/m, "stdout shows block 0 modified"); +like($stdout, qr/FORK vm: block 0$/m, "stdout shows VM block 0 modified"); is($stderr, '', 'stderr is empty'); -is(0 + @lines, 2, "UPDATE modified 2 blocks"); +is(0 + @lines, 3, "UPDATE modified 3 blocks"); done_testing(); diff --git a/src/bin/pg_walsummary/t/003_tli_switch.pl b/src/bin/pg_walsummary/t/003_tli_switch.pl new file mode 100644 index 00000000000..28e09f3260a --- /dev/null +++ b/src/bin/pg_walsummary/t/003_tli_switch.pl @@ -0,0 +1,149 @@ +# Copyright (c) 2021-2026, PostgreSQL Global Development Group +# +# In the original version of the WAL summarizer code, we were only willing +# to read WAL for a given TLI from a file with that exact TLI encoded into +# the filename. This could result in WAL summarization running on an archiving +# standby getting stuck. +# +# The reason for the problem is that when a new primary is promoted, the +# partial file that ends the old timeline is renamed, giving it a ".partial" +# suffix, meaning that it will be ignored by both recovery and by the WAL +# summarizer. The bytes that appear at the start of that segment will be copied +# into the first segment on the new timeline, and recovery was able to read +# them from there and work as expected. However, the WAL summarizer was +# unwilling to do the same thing, so it got stuck. This test aims to validate +# that this bug has been fixed. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Set up node1 as primary. +my $node1 = PostgreSQL::Test::Cluster->new('node1'); +$node1->init(allows_streaming => 1); +$node1->append_conf('postgresql.conf', <start; + +# Set up node2 as a standby for node1. Use archive_mode=always, to make sure it +# archives both before and after promotion. +$node1->backup('backup1'); +my $node2 = PostgreSQL::Test::Cluster->new('node2'); +$node2->init_from_backup($node1, 'backup1', has_streaming => 1); +$node2->enable_archiving(); +$node2->append_conf('postgresql.conf', <start; + +# Wait for node2 to catch up. +$node1->wait_for_replay_catchup($node2); + +# Set up node3 as a standby for node2. We want it to fetch WAL only from the +# archive, so we clear primary_conninfo. We don't want long delays during the +# test, so we reduce wal_retrieve_retry_interval. We also don't want it to try +# to archive anything to node2's archive, but at the same time, we don't want +# it to remove WAL before we enable WAL summarization. To accomplish that, we +# set archive_command to the empty string. +$node2->backup('backup2'); +my $node3 = PostgreSQL::Test::Cluster->new('node3'); +$node3->init_from_backup($node2, 'backup2', has_restoring => 1); +$node3->append_conf('postgresql.conf', <start; + +# Create a new, partially-filled WAL segment on node1. +$node1->safe_psql('postgres', <wait_for_replay_catchup($node2); + +# Record the WAL insert LSN on node1, so we can later verify that summarization +# on node3 advances past this point. +my $node1_final_lsn = $node1->safe_psql('postgres', + 'SELECT pg_current_wal_insert_lsn()'); + +# Promote node2. This creates a timeline switch that node3 must follow. +$node2->promote; +$node2->poll_query_until('postgres', "SELECT pg_is_in_recovery() = 'f';"); + +# Cause the partial segment to get archived on the *new* timeline. +# +# In more detail: the WAL segment that contains the current insert LSN exists +# on timeline 1, but since all we did is CREATE TABLE dummy (), it wasn't full. +# We're now running on timeline 2, and pg_switch_wal() fills up the rest of the +# segment. So the full segment should get archived on timeline 2, but not on +# timeline 1. We do a CHECKPOINT here to make sure that the summarizer tries +# to progress. +my $node2_switch_lsn = + $node2->safe_psql('postgres', 'SELECT pg_switch_wal()'); +$node2->safe_psql('postgres', 'CHECKPOINT'); + +# Wait until replay has reached TLI 2 on node3, and then start the WAL +# summarizer. If node3 is started with the summarizer already enabled, then +# it may try to fetch the partial segment from timeline 1 before it learns +# about timeline 2. If that happens, it will error out, wait 10 seconds, and +# retry, slowing down the test. This avoids that. +# +# Since the pg_switch_wal() above was executed after promotion, its return +# value is past the timeline switch point, so once replay reaches it, node3 +# must be replaying from TLI 2. +# +# We set log_min_messages=debug1 at the same time we enable WAL summarization +# so that we get useful debug messages if there's any problem. +$node3->poll_query_until('postgres', + "SELECT pg_last_wal_replay_lsn() >= '$node2_switch_lsn'::pg_lsn") + or die "TLI 2 not reached on node3"; +$node3->append_conf('postgresql.conf', <reload; + +# Wait for WAL summarization on node3 to advance past the pre-promotion LSN. +# If the bug is present, the summarizer gets stuck trying to open the old +# timeline's segment file. +my $result = $node3->poll_query_until('postgres', <safe_psql('postgres', <safe_psql('postgres', <= '$node1_final_lsn' ORDER BY start_lsn +EOM +my @summary_lines = split(/\n/, $summaries); +ok(@summary_lines > 0, "at least one summary from LSN $node1_final_lsn or later"); + +# We expect the new summaries to be empty, because we have not actually touched +# any block data (and we disabled autovacuum from the start). +for my $line (@summary_lines) +{ + my ($tli, $start_lsn, $end_lsn) = split(/\|/, $line); + my $filename = sprintf "%s/pg_wal/summaries/%08s%08s%08s%08s%08s.summary", + $node3->data_dir, $tli, + split(m@/@, $start_lsn), + split(m@/@, $end_lsn); + my ($stdout, $stderr) = run_command([ 'pg_walsummary', $filename ]); + is($stdout, '', "pg_walsummary TLI $tli $start_lsn-$end_lsn: no blocks"); + is($stderr, '', "pg_walsummary TLI $tli $start_lsn-$end_lsn: no error"); +} + +done_testing(); diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index f4dd8c0b474..6d3b67cdede 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3623,22 +3623,19 @@ getTransactionStatus(PGconn *con) static void printVerboseErrorMessages(CState *st, pg_time_usec_t *now, bool is_retry) { - static PQExpBuffer buf = NULL; + PQExpBufferData buf; - if (buf == NULL) - buf = createPQExpBuffer(); - else - resetPQExpBuffer(buf); + initPQExpBuffer(&buf); - printfPQExpBuffer(buf, "client %d ", st->id); - appendPQExpBufferStr(buf, (is_retry ? - "repeats the transaction after the error" : - "ends the failed transaction")); - appendPQExpBuffer(buf, " (try %u", st->tries); + printfPQExpBuffer(&buf, "client %d ", st->id); + appendPQExpBufferStr(&buf, (is_retry ? + "repeats the transaction after the error" : + "ends the failed transaction")); + appendPQExpBuffer(&buf, " (try %u", st->tries); /* Print max_tries if it is not unlimited. */ if (max_tries) - appendPQExpBuffer(buf, "/%u", max_tries); + appendPQExpBuffer(&buf, "/%u", max_tries); /* * If the latency limit is used, print a percentage of the current @@ -3647,12 +3644,14 @@ printVerboseErrorMessages(CState *st, pg_time_usec_t *now, bool is_retry) if (latency_limit) { pg_time_now_lazy(now); - appendPQExpBuffer(buf, ", %.3f%% of the maximum time of tries was used", + appendPQExpBuffer(&buf, ", %.3f%% of the maximum time of tries was used", (100.0 * (*now - st->txn_scheduled) / latency_limit)); } - appendPQExpBufferStr(buf, ")\n"); + appendPQExpBufferStr(&buf, ")\n"); - pg_log_info("%s", buf->data); + pg_log_info("%s", buf.data); + + termPQExpBuffer(&buf); } /* @@ -6846,7 +6845,7 @@ main(int argc, char **argv) break; case 'c': benchmarking_option_set = true; - if (!option_parse_int(optarg, "-c/--clients", 1, INT_MAX, + if (!option_parse_int(optarg, "-c/--client", 1, INT_MAX, &nclients)) { exit(1); diff --git a/src/bin/pgbench/t/002_pgbench_no_server.pl b/src/bin/pgbench/t/002_pgbench_no_server.pl index f975c73dd75..ded4356f95c 100644 --- a/src/bin/pgbench/t/002_pgbench_no_server.pl +++ b/src/bin/pgbench/t/002_pgbench_no_server.pl @@ -92,7 +92,7 @@ sub pgbench_scripts [ 'too many scripts', '-S ' x 129, [qr{at most 128 SQL scripts}] ], [ 'bad #clients', '-c three', - [qr{invalid value "three" for option -c/--clients}] + [qr{invalid value "three" for option -c/--client}] ], [ 'bad #threads', '-j eleven', diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 89126539361..09a1e79a6a7 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -2788,6 +2788,12 @@ exec_command_restrict(PsqlScanState scan_state, bool active_branch, Assert(!restricted); + /* + * Unlike \unrestrict, this argument may safely undergo backquote and + * variable expansion: HandleSlashCmds() rejects \restrict in + * restricted mode before its argument is scanned, so we only get here + * when the input could execute such things anyway. + */ opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true); if (opt == NULL || opt[0] == '\0') { @@ -3196,7 +3202,7 @@ exec_command_unrestrict(PsqlScanState scan_state, bool active_branch, { char *opt; - opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true); + opt = psql_scan_slash_option(scan_state, OT_WHOLE_LINE, NULL, true); if (opt == NULL || opt[0] == '\0') { pg_log_error("\\%s: missing required argument", cmd); @@ -3220,7 +3226,7 @@ exec_command_unrestrict(PsqlScanState scan_state, bool active_branch, } } else - ignore_slash_options(scan_state); + ignore_slash_whole_line(scan_state); return PSQL_CMD_SKIP_LINE; } @@ -3793,8 +3799,8 @@ is_branching_command(const char *cmd) * Prepare to possibly restore query buffer to its current state * (cf. discard_query_text). * - * We need to remember the length of the query buffer, and the lexer's - * notion of the parenthesis nesting depth. + * We need to remember the length of the query buffer, and assorted + * lexer internal state such as parenthesis nesting depth. */ static void save_query_text_state(PsqlScanState scan_state, ConditionalStack cstack, @@ -3802,8 +3808,8 @@ save_query_text_state(PsqlScanState scan_state, ConditionalStack cstack, { if (query_buf) conditional_stack_set_query_len(cstack, query_buf->len); - conditional_stack_set_paren_depth(cstack, - psql_scan_get_paren_depth(scan_state)); + conditional_stack_set_lex_state(cstack, + psql_scan_get_lex_state(scan_state)); } /* @@ -3812,9 +3818,7 @@ save_query_text_state(PsqlScanState scan_state, ConditionalStack cstack, * We must discard data that was appended to query_buf during an inactive * \if branch. We don't have to do anything there if there's no query_buf. * - * Also, reset the lexer state to the same paren depth there was before. - * (The rest of its state doesn't need attention, since we could not be - * inside a comment or literal or partial token.) + * Also, reset the lexer's state to what it was before. */ static void discard_query_text(PsqlScanState scan_state, ConditionalStack cstack, @@ -3828,8 +3832,8 @@ discard_query_text(PsqlScanState scan_state, ConditionalStack cstack, query_buf->len = new_len; query_buf->data[new_len] = '\0'; } - psql_scan_set_paren_depth(scan_state, - conditional_stack_get_paren_depth(cstack)); + psql_scan_set_lex_state(scan_state, + conditional_stack_get_lex_state(cstack)); } /* diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index cd329ade12b..428f965c495 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -27,6 +27,7 @@ #include "fe_utils/cancel.h" #include "fe_utils/mbprint.h" #include "fe_utils/string_utils.h" +#include "mainloop.h" #include "portability/instr_time.h" #include "settings.h" @@ -34,6 +35,7 @@ static bool DescribeQuery(const char *query, double *elapsed_msec); static int ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_gone_p, + int num_copy_from_stdin, bool is_watch, int min_rows, const printQueryOpt *opt, @@ -721,7 +723,11 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout, SetCancelConn(pset.db); - res = ExecQueryAndProcessResults(query, &elapsed_msec, NULL, true, min_rows, opt, printQueryFout); + res = ExecQueryAndProcessResults(query, + &elapsed_msec, NULL, + -1, + true, min_rows, + opt, printQueryFout); ResetCancelConn(); @@ -893,7 +899,7 @@ ExecQueryTuples(const PGresult *result) fflush(stdout); } - if (!SendQuery(query)) + if (!SendQuery(query, -1)) { /* Error - abandon execution if ON_ERROR_STOP */ success = false; @@ -924,8 +930,7 @@ ExecQueryTuples(const PGresult *result) * once and report any error. Return whether all was ok. * * For COPY OUT, direct the output to copystream, or discard if that's NULL. - * For COPY IN, use pset.copyStream as data source if it's set, - * otherwise cur_cmd_source. + * For COPY IN, read from copystream (which mustn't be NULL). * * Update *resultp if further processing is necessary; set to NULL otherwise. * Return a result when queryFout can safely output a result status: on COPY @@ -966,8 +971,7 @@ HandleCopyResult(PGresult **resultp, FILE *copystream) else { /* COPY IN */ - /* Ignore the copystream argument passed to the function */ - copystream = pset.copyStream ? pset.copyStream : pset.cur_cmd_source; + Assert(copystream); success = handleCopyIn(pset.db, copystream, PQbinaryTuples(*resultp), @@ -1112,10 +1116,14 @@ PrintQueryResult(PGresult *result, bool last, * To send "back door" queries (generated by slash commands, etc.) in a * controlled way, use PSQLexec(). * + * In the most common case, the caller can determine whether the query + * includes any COPY FROM STDIN command(s); if so, pass the count of them. + * Otherwise pass num_copy_from_stdin == -1 and we'll compute it locally. + * * Returns true if the query executed successfully, false otherwise. */ bool -SendQuery(const char *query) +SendQuery(const char *query, int num_copy_from_stdin) { bool timing = pset.timing; PGTransactionStatusType transaction_status; @@ -1209,7 +1217,11 @@ SendQuery(const char *query) else { /* Default fetch-and-print mode */ - OK = (ExecQueryAndProcessResults(query, &elapsed_msec, &svpt_gone, false, 0, NULL, NULL) > 0); + OK = (ExecQueryAndProcessResults(query, + &elapsed_msec, &svpt_gone, + num_copy_from_stdin, + false, 0, + NULL, NULL) > 0); } if (!OK && pset.echo == PSQL_ECHO_ERRORS) @@ -1497,11 +1509,24 @@ discardAbortedPipelineResults(void) } else if (res == NULL) { - /* A query was processed, decrement the counters */ - Assert(pset.available_results > 0); - Assert(pset.requested_results > 0); - pset.available_results--; - pset.requested_results--; + /* + * A query was processed, decrement the counters. + * + * It is possible to get here with available_results == 0 when an + * error is generated by the Sync message processing itself. Such + * errors are not counted in available_results because they are + * not associated with a piped command. In that case, skip the + * counter decrements and continue to find the Sync result. + * + * If the connection has been lost, there will never be any more + * results to read, so bail out. + */ + if (!ConnectionUp()) + return NULL; + if (pset.available_results > 0) + pset.available_results--; + if (pset.requested_results > 0) + pset.requested_results--; } if (pset.requested_results == 0) @@ -1555,6 +1580,7 @@ discardAbortedPipelineResults(void) static int ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_gone_p, + int num_copy_from_stdin, bool is_watch, int min_rows, const printQueryOpt *opt, FILE *printQueryFout) { @@ -1759,6 +1785,29 @@ ExecQueryAndProcessResults(const char *query, return 0; } + /* + * If the caller didn't count the number of COPY FROM STDIN command(s) in + * the query string, we must do so now. + */ + if (num_copy_from_stdin < 0) + { + PsqlScanState scan_state; + PQExpBuffer query_buf; + promptStatus_t prompt_tmp; + + scan_state = psql_scan_create(&psqlscan_callbacks); + psql_scan_setup(scan_state, query, strlen(query), + pset.encoding, standard_strings()); + query_buf = createPQExpBuffer(); + + (void) psql_scan(scan_state, query_buf, &prompt_tmp); + + num_copy_from_stdin = psql_scan_count_copy_from_stdin(scan_state); + + destroyPQExpBuffer(query_buf); + psql_scan_destroy(scan_state); + } + /* first result */ result = PQgetResult(pset.db); if (min_rows > 0 && PQntuples(result) < min_rows) @@ -1894,14 +1943,15 @@ ExecQueryAndProcessResults(const char *query, exit(EXIT_BADCONN); } - /* - * For COPY OUT, direct the output to the default place (probably - * a pager pipe) for \watch, or to pset.copyStream for \copy, - * otherwise to pset.gfname if that's set, otherwise to - * pset.queryFout. - */ + /* Select data source or sink. */ if (result_status == PGRES_COPY_OUT) { + /* + * For COPY OUT, direct the output to the default place + * (probably a pager pipe) for \watch, or to pset.copyStream + * for \copy, otherwise to pset.gfname if that's set, + * otherwise to pset.queryFout. + */ if (is_watch) { /* invoked by \watch */ @@ -1925,6 +1975,32 @@ ExecQueryAndProcessResults(const char *query, copy_stream = pset.queryFout; } } + else + { + if (num_copy_from_stdin <= 0) + { + /* + * We didn't send a COPY FROM STDIN command. The server + * is broken or possibly malicious. Report and quit. (We + * could instead send an empty COPY response, but it's not + * clear that that's a better behavior; it would make it + * harder to diagnose any such problem.) + */ + pg_log_info("unexpected COPY_IN result, aborting connection"); + exit(EXIT_BADCONN); + } + /* Keep track of the number of remaining copy operations */ + num_copy_from_stdin--; + + /* + * For COPY IN, read from pset.copyStream if \copy set that, + * otherwise from the current command source. + */ + if (pset.copyStream) + copy_stream = pset.copyStream; + else + copy_stream = pset.cur_cmd_source; + } /* * Even if the output stream could not be opened, we call @@ -2042,14 +2118,16 @@ ExecQueryAndProcessResults(const char *query, if (result_status == PGRES_PIPELINE_SYNC) { - Assert(pset.piped_syncs > 0); - /* * Sync response, decrease the sync and requested_results - * counters. + * counters. Guard against underflow: an error during Sync + * processing on the server can cause the client-side counter to + * drift. */ - pset.piped_syncs--; - pset.requested_results--; + if (pset.piped_syncs > 0) + pset.piped_syncs--; + if (pset.requested_results > 0) + pset.requested_results--; /* * After a synchronisation point, reset success state to print @@ -2071,8 +2149,10 @@ ExecQueryAndProcessResults(const char *query, * In a pipeline with a non-sync response? Decrease the result * counters. */ - pset.available_results--; - pset.requested_results--; + if (pset.available_results > 0) + pset.available_results--; + if (pset.requested_results > 0) + pset.requested_results--; } /* @@ -2173,20 +2253,61 @@ ExecQueryAndProcessResults(const char *query, if (end_pipeline) { - /* after a pipeline is processed, pipeline piped_syncs should be 0 */ - Assert(pset.piped_syncs == 0); - /* all commands have been processed */ - Assert(pset.piped_commands == 0); - /* all results were read */ - Assert(pset.available_results == 0); + /* + * Reset available/requested results. Normally these are already 0, + * but an error generated by a Sync processing itself can leave some + * of them behind. Consume them before exiting pipeline mode. + */ + while (pset.piped_syncs > 0) + { + PGresult *remaining; + + remaining = PQgetResult(pset.db); + + if (remaining == NULL) + { + if (!ConnectionUp()) + break; + continue; + } + if (PQresultStatus(remaining) == PGRES_PIPELINE_SYNC) + pset.piped_syncs--; + PQclear(remaining); + } + pset.piped_syncs = 0; + pset.piped_commands = 0; + pset.available_results = 0; + pset.requested_results = 0; + + if (PQpipelineStatus(pset.db) != PQ_PIPELINE_OFF) + PQexitPipelineMode(pset.db); } Assert(pset.requested_results == 0); + SetPipelineVariables(); /* may need this to recover from conn loss during COPY */ if (!CheckConnection()) return -1; + /* + * If we were expecting COPY ... FROM STDIN, and we didn't get + * PGRES_COPY_IN (presumably because the COPY failed server-side), and the + * data is supposed to come from the current command source, we must eat + * up the data in order to stay in sync with the command file's contents. + * Repeat for the number of unfulfilled COPY commands. + */ + while (num_copy_from_stdin > 0) + { + if (pset.copyStream == NULL || + pset.copyStream == pset.cur_cmd_source) + (void) handleCopyIn(NULL, /* no connection */ + pset.cur_cmd_source, + false, /* XXX assume not binary */ + NULL); /* no result */ + num_copy_from_stdin--; + } + if (cancel_pressed || return_early) return 0; diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h index 64762ab9817..ce23c5d5d34 100644 --- a/src/bin/psql/common.h +++ b/src/bin/psql/common.h @@ -34,7 +34,7 @@ extern void SetShellResultVariables(int wait_result); extern PGresult *PSQLexec(const char *query); extern int PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout, int min_rows); -extern bool SendQuery(const char *query); +extern bool SendQuery(const char *query, int num_copy_from_stdin); extern bool is_superuser(void); extern bool standard_strings(void); diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c index 92c955b637a..ad8cb8f1e92 100644 --- a/src/bin/psql/copy.c +++ b/src/bin/psql/copy.c @@ -367,7 +367,7 @@ do_copy(const char *args) /* run it like a user command, but with copystream as data source/sink */ pset.copyStream = copystream; - success = SendQuery(query.data); + success = SendQuery(query.data, options->from ? 1 : 0); pset.copyStream = NULL; termPQExpBuffer(&query); @@ -495,11 +495,13 @@ handleCopyOut(PGconn *conn, FILE *copystream, PGresult **res) * sends data to complete a COPY ... FROM STDIN command * * conn should be a database connection that you just issued COPY FROM on - * and got back a PGRES_COPY_IN result. + * and got back a PGRES_COPY_IN result. Alternatively, if conn is NULL, + * we read and discard the appropriate amount of data from copystream. * copystream is the file stream to read the data from. * isbinary can be set from PQbinaryTuples(). - * The final status for the COPY is returned into *res (but note - * we already reported the error, if it's not a success result). + * The final status for the COPY is returned into *res; but note + * we already reported the error, if it's not a success result. + * Also, if conn is NULL then *res is not touched. * * result is true if successful, false if not. */ @@ -514,6 +516,12 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res) char buf[COPYBUFSIZ]; bool showprompt; + /* We want to prompt if interactive input ... */ + showprompt = isatty(fileno(copystream)); + /* ... but if we're just discarding data, don't bother the user at all */ + if (showprompt && !conn) + return true; + /* * Establish longjmp destination for exiting from wait-for-input. (This is * only effective while sigint_interrupt_enabled is TRUE.) @@ -523,24 +531,19 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res) /* got here with longjmp */ /* Terminate data transfer */ - PQputCopyEnd(conn, - (PQprotocolVersion(conn) < 3) ? NULL : - _("canceled by user")); + if (conn) + PQputCopyEnd(conn, + (PQprotocolVersion(conn) < 3) ? NULL : + _("canceled by user")); OK = false; goto copyin_cleanup; } - /* Prompt if interactive input */ - if (isatty(fileno(copystream))) - { - showprompt = true; - if (!pset.quiet) - puts(_("Enter data to be copied followed by a newline.\n" - "End with a backslash and a period on a line by itself, or an EOF signal.")); - } - else - showprompt = false; + /* Issue initial prompt if interactive input */ + if (showprompt && !pset.quiet) + puts(_("Enter data to be copied followed by a newline.\n" + "End with a backslash and a period on a line by itself, or an EOF signal.")); OK = true; @@ -569,7 +572,7 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res) if (buflen <= 0) break; - if (PQputCopyData(conn, buf, buflen) <= 0) + if (conn && PQputCopyData(conn, buf, buflen) <= 0) { OK = false; break; @@ -667,7 +670,7 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res) */ if (buflen >= COPYBUFSIZ - 5 || (copydone && buflen > 0)) { - if (PQputCopyData(conn, buf, buflen) <= 0) + if (conn && PQputCopyData(conn, buf, buflen) <= 0) { OK = false; break; @@ -688,7 +691,8 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res) * keep the version checks just in case you're using a pre-v14 libpq.so at * runtime) */ - if (PQputCopyEnd(conn, + if (conn && + PQputCopyEnd(conn, (OK || PQprotocolVersion(conn) < 3) ? NULL : _("aborted because of read failure")) <= 0) OK = false; @@ -705,6 +709,10 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res) */ clearerr(copystream); + /* Done if we don't have a connection to clean up */ + if (!conn) + return OK; + /* * Check command status and return to normal libpq state. * diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index dd25d2fe7b8..31f12f89439 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -999,16 +999,20 @@ listAllDbs(const char *pattern, bool verbose) appendPQExpBufferStr(&buf, " "); printACLColumn(&buf, "d.datacl"); if (verbose) + { appendPQExpBuffer(&buf, ",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n" + " %s" " THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))\n" " ELSE 'No Access'\n" " END as \"%s\"" ",\n t.spcname as \"%s\"" ",\n pg_catalog.shobj_description(d.oid, 'pg_database') as \"%s\"", + pset.sversion >= 100000 ? "OR pg_catalog.pg_has_role('pg_read_all_stats', 'USAGE')\n" : "", gettext_noop("Size"), gettext_noop("Tablespace"), gettext_noop("Description")); + } appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_database d\n"); if (verbose) diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c index 0e0baa3540b..00c3507832f 100644 --- a/src/bin/psql/mainloop.c +++ b/src/bin/psql/mainloop.c @@ -436,7 +436,9 @@ MainLoop(FILE *source) /* execute query unless we're in an inactive \if branch */ if (conditional_active(cond_stack)) { - success = SendQuery(query_buf->data); + /* count_copy_from_stdin should be reliable here */ + success = SendQuery(query_buf->data, + psql_scan_count_copy_from_stdin(scan_state)); slashCmdStatus = success ? PSQL_CMD_SEND : PSQL_CMD_ERROR; pset.stmt_lineno = 1; @@ -448,9 +450,10 @@ MainLoop(FILE *source) query_buf = swap_buf; } resetPQExpBuffer(query_buf); + /* reset parsing state, too */ + psql_scan_reset(scan_state); added_nl_pos = -1; - /* we need not do psql_scan_reset() here */ } else { @@ -512,7 +515,7 @@ MainLoop(FILE *source) /* should not see this in inactive branch */ Assert(conditional_active(cond_stack)); - success = SendQuery(query_buf->data); + success = SendQuery(query_buf->data, -1); /* transfer query to previous_buf by pointer-swapping */ { @@ -522,8 +525,7 @@ MainLoop(FILE *source) query_buf = swap_buf; } resetPQExpBuffer(query_buf); - - /* flush any paren nesting info after forced send */ + /* reset parsing state, too */ psql_scan_reset(scan_state); } else if (slashCmdStatus == PSQL_CMD_NEWEDIT) @@ -610,7 +612,8 @@ MainLoop(FILE *source) /* execute query unless we're in an inactive \if branch */ if (conditional_active(cond_stack)) { - success = SendQuery(query_buf->data); + success = SendQuery(query_buf->data, + psql_scan_count_copy_from_stdin(scan_state)); } else { diff --git a/src/bin/psql/po/de.po b/src/bin/psql/po/de.po index a48d230996e..d7e7e435a0e 100644 --- a/src/bin/psql/po/de.po +++ b/src/bin/psql/po/de.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-04 18:48+0000\n" -"PO-Revision-Date: 2026-02-05 14:19+0100\n" +"POT-Creation-Date: 2026-08-08 06:19+0000\n" +"PO-Revision-Date: 2026-08-04 13:51+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -84,17 +84,27 @@ msgstr "%s() fehlgeschlagen: %m" msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -154,27 +164,27 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu Zeile)" msgstr[1] "(%lu Zeilen)" -#: ../../fe_utils/print.c:3154 +#: ../../fe_utils/print.c:3155 #, c-format msgid "Interrupted\n" msgstr "Unterbrochen\n" -#: ../../fe_utils/print.c:3188 +#: ../../fe_utils/print.c:3189 #, c-format msgid "Cannot print table contents: number of cells % is equal to or exceeds maximum %zu.\n" msgstr "Kann Tabelleninhalt nicht ausgeben: Anzahl der Zellen % ist gleich oder überschreitet Maximum %zu.\n" -#: ../../fe_utils/print.c:3229 +#: ../../fe_utils/print.c:3230 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kann keinen weiteren Spaltenkopf zur Tabelle hinzufügen: Spaltenzahl %d überschritten.\n" -#: ../../fe_utils/print.c:3272 +#: ../../fe_utils/print.c:3273 #, c-format msgid "Cannot add cell to table content: total cell count of % exceeded.\n" msgstr "Kann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl % überschritten.\n" -#: ../../fe_utils/print.c:3530 +#: ../../fe_utils/print.c:3531 #, c-format msgid "invalid output format (internal error): %d" msgstr "ungültiges Ausgabeformat (interner Fehler): %d" @@ -245,15 +255,15 @@ msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden.\n" msgid "Connection Information" msgstr "Verbindungsinformationen" -#: command.c:840 describe.c:4722 +#: command.c:840 describe.c:4726 msgid "Parameter" msgstr "Parameter" -#: command.c:841 describe.c:4723 +#: command.c:841 describe.c:4727 msgid "Value" msgstr "Wert" -#: command.c:844 describe.c:3874 +#: command.c:844 describe.c:3878 msgid "Database" msgstr "Datenbank" @@ -277,7 +287,7 @@ msgstr "Host" msgid "Server Port" msgstr "Serverport" -#: command.c:882 describe.c:246 describe.c:3615 describe.c:3955 +#: command.c:882 describe.c:246 describe.c:3619 describe.c:3959 msgid "Options" msgstr "Optionen" @@ -363,7 +373,7 @@ msgstr "%s: ungültiger Kodierungsname oder Umwandlungsprozedur nicht gefunden" #: command.c:1656 command.c:2596 command.c:4074 command.c:4272 command.c:6511 #: common.c:233 common.c:282 common.c:455 common.c:1178 common.c:1196 -#: common.c:1264 common.c:1376 common.c:1414 common.c:1705 common.c:1785 +#: common.c:1264 common.c:1376 common.c:1414 common.c:1718 common.c:1798 #: copy.c:486 copy.c:731 large_obj.c:157 large_obj.c:192 large_obj.c:254 #: startup.c:309 #, c-format @@ -990,7 +1000,7 @@ msgstr "Zeit: %.3f ms (%02d:%02d:%06.3f)\n" msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Zeit: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:661 common.c:718 common.c:1130 describe.c:6371 +#: common.c:661 common.c:718 common.c:1130 describe.c:6375 #, c-format msgid "You are currently not connected to a database." msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden." @@ -1046,14 +1056,14 @@ msgstr "ANWEISUNG: %s" msgid "unexpected transaction status (%d)" msgstr "unerwarteter Transaktionsstatus (%d)" -#: common.c:1398 describe.c:2064 +#: common.c:1398 describe.c:2068 msgid "Column" msgstr "Spalte" -#: common.c:1399 describe.c:176 describe.c:363 describe.c:381 describe.c:1082 -#: describe.c:1244 describe.c:1774 describe.c:1798 describe.c:2065 -#: describe.c:4058 describe.c:4322 describe.c:4569 describe.c:4729 -#: describe.c:6005 +#: common.c:1399 describe.c:176 describe.c:363 describe.c:381 describe.c:1086 +#: describe.c:1248 describe.c:1778 describe.c:1802 describe.c:2069 +#: describe.c:4062 describe.c:4326 describe.c:4573 describe.c:4733 +#: describe.c:6009 msgid "Type" msgstr "Typ" @@ -1062,22 +1072,22 @@ msgstr "Typ" msgid "The command has no result, or the result has no columns.\n" msgstr "Der Befehl hat kein Ergebnis oder das Ergebnis hat keine Spalten.\n" -#: common.c:1670 +#: common.c:1683 #, c-format msgid "No pending results to get" msgstr "Keine unerledigten Ergebnisse abzuholen" -#: common.c:1748 +#: common.c:1761 #, c-format msgid "fetching results in chunked mode failed" msgstr "Empfangen der Ergebnisse im Chunked-Modus fehlgeschlagen" -#: common.c:1797 +#: common.c:1810 #, c-format msgid "Pipeline aborted, command did not run" msgstr "Pipeline abgebrochen, Befehl wurde nicht ausgeführt" -#: common.c:1893 +#: common.c:1906 #, c-format msgid "COPY in a pipeline is not supported, aborting connection" msgstr "COPY in einer Pipeline wird nicht unterstützt, Verbindung wird abgebrochen" @@ -1187,21 +1197,21 @@ msgstr "\\crosstabview: zweideutiger Spaltenname: »%s«" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: Spaltenname nicht gefunden: »%s«" -#: describe.c:94 describe.c:343 describe.c:650 describe.c:827 describe.c:1074 -#: describe.c:1231 describe.c:1307 describe.c:4047 describe.c:4309 -#: describe.c:4567 describe.c:4648 describe.c:4880 describe.c:5092 -#: describe.c:5341 describe.c:5582 describe.c:5651 describe.c:5662 -#: describe.c:5718 describe.c:6117 describe.c:6197 +#: describe.c:94 describe.c:343 describe.c:650 describe.c:827 describe.c:1078 +#: describe.c:1235 describe.c:1311 describe.c:4051 describe.c:4313 +#: describe.c:4571 describe.c:4652 describe.c:4884 describe.c:5096 +#: describe.c:5345 describe.c:5586 describe.c:5655 describe.c:5666 +#: describe.c:5722 describe.c:6121 describe.c:6201 msgid "Schema" msgstr "Schema" #: describe.c:95 describe.c:173 describe.c:234 describe.c:344 describe.c:651 -#: describe.c:828 describe.c:959 describe.c:1075 describe.c:1308 -#: describe.c:4048 describe.c:4310 describe.c:4484 describe.c:4568 -#: describe.c:4649 describe.c:4810 describe.c:4881 describe.c:5093 -#: describe.c:5214 describe.c:5342 describe.c:5583 describe.c:5652 -#: describe.c:5663 describe.c:5719 describe.c:5916 describe.c:5986 -#: describe.c:6194 describe.c:6422 describe.c:6768 +#: describe.c:828 describe.c:959 describe.c:1079 describe.c:1312 +#: describe.c:4052 describe.c:4314 describe.c:4488 describe.c:4572 +#: describe.c:4653 describe.c:4814 describe.c:4885 describe.c:5097 +#: describe.c:5218 describe.c:5346 describe.c:5587 describe.c:5656 +#: describe.c:5667 describe.c:5723 describe.c:5920 describe.c:5990 +#: describe.c:6198 describe.c:6426 describe.c:6772 msgid "Name" msgstr "Name" @@ -1214,13 +1224,13 @@ msgid "Argument data types" msgstr "Argumentdatentypen" #: describe.c:105 describe.c:112 describe.c:184 describe.c:248 describe.c:433 -#: describe.c:682 describe.c:847 describe.c:1011 describe.c:1310 -#: describe.c:2085 describe.c:3774 describe.c:4106 describe.c:4363 -#: describe.c:4508 describe.c:4581 describe.c:4658 describe.c:4823 -#: describe.c:5005 describe.c:5151 describe.c:5223 describe.c:5343 -#: describe.c:5493 describe.c:5534 describe.c:5599 describe.c:5655 -#: describe.c:5664 describe.c:5720 describe.c:5934 describe.c:6008 -#: describe.c:6131 describe.c:6198 describe.c:7304 +#: describe.c:682 describe.c:847 describe.c:1014 describe.c:1314 +#: describe.c:2089 describe.c:3778 describe.c:4110 describe.c:4367 +#: describe.c:4512 describe.c:4585 describe.c:4662 describe.c:4827 +#: describe.c:5009 describe.c:5155 describe.c:5227 describe.c:5347 +#: describe.c:5497 describe.c:5538 describe.c:5603 describe.c:5659 +#: describe.c:5668 describe.c:5724 describe.c:5938 describe.c:6012 +#: describe.c:6135 describe.c:6202 describe.c:7308 msgid "Description" msgstr "Beschreibung" @@ -1237,11 +1247,11 @@ msgstr "Der Server (Version %s) unterstützt keine Zugriffsmethoden." msgid "Index" msgstr "Index" -#: describe.c:175 describe.c:4066 describe.c:4335 describe.c:6118 +#: describe.c:175 describe.c:4070 describe.c:4339 describe.c:6122 msgid "Table" msgstr "Tabelle" -#: describe.c:183 describe.c:5918 +#: describe.c:183 describe.c:5922 msgid "Handler" msgstr "Handler" @@ -1249,11 +1259,11 @@ msgstr "Handler" msgid "List of access methods" msgstr "Liste der Zugriffsmethoden" -#: describe.c:235 describe.c:416 describe.c:675 describe.c:960 describe.c:1230 -#: describe.c:4059 describe.c:4311 describe.c:4485 describe.c:4812 -#: describe.c:5215 describe.c:5917 describe.c:5987 describe.c:6423 -#: describe.c:6644 describe.c:6769 describe.c:6939 describe.c:7024 -#: describe.c:7292 +#: describe.c:235 describe.c:416 describe.c:675 describe.c:960 describe.c:1234 +#: describe.c:4063 describe.c:4315 describe.c:4489 describe.c:4816 +#: describe.c:5219 describe.c:5921 describe.c:5991 describe.c:6427 +#: describe.c:6648 describe.c:6773 describe.c:6943 describe.c:7028 +#: describe.c:7296 msgid "Owner" msgstr "Eigentümer" @@ -1261,7 +1271,7 @@ msgstr "Eigentümer" msgid "Location" msgstr "Pfad" -#: describe.c:247 describe.c:673 describe.c:1009 describe.c:4105 +#: describe.c:247 describe.c:673 describe.c:1012 describe.c:4109 msgid "Size" msgstr "Größe" @@ -1296,7 +1306,7 @@ msgstr "Proz" msgid "func" msgstr "Funk" -#: describe.c:379 describe.c:1440 +#: describe.c:379 describe.c:1444 msgid "trigger" msgstr "Trigger" @@ -1344,19 +1354,19 @@ msgstr "invoker" msgid "Security" msgstr "Sicherheit" -#: describe.c:420 describe.c:838 describe.c:1779 describe.c:1803 -#: describe.c:1932 describe.c:4652 describe.c:4993 describe.c:5002 -#: describe.c:5140 describe.c:5145 describe.c:6927 describe.c:7126 +#: describe.c:420 describe.c:838 describe.c:1783 describe.c:1807 +#: describe.c:1936 describe.c:4656 describe.c:4997 describe.c:5006 +#: describe.c:5144 describe.c:5149 describe.c:6931 describe.c:7130 msgid "yes" msgstr "ja" -#: describe.c:421 describe.c:839 describe.c:1780 describe.c:1804 -#: describe.c:1933 describe.c:4652 describe.c:4990 describe.c:5003 -#: describe.c:5140 describe.c:6928 describe.c:7127 +#: describe.c:421 describe.c:839 describe.c:1784 describe.c:1808 +#: describe.c:1937 describe.c:4656 describe.c:4994 describe.c:5007 +#: describe.c:5144 describe.c:6932 describe.c:7131 msgid "no" msgstr "nein" -#: describe.c:422 describe.c:840 describe.c:5004 describe.c:7128 +#: describe.c:422 describe.c:840 describe.c:5008 describe.c:7132 msgid "Leakproof?" msgstr "Leakproof?" @@ -1392,8 +1402,8 @@ msgstr "Rechter Typ" msgid "Result type" msgstr "Ergebnistyp" -#: describe.c:837 describe.c:4818 describe.c:4982 describe.c:5492 -#: describe.c:7222 describe.c:7226 +#: describe.c:837 describe.c:4822 describe.c:4986 describe.c:5496 +#: describe.c:7226 describe.c:7230 msgid "Function" msgstr "Funktion" @@ -1409,1030 +1419,1030 @@ msgstr "Kodierung" msgid "Locale Provider" msgstr "Locale-Provider" -#: describe.c:977 describe.c:5112 +#: describe.c:977 describe.c:5116 msgid "Collate" msgstr "Sortierfolge" -#: describe.c:978 describe.c:5113 +#: describe.c:978 describe.c:5117 msgid "Ctype" msgstr "Zeichentyp" -#: describe.c:982 describe.c:986 describe.c:990 describe.c:5118 describe.c:5122 -#: describe.c:5126 +#: describe.c:982 describe.c:986 describe.c:990 describe.c:5122 describe.c:5126 +#: describe.c:5130 msgid "Locale" msgstr "Locale" -#: describe.c:994 describe.c:998 describe.c:5131 describe.c:5135 +#: describe.c:994 describe.c:998 describe.c:5135 describe.c:5139 msgid "ICU Rules" msgstr "ICU-Regeln" -#: describe.c:1010 +#: describe.c:1013 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:1035 +#: describe.c:1039 msgid "List of databases" msgstr "Liste der Datenbanken" -#: describe.c:1076 describe.c:1233 describe.c:4049 +#: describe.c:1080 describe.c:1237 describe.c:4053 msgid "table" msgstr "Tabelle" -#: describe.c:1077 describe.c:4050 +#: describe.c:1081 describe.c:4054 msgid "view" msgstr "Sicht" -#: describe.c:1078 describe.c:4051 +#: describe.c:1082 describe.c:4055 msgid "materialized view" msgstr "materialisierte Sicht" -#: describe.c:1079 describe.c:1235 describe.c:4053 +#: describe.c:1083 describe.c:1239 describe.c:4057 msgid "sequence" msgstr "Sequenz" -#: describe.c:1080 describe.c:4055 +#: describe.c:1084 describe.c:4059 msgid "foreign table" msgstr "Fremdtabelle" -#: describe.c:1081 describe.c:4056 describe.c:4320 +#: describe.c:1085 describe.c:4060 describe.c:4324 msgid "partitioned table" msgstr "partitionierte Tabelle" -#: describe.c:1097 +#: describe.c:1101 msgid "Column privileges" msgstr "Spaltenprivilegien" -#: describe.c:1128 describe.c:1162 +#: describe.c:1132 describe.c:1166 msgid "Policies" msgstr "Policys" -#: describe.c:1190 describe.c:4735 describe.c:6884 +#: describe.c:1194 describe.c:4739 describe.c:6888 msgid "Access privileges" msgstr "Zugriffsprivilegien" -#: describe.c:1237 +#: describe.c:1241 msgid "function" msgstr "Funktion" -#: describe.c:1239 +#: describe.c:1243 msgid "type" msgstr "Typ" -#: describe.c:1241 +#: describe.c:1245 msgid "schema" msgstr "Schema" -#: describe.c:1243 +#: describe.c:1247 msgid "large object" msgstr "Large Object" -#: describe.c:1265 +#: describe.c:1269 msgid "Default access privileges" msgstr "Vorgegebene Zugriffsprivilegien" -#: describe.c:1309 +#: describe.c:1313 msgid "Object" msgstr "Objekt" -#: describe.c:1323 +#: describe.c:1327 msgid "table constraint" msgstr "Tabellen-Constraint" -#: describe.c:1347 +#: describe.c:1351 msgid "domain constraint" msgstr "Domänen-Constraint" -#: describe.c:1371 +#: describe.c:1375 msgid "operator class" msgstr "Operatorklasse" -#: describe.c:1395 +#: describe.c:1399 msgid "operator family" msgstr "Operatorfamilie" -#: describe.c:1418 +#: describe.c:1422 msgid "rule" msgstr "Rule" -#: describe.c:1463 +#: describe.c:1467 msgid "Object descriptions" msgstr "Objektbeschreibungen" -#: describe.c:1528 +#: describe.c:1532 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Keine Relation namens »%s« gefunden" -#: describe.c:1531 describe.c:4207 +#: describe.c:1535 describe.c:4211 #, c-format msgid "Did not find any relations." msgstr "Keine Relationen gefunden" -#: describe.c:1727 +#: describe.c:1731 #, c-format msgid "Did not find any relation with OID %s." msgstr "Keine Relation mit OID %s gefunden" -#: describe.c:1775 describe.c:1799 +#: describe.c:1779 describe.c:1803 msgid "Start" msgstr "Start" -#: describe.c:1776 describe.c:1800 +#: describe.c:1780 describe.c:1804 msgid "Minimum" msgstr "Minimum" -#: describe.c:1777 describe.c:1801 +#: describe.c:1781 describe.c:1805 msgid "Maximum" msgstr "Maximum" -#: describe.c:1778 describe.c:1802 +#: describe.c:1782 describe.c:1806 msgid "Increment" msgstr "Inkrement" -#: describe.c:1781 describe.c:1805 +#: describe.c:1785 describe.c:1809 msgid "Cycles?" msgstr "Zyklisch?" -#: describe.c:1782 describe.c:1806 +#: describe.c:1786 describe.c:1810 msgid "Cache" msgstr "Cache" -#: describe.c:1847 +#: describe.c:1851 #, c-format msgid "Owned by: %s" msgstr "Eigentümer: %s" -#: describe.c:1851 +#: describe.c:1855 #, c-format msgid "Sequence for identity column: %s" msgstr "Sequenz für Identitätsspalte: %s" -#: describe.c:1859 +#: describe.c:1863 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "Ungeloggte Sequenz »%s.%s«" -#: describe.c:1862 +#: describe.c:1866 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Sequenz »%s.%s«" -#: describe.c:2005 +#: describe.c:2009 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ungeloggte Tabelle »%s.%s«" -#: describe.c:2008 +#: describe.c:2012 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabelle »%s.%s«" -#: describe.c:2012 +#: describe.c:2016 #, c-format msgid "View \"%s.%s\"" msgstr "Sicht »%s.%s«" -#: describe.c:2016 +#: describe.c:2020 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialisierte Sicht »%s.%s«" -#: describe.c:2021 +#: describe.c:2025 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ungeloggter Index »%s.%s«" -#: describe.c:2024 +#: describe.c:2028 #, c-format msgid "Index \"%s.%s\"" msgstr "Index »%s.%s«" -#: describe.c:2029 +#: describe.c:2033 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ungeloggter partitionierter Index »%s.%s«" -#: describe.c:2032 +#: describe.c:2036 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Partitionierter Index »%s.%s«" -#: describe.c:2036 +#: describe.c:2040 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-Tabelle »%s.%s«" -#: describe.c:2040 +#: describe.c:2044 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Zusammengesetzter Typ »%s.%s«" -#: describe.c:2044 +#: describe.c:2048 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Fremdtabelle »%s.%s«" -#: describe.c:2049 +#: describe.c:2053 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Ungeloggte partitionierte Tabelle »%s.%s«" -#: describe.c:2052 +#: describe.c:2056 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Partitionierte Tabelle »%s.%s«" -#: describe.c:2068 describe.c:4570 +#: describe.c:2072 describe.c:4574 msgid "Collation" msgstr "Sortierfolge" -#: describe.c:2069 describe.c:4571 +#: describe.c:2073 describe.c:4575 msgid "Nullable" msgstr "NULL erlaubt?" -#: describe.c:2070 describe.c:4572 +#: describe.c:2074 describe.c:4576 msgid "Default" msgstr "Vorgabewert" -#: describe.c:2073 +#: describe.c:2077 msgid "Key?" msgstr "Schlüssel?" -#: describe.c:2075 describe.c:4888 describe.c:4899 +#: describe.c:2079 describe.c:4892 describe.c:4903 msgid "Definition" msgstr "Definition" -#: describe.c:2077 describe.c:5933 describe.c:6007 describe.c:6072 -#: describe.c:6130 +#: describe.c:2081 describe.c:5937 describe.c:6011 describe.c:6076 +#: describe.c:6134 msgid "FDW options" msgstr "FDW-Optionen" -#: describe.c:2079 +#: describe.c:2083 msgid "Storage" msgstr "Speicherung" -#: describe.c:2081 +#: describe.c:2085 msgid "Compression" msgstr "Kompression" -#: describe.c:2083 +#: describe.c:2087 msgid "Stats target" msgstr "Statistikziel" -#: describe.c:2225 +#: describe.c:2229 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition von: %s %s%s" -#: describe.c:2238 +#: describe.c:2242 msgid "No partition constraint" msgstr "Kein Partitions-Constraint" -#: describe.c:2240 +#: describe.c:2244 #, c-format msgid "Partition constraint: %s" msgstr "Partitions-Constraint: %s" -#: describe.c:2264 +#: describe.c:2268 #, c-format msgid "Partition key: %s" msgstr "Partitionsschlüssel: %s" -#: describe.c:2290 +#: describe.c:2294 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Gehört zu Tabelle: »%s.%s«" -#: describe.c:2363 +#: describe.c:2367 msgid "primary key, " msgstr "Primärschlüssel, " -#: describe.c:2366 +#: describe.c:2370 msgid "unique" msgstr "unique" -#: describe.c:2368 +#: describe.c:2372 msgid " nulls not distinct" msgstr " nulls not distinct" -#: describe.c:2369 +#: describe.c:2373 msgid ", " msgstr ", " -#: describe.c:2376 +#: describe.c:2380 #, c-format msgid "for table \"%s.%s\"" msgstr "für Tabelle »%s.%s«" -#: describe.c:2380 +#: describe.c:2384 #, c-format msgid ", predicate (%s)" msgstr ", Prädikat (%s)" -#: describe.c:2383 +#: describe.c:2387 msgid ", clustered" msgstr ", geclustert" -#: describe.c:2386 +#: describe.c:2390 msgid ", invalid" msgstr ", ungültig" -#: describe.c:2389 +#: describe.c:2393 msgid ", deferrable" msgstr ", DEFERRABLE" -#: describe.c:2392 +#: describe.c:2396 msgid ", initially deferred" msgstr ", INITIALLY DEFERRED" -#: describe.c:2395 +#: describe.c:2399 msgid ", replica identity" msgstr ", Replika-Identität" -#: describe.c:2456 +#: describe.c:2460 msgid "Indexes:" msgstr "Indexe:" -#: describe.c:2544 +#: describe.c:2548 msgid "Check constraints:" msgstr "Check-Constraints:" -#: describe.c:2605 +#: describe.c:2609 msgid "Foreign-key constraints:" msgstr "Fremdschlüssel-Constraints:" -#: describe.c:2664 +#: describe.c:2668 msgid "Referenced by:" msgstr "Fremdschlüsselverweise von:" -#: describe.c:2713 +#: describe.c:2717 msgid "Policies:" msgstr "Policys:" -#: describe.c:2716 +#: describe.c:2720 msgid "Policies (forced row security enabled):" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen):" -#: describe.c:2719 +#: describe.c:2723 msgid "Policies (row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene eingeschaltet): (keine)" -#: describe.c:2722 +#: describe.c:2726 msgid "Policies (forced row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen): (keine)" -#: describe.c:2725 +#: describe.c:2729 msgid "Policies (row security disabled):" msgstr "Policys (Sicherheit auf Zeilenebene ausgeschaltet):" -#: describe.c:2785 describe.c:2890 +#: describe.c:2789 describe.c:2894 msgid "Statistics objects:" msgstr "Statistikobjekte:" -#: describe.c:2992 describe.c:3192 +#: describe.c:2996 describe.c:3196 msgid "Rules:" msgstr "Regeln:" -#: describe.c:2995 +#: describe.c:2999 msgid "Disabled rules:" msgstr "Abgeschaltete Regeln:" -#: describe.c:2998 +#: describe.c:3002 msgid "Rules firing always:" msgstr "Regeln, die immer aktiv werden:" -#: describe.c:3001 +#: describe.c:3005 msgid "Rules firing on replica only:" msgstr "Regeln, die nur im Replikat aktiv werden:" -#: describe.c:3080 describe.c:5276 +#: describe.c:3084 describe.c:5280 msgid "Publications:" msgstr "Publikationen:" -#: describe.c:3127 +#: describe.c:3131 msgid "Not-null constraints:" msgstr "Not-Null-Constraints:" -#: describe.c:3141 +#: describe.c:3145 msgid " (local, inherited)" -msgstr "(lokal, geerbt)" +msgstr " (lokal, geerbt)" -#: describe.c:3142 +#: describe.c:3146 msgid " (inherited)" -msgstr "(geerbt)" +msgstr " (geerbt)" -#: describe.c:3175 +#: describe.c:3179 msgid "View definition:" msgstr "Sichtdefinition:" -#: describe.c:3338 +#: describe.c:3342 msgid "Triggers:" msgstr "Trigger:" -#: describe.c:3341 +#: describe.c:3345 msgid "Disabled user triggers:" msgstr "Abgeschaltete Benutzer-Trigger:" -#: describe.c:3344 +#: describe.c:3348 msgid "Disabled internal triggers:" msgstr "Abgeschaltete interne Trigger:" -#: describe.c:3347 +#: describe.c:3351 msgid "Triggers firing always:" msgstr "Trigger, die immer aktiv werden:" -#: describe.c:3350 +#: describe.c:3354 msgid "Triggers firing on replica only:" msgstr "Trigger, die nur im Replikat aktiv werden:" -#: describe.c:3421 +#: describe.c:3425 #, c-format msgid "Server: %s" msgstr "Server: %s" -#: describe.c:3429 +#: describe.c:3433 #, c-format msgid "FDW options: (%s)" msgstr "FDW-Optionen: (%s)" -#: describe.c:3450 +#: describe.c:3454 msgid "Inherits" msgstr "Erbt von" -#: describe.c:3515 +#: describe.c:3519 #, c-format msgid "Number of partitions: %d" msgstr "Anzahl Partitionen: %d" -#: describe.c:3524 +#: describe.c:3528 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Anzahl Partitionen: %d (Mit \\d+ alle anzeigen.)" -#: describe.c:3526 +#: describe.c:3530 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Anzahl Kindtabellen: %d (Mit \\d+ alle anzeigen.)" -#: describe.c:3533 +#: describe.c:3537 msgid "Child tables" msgstr "Kindtabellen" -#: describe.c:3533 +#: describe.c:3537 msgid "Partitions" msgstr "Partitionen" -#: describe.c:3566 +#: describe.c:3570 #, c-format msgid "Typed table of type: %s" msgstr "Getypte Tabelle vom Typ: %s" -#: describe.c:3584 +#: describe.c:3588 msgid "Replica Identity" msgstr "Replika-Identität" -#: describe.c:3597 +#: describe.c:3601 msgid "Has OIDs: yes" msgstr "Hat OIDs: ja" -#: describe.c:3606 +#: describe.c:3610 #, c-format msgid "Access method: %s" msgstr "Zugriffsmethode: %s" -#: describe.c:3683 +#: describe.c:3687 #, c-format msgid "Tablespace: \"%s\"" msgstr "Tablespace: »%s«" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3695 +#: describe.c:3699 #, c-format msgid ", tablespace \"%s\"" msgstr ", Tablespace »%s«" -#: describe.c:3768 +#: describe.c:3772 msgid "List of roles" msgstr "Liste der Rollen" -#: describe.c:3770 describe.c:3938 +#: describe.c:3774 describe.c:3942 msgid "Role name" msgstr "Rollenname" -#: describe.c:3771 +#: describe.c:3775 msgid "Attributes" msgstr "Attribute" -#: describe.c:3782 +#: describe.c:3786 msgid "Superuser" msgstr "Superuser" -#: describe.c:3785 +#: describe.c:3789 msgid "No inheritance" msgstr "keine Vererbung" -#: describe.c:3788 +#: describe.c:3792 msgid "Create role" msgstr "Rolle erzeugen" -#: describe.c:3791 +#: describe.c:3795 msgid "Create DB" msgstr "DB erzeugen" -#: describe.c:3794 +#: describe.c:3798 msgid "Cannot login" msgstr "kann nicht einloggen" -#: describe.c:3797 +#: describe.c:3801 msgid "Replication" msgstr "Replikation" -#: describe.c:3801 +#: describe.c:3805 msgid "Bypass RLS" msgstr "Bypass RLS" -#: describe.c:3810 +#: describe.c:3814 msgid "No connections" msgstr "keine Verbindungen" -#: describe.c:3812 +#: describe.c:3816 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d Verbindung" msgstr[1] "%d Verbindungen" -#: describe.c:3822 +#: describe.c:3826 msgid "Password valid until " msgstr "Passwort gültig bis " -#: describe.c:3873 +#: describe.c:3877 msgid "Role" msgstr "Rolle" -#: describe.c:3875 +#: describe.c:3879 msgid "Settings" msgstr "Einstellung" -#: describe.c:3899 +#: describe.c:3903 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Keine Einstellungen für Rolle »%s« und Datenbank »%s« gefunden" -#: describe.c:3902 +#: describe.c:3906 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Keine Einstellungen für Rolle »%s« gefunden" -#: describe.c:3905 +#: describe.c:3909 #, c-format msgid "Did not find any settings." msgstr "Keine Einstellungen gefunden" -#: describe.c:3909 +#: describe.c:3913 msgid "List of settings" msgstr "Liste der Einstellungen" -#: describe.c:3939 +#: describe.c:3943 msgid "Member of" msgstr "Mitglied von" -#: describe.c:3956 +#: describe.c:3960 msgid "Grantor" msgstr "Grantor" -#: describe.c:3982 +#: describe.c:3986 msgid "List of role grants" msgstr "Liste der Rollen-Grants" -#: describe.c:4052 +#: describe.c:4056 msgid "index" msgstr "Index" -#: describe.c:4054 +#: describe.c:4058 msgid "TOAST table" msgstr "TOAST-Tabelle" -#: describe.c:4057 describe.c:4321 +#: describe.c:4061 describe.c:4325 msgid "partitioned index" msgstr "partitionierter Index" -#: describe.c:4081 +#: describe.c:4085 msgid "permanent" msgstr "permanent" -#: describe.c:4082 +#: describe.c:4086 msgid "temporary" msgstr "temporär" -#: describe.c:4083 +#: describe.c:4087 msgid "unlogged" msgstr "ungeloggt" -#: describe.c:4084 +#: describe.c:4088 msgid "Persistence" msgstr "Persistenz" -#: describe.c:4100 describe.c:4344 +#: describe.c:4104 describe.c:4348 msgid "Access method" msgstr "Zugriffsmethode" -#: describe.c:4180 +#: describe.c:4184 #, c-format msgid "Did not find any relations named \"%s\"." msgstr "Keine Relationen namens »%s« gefunden" -#: describe.c:4183 +#: describe.c:4187 #, c-format msgid "Did not find any tables named \"%s\"." msgstr "Keine Tabellen namens »%s« gefunden" -#: describe.c:4186 +#: describe.c:4190 #, c-format msgid "Did not find any indexes named \"%s\"." msgstr "Keine Indexe namens »%s« gefunden" -#: describe.c:4189 +#: describe.c:4193 #, c-format msgid "Did not find any views named \"%s\"." msgstr "Keine Sichten namens »%s« gefunden" -#: describe.c:4192 +#: describe.c:4196 #, c-format msgid "Did not find any materialized views named \"%s\"." msgstr "Keine materialisierten Sichten namens »%s« gefunden" -#: describe.c:4195 +#: describe.c:4199 #, c-format msgid "Did not find any sequences named \"%s\"." msgstr "Keine Sequenzen namens »%s« gefunden" -#: describe.c:4198 +#: describe.c:4202 #, c-format msgid "Did not find any foreign tables named \"%s\"." msgstr "Keine Fremdtabellen namens »%s« gefunden" -#: describe.c:4209 +#: describe.c:4213 #, c-format msgid "Did not find any tables." msgstr "Keine Tabellen gefunden" -#: describe.c:4211 +#: describe.c:4215 #, c-format msgid "Did not find any indexes." msgstr "Keine Indexe gefunden" -#: describe.c:4213 +#: describe.c:4217 #, c-format msgid "Did not find any views." msgstr "Keine Sichten gefunden" -#: describe.c:4215 +#: describe.c:4219 #, c-format msgid "Did not find any materialized views." msgstr "Keine materialisierten Sichten gefunden" -#: describe.c:4217 +#: describe.c:4221 #, c-format msgid "Did not find any sequences." msgstr "Keine Sequenzen gefunden" -#: describe.c:4219 +#: describe.c:4223 #, c-format msgid "Did not find any foreign tables." msgstr "Keine Fremdtabellen gefunden" -#: describe.c:4227 +#: describe.c:4231 msgid "List of relations" msgstr "Liste der Relationen" -#: describe.c:4228 +#: describe.c:4232 msgid "List of tables" msgstr "Liste der Tabellen" -#: describe.c:4229 +#: describe.c:4233 msgid "List of indexes" msgstr "Liste der Indexe" -#: describe.c:4230 +#: describe.c:4234 msgid "List of views" msgstr "Liste der Sichten" -#: describe.c:4231 +#: describe.c:4235 msgid "List of materialized views" msgstr "Liste der materialisierten Sichten" -#: describe.c:4232 +#: describe.c:4236 msgid "List of sequences" msgstr "Liste der Sequenzen" -#: describe.c:4233 describe.c:6163 +#: describe.c:4237 describe.c:6167 msgid "List of foreign tables" msgstr "Liste der Fremdtabellen" -#: describe.c:4282 +#: describe.c:4286 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Der Server (Version %s) unterstützt keine deklarative Tabellenpartitionierung." -#: describe.c:4293 +#: describe.c:4297 msgid "List of partitioned indexes" msgstr "Liste partitionierter Indexe" -#: describe.c:4295 +#: describe.c:4299 msgid "List of partitioned tables" msgstr "Liste partitionierte Tabellen" -#: describe.c:4299 +#: describe.c:4303 msgid "List of partitioned relations" msgstr "Liste partitionierter Relationen" -#: describe.c:4330 +#: describe.c:4334 msgid "Parent name" msgstr "Elternname" -#: describe.c:4350 +#: describe.c:4354 msgid "Leaf partition size" msgstr "Größe Leaf-Partition" -#: describe.c:4353 describe.c:4359 +#: describe.c:4357 describe.c:4363 msgid "Total size" msgstr "Gesamtgröße" -#: describe.c:4486 +#: describe.c:4490 msgid "Trusted" msgstr "Vertraut" -#: describe.c:4495 +#: describe.c:4499 msgid "Internal language" msgstr "Interne Sprache" -#: describe.c:4496 +#: describe.c:4500 msgid "Call handler" msgstr "Call-Handler" -#: describe.c:4497 describe.c:5919 +#: describe.c:4501 describe.c:5923 msgid "Validator" msgstr "Validator" -#: describe.c:4498 +#: describe.c:4502 msgid "Inline handler" msgstr "Inline-Handler" -#: describe.c:4532 +#: describe.c:4536 msgid "List of languages" msgstr "Liste der Sprachen" -#: describe.c:4573 +#: describe.c:4577 msgid "Check" msgstr "Check" -#: describe.c:4616 +#: describe.c:4620 msgid "List of domains" msgstr "Liste der Domänen" -#: describe.c:4650 +#: describe.c:4654 msgid "Source" msgstr "Quelle" -#: describe.c:4651 +#: describe.c:4655 msgid "Destination" msgstr "Ziel" -#: describe.c:4653 describe.c:6929 +#: describe.c:4657 describe.c:6933 msgid "Default?" msgstr "Standard?" -#: describe.c:4694 +#: describe.c:4698 msgid "List of conversions" msgstr "Liste der Konversionen" -#: describe.c:4730 +#: describe.c:4734 msgid "Context" msgstr "Kontext" -#: describe.c:4762 +#: describe.c:4766 msgid "List of configuration parameters" msgstr "Liste der Konfigurationsparameter" -#: describe.c:4764 +#: describe.c:4768 msgid "List of non-default configuration parameters" msgstr "Liste der veränderten Konfigurationsparameter" -#: describe.c:4791 +#: describe.c:4795 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Der Server (Version %s) unterstützt keine Ereignistrigger." -#: describe.c:4811 +#: describe.c:4815 msgid "Event" msgstr "Ereignis" -#: describe.c:4813 +#: describe.c:4817 msgid "enabled" msgstr "eingeschaltet" -#: describe.c:4814 +#: describe.c:4818 msgid "replica" msgstr "Replika" -#: describe.c:4815 +#: describe.c:4819 msgid "always" msgstr "immer" -#: describe.c:4816 +#: describe.c:4820 msgid "disabled" msgstr "ausgeschaltet" -#: describe.c:4817 describe.c:6770 +#: describe.c:4821 describe.c:6774 msgid "Enabled" msgstr "Eingeschaltet" -#: describe.c:4819 +#: describe.c:4823 msgid "Tags" msgstr "Tags" -#: describe.c:4842 +#: describe.c:4846 msgid "List of event triggers" msgstr "Liste der Ereignistrigger" -#: describe.c:4869 +#: describe.c:4873 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Der Server (Version %s) unterstützt keine erweiterten Statistiken." -#: describe.c:4906 +#: describe.c:4910 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4907 +#: describe.c:4911 msgid "Dependencies" msgstr "Abhängigkeiten" -#: describe.c:4917 +#: describe.c:4921 msgid "MCV" msgstr "MCV" -#: describe.c:4940 +#: describe.c:4944 msgid "List of extended statistics" msgstr "Liste der erweiterten Statistiken" -#: describe.c:4967 +#: describe.c:4971 msgid "Source type" msgstr "Quelltyp" -#: describe.c:4968 +#: describe.c:4972 msgid "Target type" msgstr "Zieltyp" -#: describe.c:4992 +#: describe.c:4996 msgid "in assignment" msgstr "in Zuweisung" -#: describe.c:4994 +#: describe.c:4998 msgid "Implicit?" msgstr "Implizit?" -#: describe.c:5058 +#: describe.c:5062 msgid "List of casts" msgstr "Liste der Typumwandlungen" -#: describe.c:5103 describe.c:5107 +#: describe.c:5107 describe.c:5111 msgid "Provider" msgstr "Provider" -#: describe.c:5141 describe.c:5146 +#: describe.c:5145 describe.c:5150 msgid "Deterministic?" msgstr "Deterministisch?" -#: describe.c:5185 +#: describe.c:5189 msgid "List of collations" msgstr "Liste der Sortierfolgen" -#: describe.c:5246 +#: describe.c:5250 msgid "List of schemas" msgstr "Liste der Schemas" -#: describe.c:5362 +#: describe.c:5366 msgid "List of text search parsers" msgstr "Liste der Textsucheparser" -#: describe.c:5412 +#: describe.c:5416 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Kein Textsucheparser namens »%s« gefunden" -#: describe.c:5415 +#: describe.c:5419 #, c-format msgid "Did not find any text search parsers." msgstr "Keine Textsucheparser gefunden" -#: describe.c:5490 +#: describe.c:5494 msgid "Start parse" msgstr "Parsen starten" -#: describe.c:5491 +#: describe.c:5495 msgid "Method" msgstr "Methode" -#: describe.c:5495 +#: describe.c:5499 msgid "Get next token" msgstr "Nächstes Token lesen" -#: describe.c:5497 +#: describe.c:5501 msgid "End parse" msgstr "Parsen beenden" -#: describe.c:5499 +#: describe.c:5503 msgid "Get headline" msgstr "Überschrift ermitteln" -#: describe.c:5501 +#: describe.c:5505 msgid "Get token types" msgstr "Tokentypen ermitteln" -#: describe.c:5511 +#: describe.c:5515 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Textsucheparser »%s.%s«" -#: describe.c:5514 +#: describe.c:5518 #, c-format msgid "Text search parser \"%s\"" msgstr "Textsucheparser »%s«" -#: describe.c:5533 +#: describe.c:5537 msgid "Token name" msgstr "Tokenname" -#: describe.c:5546 +#: describe.c:5550 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Tokentypen für Parser »%s.%s«" -#: describe.c:5549 +#: describe.c:5553 #, c-format msgid "Token types for parser \"%s\"" msgstr "Tokentypen für Parser »%s«" -#: describe.c:5593 +#: describe.c:5597 msgid "Template" msgstr "Vorlage" -#: describe.c:5594 +#: describe.c:5598 msgid "Init options" msgstr "Initialisierungsoptionen" -#: describe.c:5620 +#: describe.c:5624 msgid "List of text search dictionaries" msgstr "Liste der Textsuchewörterbücher" -#: describe.c:5653 +#: describe.c:5657 msgid "Init" msgstr "Init" -#: describe.c:5654 +#: describe.c:5658 msgid "Lexize" msgstr "Lexize" -#: describe.c:5685 +#: describe.c:5689 msgid "List of text search templates" msgstr "Liste der Textsuchevorlagen" -#: describe.c:5739 +#: describe.c:5743 msgid "List of text search configurations" msgstr "Liste der Textsuchekonfigurationen" -#: describe.c:5790 +#: describe.c:5794 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Keine Textsuchekonfiguration namens »%s« gefunden" -#: describe.c:5793 +#: describe.c:5797 #, c-format msgid "Did not find any text search configurations." msgstr "Keine Textsuchekonfigurationen gefunden" -#: describe.c:5859 +#: describe.c:5863 msgid "Token" msgstr "Token" -#: describe.c:5860 +#: describe.c:5864 msgid "Dictionaries" msgstr "Wörterbücher" -#: describe.c:5871 +#: describe.c:5875 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Textsuchekonfiguration »%s.%s«" -#: describe.c:5874 +#: describe.c:5878 #, c-format msgid "Text search configuration \"%s\"" msgstr "Textsuchekonfiguration »%s«" -#: describe.c:5878 +#: describe.c:5882 #, c-format msgid "" "\n" @@ -2441,7 +2451,7 @@ msgstr "" "\n" "Parser: »%s.%s«" -#: describe.c:5881 +#: describe.c:5885 #, c-format msgid "" "\n" @@ -2450,273 +2460,273 @@ msgstr "" "\n" "Parser: »%s«" -#: describe.c:5960 +#: describe.c:5964 msgid "List of foreign-data wrappers" msgstr "Liste der Fremddaten-Wrapper" -#: describe.c:5988 +#: describe.c:5992 msgid "Foreign-data wrapper" msgstr "Fremddaten-Wrapper" -#: describe.c:6006 describe.c:6195 +#: describe.c:6010 describe.c:6199 msgid "Version" msgstr "Version" -#: describe.c:6036 +#: describe.c:6040 msgid "List of foreign servers" msgstr "Liste der Fremdserver" -#: describe.c:6061 describe.c:6119 +#: describe.c:6065 describe.c:6123 msgid "Server" msgstr "Server" -#: describe.c:6062 +#: describe.c:6066 msgid "User name" msgstr "Benutzername" -#: describe.c:6091 +#: describe.c:6095 msgid "List of user mappings" msgstr "Liste der Benutzerabbildungen" -#: describe.c:6196 +#: describe.c:6200 msgid "Default version" msgstr "Standardversion" -#: describe.c:6217 +#: describe.c:6221 msgid "List of installed extensions" msgstr "Liste der installierten Erweiterungen" -#: describe.c:6265 +#: describe.c:6269 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Keine Erweiterung namens »%s« gefunden" -#: describe.c:6268 +#: describe.c:6272 #, c-format msgid "Did not find any extensions." msgstr "Keine Erweiterungen gefunden" -#: describe.c:6312 +#: describe.c:6316 msgid "Object description" msgstr "Objektbeschreibung" -#: describe.c:6321 +#: describe.c:6325 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objekte in Erweiterung »%s«" -#: describe.c:6362 +#: describe.c:6366 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" -#: describe.c:6376 +#: describe.c:6380 #, c-format msgid "cross-database references are not implemented: %s" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" -#: describe.c:6407 describe.c:6543 +#: describe.c:6411 describe.c:6547 #, c-format msgid "The server (version %s) does not support publications." msgstr "Der Server (Version %s) unterstützt keine Publikationen." -#: describe.c:6424 describe.c:6645 +#: describe.c:6428 describe.c:6649 msgid "All tables" msgstr "Alle Tabellen" -#: describe.c:6425 describe.c:6646 +#: describe.c:6429 describe.c:6650 msgid "Inserts" msgstr "Inserts" -#: describe.c:6426 describe.c:6647 +#: describe.c:6430 describe.c:6651 msgid "Updates" msgstr "Updates" -#: describe.c:6427 describe.c:6648 +#: describe.c:6431 describe.c:6652 msgid "Deletes" msgstr "Deletes" -#: describe.c:6431 describe.c:6650 +#: describe.c:6435 describe.c:6654 msgid "Truncates" msgstr "Truncates" -#: describe.c:6440 describe.c:6574 describe.c:6652 +#: describe.c:6444 describe.c:6578 describe.c:6656 msgid "Generated columns" msgstr "Generierte Spalten" -#: describe.c:6444 describe.c:6654 +#: describe.c:6448 describe.c:6658 msgid "Via root" msgstr "Über Wurzel" -#: describe.c:6465 +#: describe.c:6469 msgid "List of publications" msgstr "Liste der Publikationen" -#: describe.c:6612 +#: describe.c:6616 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Keine Publikation namens »%s« gefunden" -#: describe.c:6615 +#: describe.c:6619 #, c-format msgid "Did not find any publications." msgstr "Keine Publikationen gefunden" -#: describe.c:6641 +#: describe.c:6645 #, c-format msgid "Publication %s" msgstr "Publikation %s" -#: describe.c:6698 +#: describe.c:6702 msgid "Tables:" msgstr "Tabellen:" -#: describe.c:6710 +#: describe.c:6714 msgid "Tables from schemas:" msgstr "Tabellen aus Schemas:" -#: describe.c:6755 +#: describe.c:6759 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Der Server (Version %s) unterstützt keine Subskriptionen." -#: describe.c:6771 +#: describe.c:6775 msgid "Publication" msgstr "Publikation" -#: describe.c:6780 +#: describe.c:6784 msgid "Binary" msgstr "Binär" -#: describe.c:6789 describe.c:6793 +#: describe.c:6793 describe.c:6797 msgid "Streaming" msgstr "Streaming" -#: describe.c:6801 +#: describe.c:6805 msgid "Two-phase commit" msgstr "Two-Phase-Commit" -#: describe.c:6802 +#: describe.c:6806 msgid "Disable on error" msgstr "Bei Fehler abschalten" -#: describe.c:6809 +#: describe.c:6813 msgid "Origin" msgstr "Herkunft" -#: describe.c:6810 +#: describe.c:6814 msgid "Password required" msgstr "Passwort nötig" -#: describe.c:6811 +#: describe.c:6815 msgid "Run as owner?" msgstr "Als Eigentümer ausführen?" -#: describe.c:6816 +#: describe.c:6820 msgid "Failover" msgstr "Failover" -#: describe.c:6821 +#: describe.c:6825 msgid "Synchronous commit" msgstr "Synchroner Commit" -#: describe.c:6822 +#: describe.c:6826 msgid "Conninfo" msgstr "Verbindungsinfo" -#: describe.c:6828 +#: describe.c:6832 msgid "Skip LSN" msgstr "Skip-LSN" -#: describe.c:6854 +#: describe.c:6858 msgid "List of subscriptions" msgstr "Liste der Subskriptionen" -#: describe.c:6883 +#: describe.c:6887 msgid "(none)" msgstr "(keine)" -#: describe.c:6923 describe.c:7018 describe.c:7110 describe.c:7213 +#: describe.c:6927 describe.c:7022 describe.c:7114 describe.c:7217 msgid "AM" msgstr "AM" -#: describe.c:6924 +#: describe.c:6928 msgid "Input type" msgstr "Eingabetyp" -#: describe.c:6925 +#: describe.c:6929 msgid "Storage type" msgstr "Storage-Typ" -#: describe.c:6926 +#: describe.c:6930 msgid "Operator class" msgstr "Operatorklasse" -#: describe.c:6938 describe.c:7019 describe.c:7111 describe.c:7214 +#: describe.c:6942 describe.c:7023 describe.c:7115 describe.c:7218 msgid "Operator family" msgstr "Operatorfamilie" -#: describe.c:6973 +#: describe.c:6977 msgid "List of operator classes" msgstr "Liste der Operatorklassen" -#: describe.c:7020 +#: describe.c:7024 msgid "Applicable types" msgstr "Passende Typen" -#: describe.c:7061 +#: describe.c:7065 msgid "List of operator families" msgstr "Liste der Operatorfamilien" -#: describe.c:7112 +#: describe.c:7116 msgid "Operator" msgstr "Operator" -#: describe.c:7113 +#: describe.c:7117 msgid "Strategy" msgstr "Strategie" -#: describe.c:7114 +#: describe.c:7118 msgid "ordering" msgstr "Sortieren" -#: describe.c:7115 +#: describe.c:7119 msgid "search" msgstr "Suchen" -#: describe.c:7116 +#: describe.c:7120 msgid "Purpose" msgstr "Zweck" -#: describe.c:7125 +#: describe.c:7129 msgid "Sort opfamily" msgstr "Sortier-Opfamilie" -#: describe.c:7168 +#: describe.c:7172 msgid "List of operators of operator families" msgstr "Liste der Operatoren in Operatorfamilien" -#: describe.c:7215 +#: describe.c:7219 msgid "Registered left type" msgstr "Registrierter linker Typ" -#: describe.c:7216 +#: describe.c:7220 msgid "Registered right type" msgstr "Registrierter rechter Typ" -#: describe.c:7217 +#: describe.c:7221 msgid "Number" msgstr "Nummer" -#: describe.c:7260 +#: describe.c:7264 msgid "List of support functions of operator families" msgstr "Liste der Unterstützungsfunktionen in Operatorfamilien" -#: describe.c:7291 +#: describe.c:7295 msgid "ID" msgstr "ID" -#: describe.c:7311 +#: describe.c:7315 msgid "Large objects" msgstr "Large Objects" @@ -6972,22 +6982,22 @@ msgstr "ungültiger Wert »%s« für Variable »%s«: muss größer als %.2f sei msgid "invalid value \"%s\" for variable \"%s\": must be less than %.2f" msgstr "ungültiger Wert »%s« für Variable »%s«: muss kleiner als %.2f sein" -#: variables.c:241 +#: variables.c:242 #, c-format msgid "value \"%s\" is out of range for variable \"%s\"" msgstr "Wert »%s« ist außerhalb des gültigen Bereichs für Variable »%s«" -#: variables.c:247 +#: variables.c:248 #, c-format msgid "invalid value \"%s\" for variable \"%s\"" msgstr "ungültiger Wert »%s« für Variable »%s«" -#: variables.c:294 +#: variables.c:295 #, c-format msgid "invalid variable name: \"%s\"" msgstr "ungültiger Variablenname: »%s«" -#: variables.c:488 +#: variables.c:489 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" diff --git a/src/bin/psql/po/ru.po b/src/bin/psql/po/ru.po index be1beb51489..74b62e3afab 100644 --- a/src/bin/psql/po/ru.po +++ b/src/bin/psql/po/ru.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:57+0200\n" -"PO-Revision-Date: 2026-02-07 09:12+0200\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:52+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -88,17 +88,27 @@ msgstr "ошибка в %s(): %m" msgid "out of memory" msgstr "нехватка памяти" -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -159,12 +169,12 @@ msgstr[0] "(%lu строка)" msgstr[1] "(%lu строки)" msgstr[2] "(%lu строк)" -#: ../../fe_utils/print.c:3154 +#: ../../fe_utils/print.c:3155 #, c-format msgid "Interrupted\n" msgstr "Прервано\n" -#: ../../fe_utils/print.c:3188 +#: ../../fe_utils/print.c:3189 #, c-format msgid "" "Cannot print table contents: number of cells % is equal to or " @@ -173,13 +183,13 @@ msgstr "" "Вывести содержимое таблицы нельзя: число ячеек % достигло максимума " "%zu.\n" -#: ../../fe_utils/print.c:3229 +#: ../../fe_utils/print.c:3230 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" "Ошибка добавления заголовка таблицы: превышен предел числа столбцов (%d).\n" -#: ../../fe_utils/print.c:3272 +#: ../../fe_utils/print.c:3273 #, c-format msgid "" "Cannot add cell to table content: total cell count of % exceeded.\n" @@ -187,7 +197,7 @@ msgstr "" "Ошибка добавления ячейки в таблицу: превышен предел числа ячеек " "(%).\n" -#: ../../fe_utils/print.c:3530 +#: ../../fe_utils/print.c:3531 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутренняя ошибка): %d" @@ -264,15 +274,15 @@ msgstr "В данный момент вы не подключены к базе msgid "Connection Information" msgstr "Информация о подключении" -#: command.c:840 describe.c:4722 +#: command.c:840 describe.c:4726 msgid "Parameter" msgstr "Параметр" -#: command.c:841 describe.c:4723 +#: command.c:841 describe.c:4727 msgid "Value" msgstr "Значение" -#: command.c:844 describe.c:3874 +#: command.c:844 describe.c:3878 msgid "Database" msgstr "БД" @@ -296,7 +306,7 @@ msgstr "Узел" msgid "Server Port" msgstr "Порт сервера" -#: command.c:882 describe.c:246 describe.c:3615 describe.c:3955 +#: command.c:882 describe.c:246 describe.c:3619 describe.c:3959 msgid "Options" msgstr "Параметры" @@ -384,7 +394,7 @@ msgstr "" #: command.c:1656 command.c:2596 command.c:4074 command.c:4272 command.c:6511 #: common.c:233 common.c:282 common.c:455 common.c:1178 common.c:1196 -#: common.c:1264 common.c:1376 common.c:1414 common.c:1705 common.c:1785 +#: common.c:1264 common.c:1376 common.c:1414 common.c:1718 common.c:1798 #: copy.c:486 copy.c:731 large_obj.c:157 large_obj.c:192 large_obj.c:254 #: startup.c:309 #, c-format @@ -1053,7 +1063,7 @@ msgstr "Время: %.3f мс (%02d:%02d:%06.3f)\n" msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Время: %.3f мс (%.0f д. %02d:%02d:%06.3f)\n" -#: common.c:661 common.c:718 common.c:1130 describe.c:6371 +#: common.c:661 common.c:718 common.c:1130 describe.c:6375 #, c-format msgid "You are currently not connected to a database." msgstr "В данный момент вы не подключены к базе данных." @@ -1119,14 +1129,14 @@ msgstr "ОПЕРАТОР: %s" msgid "unexpected transaction status (%d)" msgstr "неожиданное состояние транзакции (%d)" -#: common.c:1398 describe.c:2064 +#: common.c:1398 describe.c:2068 msgid "Column" msgstr "Столбец" -#: common.c:1399 describe.c:176 describe.c:363 describe.c:381 describe.c:1082 -#: describe.c:1244 describe.c:1774 describe.c:1798 describe.c:2065 -#: describe.c:4058 describe.c:4322 describe.c:4569 describe.c:4729 -#: describe.c:6005 +#: common.c:1399 describe.c:176 describe.c:363 describe.c:381 describe.c:1086 +#: describe.c:1248 describe.c:1778 describe.c:1802 describe.c:2069 +#: describe.c:4062 describe.c:4326 describe.c:4573 describe.c:4733 +#: describe.c:6009 msgid "Type" msgstr "Тип" @@ -1135,22 +1145,22 @@ msgstr "Тип" msgid "The command has no result, or the result has no columns.\n" msgstr "Команда не выдала результат, либо в результате нет столбцов.\n" -#: common.c:1670 +#: common.c:1683 #, c-format msgid "No pending results to get" msgstr "Нет результатов, ожидающих получения" -#: common.c:1748 +#: common.c:1761 #, c-format msgid "fetching results in chunked mode failed" msgstr "получить результаты в блочном режиме не удалось" -#: common.c:1797 +#: common.c:1810 #, c-format msgid "Pipeline aborted, command did not run" msgstr "Конвейерный режим прерван, команда не была выполнена" -#: common.c:1893 +#: common.c:1906 #, c-format msgid "COPY in a pipeline is not supported, aborting connection" msgstr "COPY в конвейерном режиме не поддерживается, соединение прерывается" @@ -1271,21 +1281,21 @@ msgstr "\\crosstabview: неоднозначное имя столбца: \"%s\" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: имя столбца не найдено: \"%s\"" -#: describe.c:94 describe.c:343 describe.c:650 describe.c:827 describe.c:1074 -#: describe.c:1231 describe.c:1307 describe.c:4047 describe.c:4309 -#: describe.c:4567 describe.c:4648 describe.c:4880 describe.c:5092 -#: describe.c:5341 describe.c:5582 describe.c:5651 describe.c:5662 -#: describe.c:5718 describe.c:6117 describe.c:6197 +#: describe.c:94 describe.c:343 describe.c:650 describe.c:827 describe.c:1078 +#: describe.c:1235 describe.c:1311 describe.c:4051 describe.c:4313 +#: describe.c:4571 describe.c:4652 describe.c:4884 describe.c:5096 +#: describe.c:5345 describe.c:5586 describe.c:5655 describe.c:5666 +#: describe.c:5722 describe.c:6121 describe.c:6201 msgid "Schema" msgstr "Схема" #: describe.c:95 describe.c:173 describe.c:234 describe.c:344 describe.c:651 -#: describe.c:828 describe.c:959 describe.c:1075 describe.c:1308 -#: describe.c:4048 describe.c:4310 describe.c:4484 describe.c:4568 -#: describe.c:4649 describe.c:4810 describe.c:4881 describe.c:5093 -#: describe.c:5214 describe.c:5342 describe.c:5583 describe.c:5652 -#: describe.c:5663 describe.c:5719 describe.c:5916 describe.c:5986 -#: describe.c:6194 describe.c:6422 describe.c:6768 +#: describe.c:828 describe.c:959 describe.c:1079 describe.c:1312 +#: describe.c:4052 describe.c:4314 describe.c:4488 describe.c:4572 +#: describe.c:4653 describe.c:4814 describe.c:4885 describe.c:5097 +#: describe.c:5218 describe.c:5346 describe.c:5587 describe.c:5656 +#: describe.c:5667 describe.c:5723 describe.c:5920 describe.c:5990 +#: describe.c:6198 describe.c:6426 describe.c:6772 msgid "Name" msgstr "Имя" @@ -1298,13 +1308,13 @@ msgid "Argument data types" msgstr "Типы данных аргументов" #: describe.c:105 describe.c:112 describe.c:184 describe.c:248 describe.c:433 -#: describe.c:682 describe.c:847 describe.c:1011 describe.c:1310 -#: describe.c:2085 describe.c:3774 describe.c:4106 describe.c:4363 -#: describe.c:4508 describe.c:4581 describe.c:4658 describe.c:4823 -#: describe.c:5005 describe.c:5151 describe.c:5223 describe.c:5343 -#: describe.c:5493 describe.c:5534 describe.c:5599 describe.c:5655 -#: describe.c:5664 describe.c:5720 describe.c:5934 describe.c:6008 -#: describe.c:6131 describe.c:6198 describe.c:7304 +#: describe.c:682 describe.c:847 describe.c:1014 describe.c:1314 +#: describe.c:2089 describe.c:3778 describe.c:4110 describe.c:4367 +#: describe.c:4512 describe.c:4585 describe.c:4662 describe.c:4827 +#: describe.c:5009 describe.c:5155 describe.c:5227 describe.c:5347 +#: describe.c:5497 describe.c:5538 describe.c:5603 describe.c:5659 +#: describe.c:5668 describe.c:5724 describe.c:5938 describe.c:6012 +#: describe.c:6135 describe.c:6202 describe.c:7308 msgid "Description" msgstr "Описание" @@ -1321,11 +1331,11 @@ msgstr "Сервер (версия %s) не поддерживает метод msgid "Index" msgstr "Индекс" -#: describe.c:175 describe.c:4066 describe.c:4335 describe.c:6118 +#: describe.c:175 describe.c:4070 describe.c:4339 describe.c:6122 msgid "Table" msgstr "Таблица" -#: describe.c:183 describe.c:5918 +#: describe.c:183 describe.c:5922 msgid "Handler" msgstr "Обработчик" @@ -1333,11 +1343,11 @@ msgstr "Обработчик" msgid "List of access methods" msgstr "Список методов доступа" -#: describe.c:235 describe.c:416 describe.c:675 describe.c:960 describe.c:1230 -#: describe.c:4059 describe.c:4311 describe.c:4485 describe.c:4812 -#: describe.c:5215 describe.c:5917 describe.c:5987 describe.c:6423 -#: describe.c:6644 describe.c:6769 describe.c:6939 describe.c:7024 -#: describe.c:7292 +#: describe.c:235 describe.c:416 describe.c:675 describe.c:960 describe.c:1234 +#: describe.c:4063 describe.c:4315 describe.c:4489 describe.c:4816 +#: describe.c:5219 describe.c:5921 describe.c:5991 describe.c:6427 +#: describe.c:6648 describe.c:6773 describe.c:6943 describe.c:7028 +#: describe.c:7296 msgid "Owner" msgstr "Владелец" @@ -1345,7 +1355,7 @@ msgstr "Владелец" msgid "Location" msgstr "Расположение" -#: describe.c:247 describe.c:673 describe.c:1009 describe.c:4105 +#: describe.c:247 describe.c:673 describe.c:1012 describe.c:4109 msgid "Size" msgstr "Размер" @@ -1382,7 +1392,7 @@ msgstr "проц." msgid "func" msgstr "функ." -#: describe.c:379 describe.c:1440 +#: describe.c:379 describe.c:1444 msgid "trigger" msgstr "триггерная" @@ -1430,19 +1440,19 @@ msgstr "вызывающего" msgid "Security" msgstr "Безопасность" -#: describe.c:420 describe.c:838 describe.c:1779 describe.c:1803 -#: describe.c:1932 describe.c:4652 describe.c:4993 describe.c:5002 -#: describe.c:5140 describe.c:5145 describe.c:6927 describe.c:7126 +#: describe.c:420 describe.c:838 describe.c:1783 describe.c:1807 +#: describe.c:1936 describe.c:4656 describe.c:4997 describe.c:5006 +#: describe.c:5144 describe.c:5149 describe.c:6931 describe.c:7130 msgid "yes" msgstr "да" -#: describe.c:421 describe.c:839 describe.c:1780 describe.c:1804 -#: describe.c:1933 describe.c:4652 describe.c:4990 describe.c:5003 -#: describe.c:5140 describe.c:6928 describe.c:7127 +#: describe.c:421 describe.c:839 describe.c:1784 describe.c:1808 +#: describe.c:1937 describe.c:4656 describe.c:4994 describe.c:5007 +#: describe.c:5144 describe.c:6932 describe.c:7131 msgid "no" msgstr "нет" -#: describe.c:422 describe.c:840 describe.c:5004 describe.c:7128 +#: describe.c:422 describe.c:840 describe.c:5008 describe.c:7132 msgid "Leakproof?" msgstr "Герметичная?" @@ -1478,8 +1488,8 @@ msgstr "Тип правого аргумента" msgid "Result type" msgstr "Результирующий тип" -#: describe.c:837 describe.c:4818 describe.c:4982 describe.c:5492 -#: describe.c:7222 describe.c:7226 +#: describe.c:837 describe.c:4822 describe.c:4986 describe.c:5496 +#: describe.c:7226 describe.c:7230 msgid "Function" msgstr "Функция" @@ -1495,557 +1505,557 @@ msgstr "Кодировка" msgid "Locale Provider" msgstr "Провайдер локали" -#: describe.c:977 describe.c:5112 +#: describe.c:977 describe.c:5116 msgid "Collate" msgstr "LC_COLLATE" -#: describe.c:978 describe.c:5113 +#: describe.c:978 describe.c:5117 msgid "Ctype" msgstr "LC_CTYPE" -#: describe.c:982 describe.c:986 describe.c:990 describe.c:5118 describe.c:5122 -#: describe.c:5126 +#: describe.c:982 describe.c:986 describe.c:990 describe.c:5122 describe.c:5126 +#: describe.c:5130 msgid "Locale" msgstr "Локаль" -#: describe.c:994 describe.c:998 describe.c:5131 describe.c:5135 +#: describe.c:994 describe.c:998 describe.c:5135 describe.c:5139 msgid "ICU Rules" msgstr "Правила ICU" -#: describe.c:1010 +#: describe.c:1013 msgid "Tablespace" msgstr "Табл. пространство" -#: describe.c:1035 +#: describe.c:1039 msgid "List of databases" msgstr "Список баз данных" -#: describe.c:1076 describe.c:1233 describe.c:4049 +#: describe.c:1080 describe.c:1237 describe.c:4053 msgid "table" msgstr "таблица" -#: describe.c:1077 describe.c:4050 +#: describe.c:1081 describe.c:4054 msgid "view" msgstr "представление" -#: describe.c:1078 describe.c:4051 +#: describe.c:1082 describe.c:4055 msgid "materialized view" msgstr "материализованное представление" -#: describe.c:1079 describe.c:1235 describe.c:4053 +#: describe.c:1083 describe.c:1239 describe.c:4057 msgid "sequence" msgstr "последовательность" -#: describe.c:1080 describe.c:4055 +#: describe.c:1084 describe.c:4059 msgid "foreign table" msgstr "сторонняя таблица" -#: describe.c:1081 describe.c:4056 describe.c:4320 +#: describe.c:1085 describe.c:4060 describe.c:4324 msgid "partitioned table" msgstr "секционированная таблица" -#: describe.c:1097 +#: describe.c:1101 msgid "Column privileges" msgstr "Права для столбцов" -#: describe.c:1128 describe.c:1162 +#: describe.c:1132 describe.c:1166 msgid "Policies" msgstr "Политики" -#: describe.c:1190 describe.c:4735 describe.c:6884 +#: describe.c:1194 describe.c:4739 describe.c:6888 msgid "Access privileges" msgstr "Права доступа" -#: describe.c:1237 +#: describe.c:1241 msgid "function" msgstr "функция" -#: describe.c:1239 +#: describe.c:1243 msgid "type" msgstr "тип" -#: describe.c:1241 +#: describe.c:1245 msgid "schema" msgstr "схема" -#: describe.c:1243 +#: describe.c:1247 msgid "large object" msgstr "большой объект" -#: describe.c:1265 +#: describe.c:1269 msgid "Default access privileges" msgstr "Права доступа по умолчанию" -#: describe.c:1309 +#: describe.c:1313 msgid "Object" msgstr "Объект" -#: describe.c:1323 +#: describe.c:1327 msgid "table constraint" msgstr "ограничение таблицы" -#: describe.c:1347 +#: describe.c:1351 msgid "domain constraint" msgstr "ограничение домена" -#: describe.c:1371 +#: describe.c:1375 msgid "operator class" msgstr "класс операторов" -#: describe.c:1395 +#: describe.c:1399 msgid "operator family" msgstr "семейство операторов" -#: describe.c:1418 +#: describe.c:1422 msgid "rule" msgstr "правило" -#: describe.c:1463 +#: describe.c:1467 msgid "Object descriptions" msgstr "Описание объекта" -#: describe.c:1528 +#: describe.c:1532 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Отношение \"%s\" не найдено." -#: describe.c:1531 describe.c:4207 +#: describe.c:1535 describe.c:4211 #, c-format msgid "Did not find any relations." msgstr "Отношения не найдены." -#: describe.c:1727 +#: describe.c:1731 #, c-format msgid "Did not find any relation with OID %s." msgstr "Отношение с OID %s не найдено." -#: describe.c:1775 describe.c:1799 +#: describe.c:1779 describe.c:1803 msgid "Start" msgstr "Начальное_значение" -#: describe.c:1776 describe.c:1800 +#: describe.c:1780 describe.c:1804 msgid "Minimum" msgstr "Минимум" -#: describe.c:1777 describe.c:1801 +#: describe.c:1781 describe.c:1805 msgid "Maximum" msgstr "Максимум" -#: describe.c:1778 describe.c:1802 +#: describe.c:1782 describe.c:1806 msgid "Increment" msgstr "Шаг" -#: describe.c:1781 describe.c:1805 +#: describe.c:1785 describe.c:1809 msgid "Cycles?" msgstr "Зацикливается?" -#: describe.c:1782 describe.c:1806 +#: describe.c:1786 describe.c:1810 msgid "Cache" msgstr "Кешируется" -#: describe.c:1847 +#: describe.c:1851 #, c-format msgid "Owned by: %s" msgstr "Владелец: %s" -#: describe.c:1851 +#: describe.c:1855 #, c-format msgid "Sequence for identity column: %s" msgstr "Последовательность для столбца идентификации: %s" -#: describe.c:1859 +#: describe.c:1863 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "Нежурналируемая последовательность \"%s.%s\"" -#: describe.c:1862 +#: describe.c:1866 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Последовательность \"%s.%s\"" -#: describe.c:2005 +#: describe.c:2009 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Нежурналируемая таблица \"%s.%s\"" -#: describe.c:2008 +#: describe.c:2012 #, c-format msgid "Table \"%s.%s\"" msgstr "Таблица \"%s.%s\"" -#: describe.c:2012 +#: describe.c:2016 #, c-format msgid "View \"%s.%s\"" msgstr "Представление \"%s.%s\"" -#: describe.c:2016 +#: describe.c:2020 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Материализованное представление \"%s.%s\"" -#: describe.c:2021 +#: describe.c:2025 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Нежурналируемый индекс \"%s.%s\"" -#: describe.c:2024 +#: describe.c:2028 #, c-format msgid "Index \"%s.%s\"" msgstr "Индекс \"%s.%s\"" -#: describe.c:2029 +#: describe.c:2033 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Нежурналируемый секционированный индекс \"%s.%s\"" -#: describe.c:2032 +#: describe.c:2036 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Секционированный индекс \"%s.%s\"" -#: describe.c:2036 +#: describe.c:2040 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-таблица \"%s.%s\"" -#: describe.c:2040 +#: describe.c:2044 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Составной тип \"%s.%s\"" -#: describe.c:2044 +#: describe.c:2048 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Сторонняя таблица \"%s.%s\"" -#: describe.c:2049 +#: describe.c:2053 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Нежурналируемая секционированная таблица \"%s.%s\"" -#: describe.c:2052 +#: describe.c:2056 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Секционированная таблица \"%s.%s\"" -#: describe.c:2068 describe.c:4570 +#: describe.c:2072 describe.c:4574 msgid "Collation" msgstr "Правило сортировки" -#: describe.c:2069 describe.c:4571 +#: describe.c:2073 describe.c:4575 msgid "Nullable" msgstr "Допустимость NULL" -#: describe.c:2070 describe.c:4572 +#: describe.c:2074 describe.c:4576 msgid "Default" msgstr "По умолчанию" -#: describe.c:2073 +#: describe.c:2077 msgid "Key?" msgstr "Ключевой?" -#: describe.c:2075 describe.c:4888 describe.c:4899 +#: describe.c:2079 describe.c:4892 describe.c:4903 msgid "Definition" msgstr "Определение" # well-spelled: ОСД -#: describe.c:2077 describe.c:5933 describe.c:6007 describe.c:6072 -#: describe.c:6130 +#: describe.c:2081 describe.c:5937 describe.c:6011 describe.c:6076 +#: describe.c:6134 msgid "FDW options" msgstr "Параметры ОСД" -#: describe.c:2079 +#: describe.c:2083 msgid "Storage" msgstr "Хранилище" -#: describe.c:2081 +#: describe.c:2085 msgid "Compression" msgstr "Сжатие" -#: describe.c:2083 +#: describe.c:2087 msgid "Stats target" msgstr "Цель для статистики" -#: describe.c:2225 +#: describe.c:2229 #, c-format msgid "Partition of: %s %s%s" msgstr "Секция: %s %s%s" -#: describe.c:2238 +#: describe.c:2242 msgid "No partition constraint" msgstr "Нет ограничения секции" -#: describe.c:2240 +#: describe.c:2244 #, c-format msgid "Partition constraint: %s" msgstr "Ограничение секции: %s" -#: describe.c:2264 +#: describe.c:2268 #, c-format msgid "Partition key: %s" msgstr "Ключ разбиения: %s" -#: describe.c:2290 +#: describe.c:2294 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Принадлежит таблице: \"%s.%s\"" -#: describe.c:2363 +#: describe.c:2367 msgid "primary key, " msgstr "первичный ключ, " -#: describe.c:2366 +#: describe.c:2370 msgid "unique" msgstr "уникальный" -#: describe.c:2368 +#: describe.c:2372 msgid " nulls not distinct" msgstr " null не различаются" -#: describe.c:2369 +#: describe.c:2373 msgid ", " msgstr ", " -#: describe.c:2376 +#: describe.c:2380 #, c-format msgid "for table \"%s.%s\"" msgstr "для таблицы \"%s.%s\"" -#: describe.c:2380 +#: describe.c:2384 #, c-format msgid ", predicate (%s)" msgstr ", предикат (%s)" -#: describe.c:2383 +#: describe.c:2387 msgid ", clustered" msgstr ", кластеризованный" -#: describe.c:2386 +#: describe.c:2390 msgid ", invalid" msgstr ", нерабочий" -#: describe.c:2389 +#: describe.c:2393 msgid ", deferrable" msgstr ", откладываемый" -#: describe.c:2392 +#: describe.c:2396 msgid ", initially deferred" msgstr ", изначально отложенный" -#: describe.c:2395 +#: describe.c:2399 msgid ", replica identity" msgstr ", репликационный" -#: describe.c:2456 +#: describe.c:2460 msgid "Indexes:" msgstr "Индексы:" -#: describe.c:2544 +#: describe.c:2548 msgid "Check constraints:" msgstr "Ограничения-проверки:" # TO REWVIEW -#: describe.c:2605 +#: describe.c:2609 msgid "Foreign-key constraints:" msgstr "Ограничения внешнего ключа:" -#: describe.c:2664 +#: describe.c:2668 msgid "Referenced by:" msgstr "Ссылки извне:" -#: describe.c:2713 +#: describe.c:2717 msgid "Policies:" msgstr "Политики:" -#: describe.c:2716 +#: describe.c:2720 msgid "Policies (forced row security enabled):" msgstr "Политики (усиленная защита строк включена):" -#: describe.c:2719 +#: describe.c:2723 msgid "Policies (row security enabled): (none)" msgstr "Политики (защита строк включена): (Нет)" -#: describe.c:2722 +#: describe.c:2726 msgid "Policies (forced row security enabled): (none)" msgstr "Политики (усиленная защита строк включена): (Нет)" -#: describe.c:2725 +#: describe.c:2729 msgid "Policies (row security disabled):" msgstr "Политики (защита строк выключена):" -#: describe.c:2785 describe.c:2890 +#: describe.c:2789 describe.c:2894 msgid "Statistics objects:" msgstr "Объекты статистики:" -#: describe.c:2992 describe.c:3192 +#: describe.c:2996 describe.c:3196 msgid "Rules:" msgstr "Правила:" -#: describe.c:2995 +#: describe.c:2999 msgid "Disabled rules:" msgstr "Отключённые правила:" -#: describe.c:2998 +#: describe.c:3002 msgid "Rules firing always:" msgstr "Правила, срабатывающие всегда:" -#: describe.c:3001 +#: describe.c:3005 msgid "Rules firing on replica only:" msgstr "Правила, срабатывающие только в реплике:" -#: describe.c:3080 describe.c:5276 +#: describe.c:3084 describe.c:5280 msgid "Publications:" msgstr "Публикации:" -#: describe.c:3127 +#: describe.c:3131 msgid "Not-null constraints:" msgstr "Ограничения NOT NULL:" -#: describe.c:3141 +#: describe.c:3145 msgid " (local, inherited)" msgstr " (локальное, не наследуется)" -#: describe.c:3142 +#: describe.c:3146 msgid " (inherited)" msgstr " (наследуется)" -#: describe.c:3175 +#: describe.c:3179 msgid "View definition:" msgstr "Определение представления:" -#: describe.c:3338 +#: describe.c:3342 msgid "Triggers:" msgstr "Триггеры:" -#: describe.c:3341 +#: describe.c:3345 msgid "Disabled user triggers:" msgstr "Отключённые пользовательские триггеры:" -#: describe.c:3344 +#: describe.c:3348 msgid "Disabled internal triggers:" msgstr "Отключённые внутренние триггеры:" -#: describe.c:3347 +#: describe.c:3351 msgid "Triggers firing always:" msgstr "Триггеры, срабатывающие всегда:" -#: describe.c:3350 +#: describe.c:3354 msgid "Triggers firing on replica only:" msgstr "Триггеры, срабатывающие только в реплике:" -#: describe.c:3421 +#: describe.c:3425 #, c-format msgid "Server: %s" msgstr "Сервер: %s" # well-spelled: ОСД -#: describe.c:3429 +#: describe.c:3433 #, c-format msgid "FDW options: (%s)" msgstr "Параметр ОСД: (%s)" -#: describe.c:3450 +#: describe.c:3454 msgid "Inherits" msgstr "Наследует" -#: describe.c:3515 +#: describe.c:3519 #, c-format msgid "Number of partitions: %d" msgstr "Число секций: %d" -#: describe.c:3524 +#: describe.c:3528 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Число секций: %d (чтобы просмотреть их, введите \\d+)" -#: describe.c:3526 +#: describe.c:3530 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Дочерних таблиц: %d (чтобы просмотреть и их, воспользуйтесь \\d+)" -#: describe.c:3533 +#: describe.c:3537 msgid "Child tables" msgstr "Дочерние таблицы" -#: describe.c:3533 +#: describe.c:3537 msgid "Partitions" msgstr "Секции" -#: describe.c:3566 +#: describe.c:3570 #, c-format msgid "Typed table of type: %s" msgstr "Типизированная таблица типа: %s" -#: describe.c:3584 +#: describe.c:3588 msgid "Replica Identity" msgstr "Идентификация реплики" -#: describe.c:3597 +#: describe.c:3601 msgid "Has OIDs: yes" msgstr "Содержит OID: да" -#: describe.c:3606 +#: describe.c:3610 #, c-format msgid "Access method: %s" msgstr "Метод доступа: %s" -#: describe.c:3683 +#: describe.c:3687 #, c-format msgid "Tablespace: \"%s\"" msgstr "Табличное пространство: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3695 +#: describe.c:3699 #, c-format msgid ", tablespace \"%s\"" msgstr ", табл. пространство \"%s\"" -#: describe.c:3768 +#: describe.c:3772 msgid "List of roles" msgstr "Список ролей" -#: describe.c:3770 describe.c:3938 +#: describe.c:3774 describe.c:3942 msgid "Role name" msgstr "Имя роли" -#: describe.c:3771 +#: describe.c:3775 msgid "Attributes" msgstr "Атрибуты" -#: describe.c:3782 +#: describe.c:3786 msgid "Superuser" msgstr "Суперпользователь" -#: describe.c:3785 +#: describe.c:3789 msgid "No inheritance" msgstr "Не наследуется" -#: describe.c:3788 +#: describe.c:3792 msgid "Create role" msgstr "Создаёт роли" -#: describe.c:3791 +#: describe.c:3795 msgid "Create DB" msgstr "Создаёт БД" -#: describe.c:3794 +#: describe.c:3798 msgid "Cannot login" msgstr "Вход запрещён" -#: describe.c:3797 +#: describe.c:3801 msgid "Replication" msgstr "Репликация" -#: describe.c:3801 +#: describe.c:3805 msgid "Bypass RLS" msgstr "Пропускать RLS" -#: describe.c:3810 +#: describe.c:3814 msgid "No connections" msgstr "Нет подключений" -#: describe.c:3812 +#: describe.c:3816 #, c-format msgid "%d connection" msgid_plural "%d connections" @@ -2053,478 +2063,478 @@ msgstr[0] "%d подключение" msgstr[1] "%d подключения" msgstr[2] "%d подключений" -#: describe.c:3822 +#: describe.c:3826 msgid "Password valid until " msgstr "Пароль действует до " -#: describe.c:3873 +#: describe.c:3877 msgid "Role" msgstr "Роль" -#: describe.c:3875 +#: describe.c:3879 msgid "Settings" msgstr "Параметры" -#: describe.c:3899 +#: describe.c:3903 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Параметры для роли \"%s\" и базы данных \"%s\" не найдены." -#: describe.c:3902 +#: describe.c:3906 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Параметры для роли \"%s\" не найдены." -#: describe.c:3905 +#: describe.c:3909 #, c-format msgid "Did not find any settings." msgstr "Никакие параметры не найдены." -#: describe.c:3909 +#: describe.c:3913 msgid "List of settings" msgstr "Список параметров" -#: describe.c:3939 +#: describe.c:3943 msgid "Member of" msgstr "Член ролей" -#: describe.c:3956 +#: describe.c:3960 msgid "Grantor" msgstr "Праводатель" -#: describe.c:3982 +#: describe.c:3986 msgid "List of role grants" msgstr "Список назначений ролей" -#: describe.c:4052 +#: describe.c:4056 msgid "index" msgstr "индекс" -#: describe.c:4054 +#: describe.c:4058 msgid "TOAST table" msgstr "TOAST-таблица" -#: describe.c:4057 describe.c:4321 +#: describe.c:4061 describe.c:4325 msgid "partitioned index" msgstr "секционированный индекс" -#: describe.c:4081 +#: describe.c:4085 msgid "permanent" msgstr "постоянное" -#: describe.c:4082 +#: describe.c:4086 msgid "temporary" msgstr "временное" -#: describe.c:4083 +#: describe.c:4087 msgid "unlogged" msgstr "нежурналируемое" -#: describe.c:4084 +#: describe.c:4088 msgid "Persistence" msgstr "Хранение" -#: describe.c:4100 describe.c:4344 +#: describe.c:4104 describe.c:4348 msgid "Access method" msgstr "Метод доступа" -#: describe.c:4180 +#: describe.c:4184 #, c-format msgid "Did not find any relations named \"%s\"." msgstr "Отношения с именем \"%s\" не найдены." -#: describe.c:4183 +#: describe.c:4187 #, c-format msgid "Did not find any tables named \"%s\"." msgstr "Таблицы с именем \"%s\" не найдены." -#: describe.c:4186 +#: describe.c:4190 #, c-format msgid "Did not find any indexes named \"%s\"." msgstr "Индексы с именем \"%s\" не найдены." -#: describe.c:4189 +#: describe.c:4193 #, c-format msgid "Did not find any views named \"%s\"." msgstr "Представления с именем \"%s\" не найдены." -#: describe.c:4192 +#: describe.c:4196 #, c-format msgid "Did not find any materialized views named \"%s\"." msgstr "Материализованные представления с именем \"%s\" не найдены." -#: describe.c:4195 +#: describe.c:4199 #, c-format msgid "Did not find any sequences named \"%s\"." msgstr "Последовательности с именем \"%s\" не найдены." -#: describe.c:4198 +#: describe.c:4202 #, c-format msgid "Did not find any foreign tables named \"%s\"." msgstr "Сторонние таблицы с именем \"%s\" не найдены." -#: describe.c:4209 +#: describe.c:4213 #, c-format msgid "Did not find any tables." msgstr "Никакие таблицы не найдены." -#: describe.c:4211 +#: describe.c:4215 #, c-format msgid "Did not find any indexes." msgstr "Никакие индексы не найдены." -#: describe.c:4213 +#: describe.c:4217 #, c-format msgid "Did not find any views." msgstr "Никакие представления не найдены." -#: describe.c:4215 +#: describe.c:4219 #, c-format msgid "Did not find any materialized views." msgstr "Никакие материализованные представления не найдены." -#: describe.c:4217 +#: describe.c:4221 #, c-format msgid "Did not find any sequences." msgstr "Никакие последовательности не найдены." -#: describe.c:4219 +#: describe.c:4223 #, c-format msgid "Did not find any foreign tables." msgstr "Никакие сторонние таблицы не найдены." -#: describe.c:4227 +#: describe.c:4231 msgid "List of relations" msgstr "Список отношений" -#: describe.c:4228 +#: describe.c:4232 msgid "List of tables" msgstr "Список таблиц" -#: describe.c:4229 +#: describe.c:4233 msgid "List of indexes" msgstr "Список индексов" -#: describe.c:4230 +#: describe.c:4234 msgid "List of views" msgstr "Список представлений" -#: describe.c:4231 +#: describe.c:4235 msgid "List of materialized views" msgstr "Список материализованных представлений" -#: describe.c:4232 +#: describe.c:4236 msgid "List of sequences" msgstr "Список последовательностей" -#: describe.c:4233 describe.c:6163 +#: describe.c:4237 describe.c:6167 msgid "List of foreign tables" msgstr "Список сторонних таблиц" -#: describe.c:4282 +#: describe.c:4286 #, c-format msgid "" "The server (version %s) does not support declarative table partitioning." msgstr "" "Сервер (версия %s) не поддерживает декларативное секционирование таблиц." -#: describe.c:4293 +#: describe.c:4297 msgid "List of partitioned indexes" msgstr "Список секционированных индексов" -#: describe.c:4295 +#: describe.c:4299 msgid "List of partitioned tables" msgstr "Список секционированных таблиц" -#: describe.c:4299 +#: describe.c:4303 msgid "List of partitioned relations" msgstr "Список секционированных отношений" -#: describe.c:4330 +#: describe.c:4334 msgid "Parent name" msgstr "Имя родителя" -#: describe.c:4350 +#: describe.c:4354 msgid "Leaf partition size" msgstr "Размер конечной секции" -#: describe.c:4353 describe.c:4359 +#: describe.c:4357 describe.c:4363 msgid "Total size" msgstr "Общий размер" -#: describe.c:4486 +#: describe.c:4490 msgid "Trusted" msgstr "Доверенный" -#: describe.c:4495 +#: describe.c:4499 msgid "Internal language" msgstr "Внутренний язык" -#: describe.c:4496 +#: describe.c:4500 msgid "Call handler" msgstr "Обработчик вызова" -#: describe.c:4497 describe.c:5919 +#: describe.c:4501 describe.c:5923 msgid "Validator" msgstr "Функция проверки" -#: describe.c:4498 +#: describe.c:4502 msgid "Inline handler" msgstr "Обработчик внедрённого кода" -#: describe.c:4532 +#: describe.c:4536 msgid "List of languages" msgstr "Список языков" -#: describe.c:4573 +#: describe.c:4577 msgid "Check" msgstr "Проверка" -#: describe.c:4616 +#: describe.c:4620 msgid "List of domains" msgstr "Список доменов" -#: describe.c:4650 +#: describe.c:4654 msgid "Source" msgstr "Источник" -#: describe.c:4651 +#: describe.c:4655 msgid "Destination" msgstr "Назначение" -#: describe.c:4653 describe.c:6929 +#: describe.c:4657 describe.c:6933 msgid "Default?" msgstr "По умолчанию?" -#: describe.c:4694 +#: describe.c:4698 msgid "List of conversions" msgstr "Список преобразований" -#: describe.c:4730 +#: describe.c:4734 msgid "Context" msgstr "Контекст" -#: describe.c:4762 +#: describe.c:4766 msgid "List of configuration parameters" msgstr "Список параметров конфигурации" -#: describe.c:4764 +#: describe.c:4768 msgid "List of non-default configuration parameters" msgstr "Список изменённых параметров конфигурации" -#: describe.c:4791 +#: describe.c:4795 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Сервер (версия %s) не поддерживает событийные триггеры." -#: describe.c:4811 +#: describe.c:4815 msgid "Event" msgstr "Событие" -#: describe.c:4813 +#: describe.c:4817 msgid "enabled" msgstr "включён" -#: describe.c:4814 +#: describe.c:4818 msgid "replica" msgstr "реплика" -#: describe.c:4815 +#: describe.c:4819 msgid "always" msgstr "всегда" -#: describe.c:4816 +#: describe.c:4820 msgid "disabled" msgstr "отключён" -#: describe.c:4817 describe.c:6770 +#: describe.c:4821 describe.c:6774 msgid "Enabled" msgstr "Включён" -#: describe.c:4819 +#: describe.c:4823 msgid "Tags" msgstr "Теги" -#: describe.c:4842 +#: describe.c:4846 msgid "List of event triggers" msgstr "Список событийных триггеров" -#: describe.c:4869 +#: describe.c:4873 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Сервер (версия %s) не поддерживает расширенные статистики." -#: describe.c:4906 +#: describe.c:4910 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4907 +#: describe.c:4911 msgid "Dependencies" msgstr "Зависимости" -#: describe.c:4917 +#: describe.c:4921 msgid "MCV" msgstr "MCV" -#: describe.c:4940 +#: describe.c:4944 msgid "List of extended statistics" msgstr "Список расширенных статистик" -#: describe.c:4967 +#: describe.c:4971 msgid "Source type" msgstr "Исходный тип" -#: describe.c:4968 +#: describe.c:4972 msgid "Target type" msgstr "Целевой тип" -#: describe.c:4992 +#: describe.c:4996 msgid "in assignment" msgstr "в присваивании" -#: describe.c:4994 +#: describe.c:4998 msgid "Implicit?" msgstr "Неявное?" -#: describe.c:5058 +#: describe.c:5062 msgid "List of casts" msgstr "Список приведений типов" -#: describe.c:5103 describe.c:5107 +#: describe.c:5107 describe.c:5111 msgid "Provider" msgstr "Провайдер" -#: describe.c:5141 describe.c:5146 +#: describe.c:5145 describe.c:5150 msgid "Deterministic?" msgstr "Детерминированное?" -#: describe.c:5185 +#: describe.c:5189 msgid "List of collations" msgstr "Список правил сортировки" -#: describe.c:5246 +#: describe.c:5250 msgid "List of schemas" msgstr "Список схем" -#: describe.c:5362 +#: describe.c:5366 msgid "List of text search parsers" msgstr "Список анализаторов текстового поиска" -#: describe.c:5412 +#: describe.c:5416 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Анализатор текстового поиска \"%s\" не найден." -#: describe.c:5415 +#: describe.c:5419 #, c-format msgid "Did not find any text search parsers." msgstr "Никакие анализаторы текстового поиска не найдены." -#: describe.c:5490 +#: describe.c:5494 msgid "Start parse" msgstr "Начало разбора" -#: describe.c:5491 +#: describe.c:5495 msgid "Method" msgstr "Метод" -#: describe.c:5495 +#: describe.c:5499 msgid "Get next token" msgstr "Получение следующего фрагмента" -#: describe.c:5497 +#: describe.c:5501 msgid "End parse" msgstr "Окончание разбора" -#: describe.c:5499 +#: describe.c:5503 msgid "Get headline" msgstr "Получение выдержки" -#: describe.c:5501 +#: describe.c:5505 msgid "Get token types" msgstr "Получение типов фрагментов" -#: describe.c:5511 +#: describe.c:5515 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Анализатор текстового поиска \"%s.%s\"" -#: describe.c:5514 +#: describe.c:5518 #, c-format msgid "Text search parser \"%s\"" msgstr "Анализатор текстового поиска \"%s\"" -#: describe.c:5533 +#: describe.c:5537 msgid "Token name" msgstr "Имя фрагмента" -#: describe.c:5546 +#: describe.c:5550 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Типы фрагментов для анализатора \"%s.%s\"" -#: describe.c:5549 +#: describe.c:5553 #, c-format msgid "Token types for parser \"%s\"" msgstr "Типы фрагментов для анализатора \"%s\"" -#: describe.c:5593 +#: describe.c:5597 msgid "Template" msgstr "Шаблон" -#: describe.c:5594 +#: describe.c:5598 msgid "Init options" msgstr "Параметры инициализации" -#: describe.c:5620 +#: describe.c:5624 msgid "List of text search dictionaries" msgstr "Список словарей текстового поиска" -#: describe.c:5653 +#: describe.c:5657 msgid "Init" msgstr "Инициализация" -#: describe.c:5654 +#: describe.c:5658 msgid "Lexize" msgstr "Выделение лексем" -#: describe.c:5685 +#: describe.c:5689 msgid "List of text search templates" msgstr "Список шаблонов текстового поиска" -#: describe.c:5739 +#: describe.c:5743 msgid "List of text search configurations" msgstr "Список конфигураций текстового поиска" -#: describe.c:5790 +#: describe.c:5794 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Конфигурация текстового поиска \"%s\" не найдена." -#: describe.c:5793 +#: describe.c:5797 #, c-format msgid "Did not find any text search configurations." msgstr "Никакие конфигурации текстового поиска не найдены." -#: describe.c:5859 +#: describe.c:5863 msgid "Token" msgstr "Фрагмент" -#: describe.c:5860 +#: describe.c:5864 msgid "Dictionaries" msgstr "Словари" -#: describe.c:5871 +#: describe.c:5875 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Конфигурация текстового поиска \"%s.%s\"" -#: describe.c:5874 +#: describe.c:5878 #, c-format msgid "Text search configuration \"%s\"" msgstr "Конфигурация текстового поиска \"%s\"" -#: describe.c:5878 +#: describe.c:5882 #, c-format msgid "" "\n" @@ -2533,7 +2543,7 @@ msgstr "" "\n" "Анализатор: \"%s.%s\"" -#: describe.c:5881 +#: describe.c:5885 #, c-format msgid "" "\n" @@ -2542,273 +2552,273 @@ msgstr "" "\n" "Анализатор: \"%s\"" -#: describe.c:5960 +#: describe.c:5964 msgid "List of foreign-data wrappers" msgstr "Список обёрток сторонних данных" -#: describe.c:5988 +#: describe.c:5992 msgid "Foreign-data wrapper" msgstr "Обёртка сторонних данных" -#: describe.c:6006 describe.c:6195 +#: describe.c:6010 describe.c:6199 msgid "Version" msgstr "Версия" -#: describe.c:6036 +#: describe.c:6040 msgid "List of foreign servers" msgstr "Список сторонних серверов" -#: describe.c:6061 describe.c:6119 +#: describe.c:6065 describe.c:6123 msgid "Server" msgstr "Сервер" -#: describe.c:6062 +#: describe.c:6066 msgid "User name" msgstr "Имя пользователя" -#: describe.c:6091 +#: describe.c:6095 msgid "List of user mappings" msgstr "Список сопоставлений пользователей" -#: describe.c:6196 +#: describe.c:6200 msgid "Default version" msgstr "Версия по умолчанию" -#: describe.c:6217 +#: describe.c:6221 msgid "List of installed extensions" msgstr "Список установленных расширений" -#: describe.c:6265 +#: describe.c:6269 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Расширение \"%s\" не найдено." -#: describe.c:6268 +#: describe.c:6272 #, c-format msgid "Did not find any extensions." msgstr "Никакие расширения не найдены." -#: describe.c:6312 +#: describe.c:6316 msgid "Object description" msgstr "Описание объекта" -#: describe.c:6321 +#: describe.c:6325 #, c-format msgid "Objects in extension \"%s\"" msgstr "Объекты в расширении \"%s\"" -#: describe.c:6362 +#: describe.c:6366 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное имя (слишком много компонентов): %s" -#: describe.c:6376 +#: describe.c:6380 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ссылки между базами не реализованы: %s" -#: describe.c:6407 describe.c:6543 +#: describe.c:6411 describe.c:6547 #, c-format msgid "The server (version %s) does not support publications." msgstr "Сервер (версия %s) не поддерживает публикации." -#: describe.c:6424 describe.c:6645 +#: describe.c:6428 describe.c:6649 msgid "All tables" msgstr "Все таблицы" -#: describe.c:6425 describe.c:6646 +#: describe.c:6429 describe.c:6650 msgid "Inserts" msgstr "Добавления" -#: describe.c:6426 describe.c:6647 +#: describe.c:6430 describe.c:6651 msgid "Updates" msgstr "Изменения" -#: describe.c:6427 describe.c:6648 +#: describe.c:6431 describe.c:6652 msgid "Deletes" msgstr "Удаления" -#: describe.c:6431 describe.c:6650 +#: describe.c:6435 describe.c:6654 msgid "Truncates" msgstr "Опустошения" -#: describe.c:6440 describe.c:6574 describe.c:6652 +#: describe.c:6444 describe.c:6578 describe.c:6656 msgid "Generated columns" msgstr "Генерируемые столбцы" -#: describe.c:6444 describe.c:6654 +#: describe.c:6448 describe.c:6658 msgid "Via root" msgstr "Через корень" -#: describe.c:6465 +#: describe.c:6469 msgid "List of publications" msgstr "Список публикаций" -#: describe.c:6612 +#: describe.c:6616 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Публикация \"%s\" не найдена." -#: describe.c:6615 +#: describe.c:6619 #, c-format msgid "Did not find any publications." msgstr "Никакие публикации не найдены." -#: describe.c:6641 +#: describe.c:6645 #, c-format msgid "Publication %s" msgstr "Публикация %s" -#: describe.c:6698 +#: describe.c:6702 msgid "Tables:" msgstr "Таблицы:" -#: describe.c:6710 +#: describe.c:6714 msgid "Tables from schemas:" msgstr "Таблицы из схем:" -#: describe.c:6755 +#: describe.c:6759 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Сервер (версия %s) не поддерживает подписки." -#: describe.c:6771 +#: describe.c:6775 msgid "Publication" msgstr "Публикация" -#: describe.c:6780 +#: describe.c:6784 msgid "Binary" msgstr "Бинарная" -#: describe.c:6789 describe.c:6793 +#: describe.c:6793 describe.c:6797 msgid "Streaming" msgstr "Потоковая" -#: describe.c:6801 +#: describe.c:6805 msgid "Two-phase commit" msgstr "Двухфазная фиксация" -#: describe.c:6802 +#: describe.c:6806 msgid "Disable on error" msgstr "Отключается при ошибке" -#: describe.c:6809 +#: describe.c:6813 msgid "Origin" msgstr "Источник" -#: describe.c:6810 +#: describe.c:6814 msgid "Password required" msgstr "Требуется пароль" -#: describe.c:6811 +#: describe.c:6815 msgid "Run as owner?" msgstr "Использовать владельца?" -#: describe.c:6816 +#: describe.c:6820 msgid "Failover" msgstr "Переносимая" -#: describe.c:6821 +#: describe.c:6825 msgid "Synchronous commit" msgstr "Синхронная фиксация" -#: describe.c:6822 +#: describe.c:6826 msgid "Conninfo" msgstr "Строка подключения" -#: describe.c:6828 +#: describe.c:6832 msgid "Skip LSN" msgstr "Пропустить LSN" -#: describe.c:6854 +#: describe.c:6858 msgid "List of subscriptions" msgstr "Список подписок" -#: describe.c:6883 +#: describe.c:6887 msgid "(none)" msgstr "(нет)" -#: describe.c:6923 describe.c:7018 describe.c:7110 describe.c:7213 +#: describe.c:6927 describe.c:7022 describe.c:7114 describe.c:7217 msgid "AM" msgstr "МД" -#: describe.c:6924 +#: describe.c:6928 msgid "Input type" msgstr "Входной тип" -#: describe.c:6925 +#: describe.c:6929 msgid "Storage type" msgstr "Тип хранения" -#: describe.c:6926 +#: describe.c:6930 msgid "Operator class" msgstr "Класс операторов" -#: describe.c:6938 describe.c:7019 describe.c:7111 describe.c:7214 +#: describe.c:6942 describe.c:7023 describe.c:7115 describe.c:7218 msgid "Operator family" msgstr "Семейство операторов" -#: describe.c:6973 +#: describe.c:6977 msgid "List of operator classes" msgstr "Список классов операторов" -#: describe.c:7020 +#: describe.c:7024 msgid "Applicable types" msgstr "Применимые типы" -#: describe.c:7061 +#: describe.c:7065 msgid "List of operator families" msgstr "Список семейств операторов" -#: describe.c:7112 +#: describe.c:7116 msgid "Operator" msgstr "Оператор" -#: describe.c:7113 +#: describe.c:7117 msgid "Strategy" msgstr "Стратегия" -#: describe.c:7114 +#: describe.c:7118 msgid "ordering" msgstr "сортировка" -#: describe.c:7115 +#: describe.c:7119 msgid "search" msgstr "поиск" -#: describe.c:7116 +#: describe.c:7120 msgid "Purpose" msgstr "Назначение" -#: describe.c:7125 +#: describe.c:7129 msgid "Sort opfamily" msgstr "Семейство для сортировки" -#: describe.c:7168 +#: describe.c:7172 msgid "List of operators of operator families" msgstr "Список операторов из семейств операторов" -#: describe.c:7215 +#: describe.c:7219 msgid "Registered left type" msgstr "Зарегистрированный левый тип" -#: describe.c:7216 +#: describe.c:7220 msgid "Registered right type" msgstr "Зарегистрированный правый тип" -#: describe.c:7217 +#: describe.c:7221 msgid "Number" msgstr "Номер" -#: describe.c:7260 +#: describe.c:7264 msgid "List of support functions of operator families" msgstr "Список опорных функций из семейств операторов" -#: describe.c:7291 +#: describe.c:7295 msgid "ID" msgstr "ID" -#: describe.c:7311 +#: describe.c:7315 msgid "Large objects" msgstr "Большие объекты" @@ -7258,22 +7268,22 @@ msgstr "" "значение \"%s\" не подходит для переменной \"%s\"; оно должно быть меньше " "%.2f" -#: variables.c:241 +#: variables.c:242 #, c-format msgid "value \"%s\" is out of range for variable \"%s\"" msgstr "значение \"%s\" вне диапазона для переменной \"%s\"" -#: variables.c:247 +#: variables.c:248 #, c-format msgid "invalid value \"%s\" for variable \"%s\"" msgstr "неправильное значение \"%s\" для переменной \"%s\"" -#: variables.c:294 +#: variables.c:295 #, c-format msgid "invalid variable name: \"%s\"" msgstr "неправильное имя переменной: \"%s\"" -#: variables.c:488 +#: variables.c:489 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" diff --git a/src/bin/psql/psqlscanslash.h b/src/bin/psql/psqlscanslash.h index 497e7e2c963..45e0854de6f 100644 --- a/src/bin/psql/psqlscanslash.h +++ b/src/bin/psql/psqlscanslash.h @@ -31,6 +31,11 @@ extern char *psql_scan_slash_option(PsqlScanState state, extern void psql_scan_slash_command_end(PsqlScanState state); +extern PsqlScanStateSave *psql_scan_get_lex_state(PsqlScanState state); + +extern void psql_scan_set_lex_state(PsqlScanState state, + const PsqlScanStateSave *lex_state); + extern int psql_scan_get_paren_depth(PsqlScanState state); extern void psql_scan_set_paren_depth(PsqlScanState state, int depth); diff --git a/src/bin/psql/psqlscanslash.l b/src/bin/psql/psqlscanslash.l index ae7602a61df..f51cb85db91 100644 --- a/src/bin/psql/psqlscanslash.l +++ b/src/bin/psql/psqlscanslash.l @@ -704,8 +704,48 @@ psql_scan_slash_command_end(PsqlScanState state) psql_scan_reselect_sql_lexer(state); } +/* + * Save current lexer state + * + * Relevant parts of the state are returned in a pg_malloc'd struct. + * It is caller's responsibility to free the struct eventually. + */ +PsqlScanStateSave * +psql_scan_get_lex_state(PsqlScanState state) +{ + PsqlScanStateSave *lex_state = pg_malloc_object(PsqlScanStateSave); + StaticAssertDecl(sizeof(lex_state->init_idents) == sizeof(state->init_idents), + "init_idents array lengths must match"); + + lex_state->paren_depth = state->paren_depth; + lex_state->begin_depth = state->begin_depth; + lex_state->copy_stdin_count = state->copy_stdin_count; + lex_state->init_idents_count = state->init_idents_count; + memcpy(lex_state->init_idents, state->init_idents, + sizeof(lex_state->init_idents)); + return lex_state; +} + +/* + * Restore lexer state to what it was when saved + */ +void +psql_scan_set_lex_state(PsqlScanState state, + const PsqlScanStateSave *lex_state) +{ + state->paren_depth = lex_state->paren_depth; + state->begin_depth = lex_state->begin_depth; + state->copy_stdin_count = lex_state->copy_stdin_count; + state->init_idents_count = lex_state->init_idents_count; + memcpy(state->init_idents, lex_state->init_idents, + sizeof(state->init_idents)); +} + /* * Fetch current paren nesting depth + * + * (These functions are obsolete, and kept around only to avoid API/ABI + * breakage in the back branches.) */ int psql_scan_get_paren_depth(PsqlScanState state) diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index 249b6aa5169..5dc10702a50 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -386,7 +386,7 @@ main(int argc, char *argv[]) if (pset.echo == PSQL_ECHO_ALL) puts(cell->val); - successResult = SendQuery(cell->val) + successResult = SendQuery(cell->val, -1) ? EXIT_SUCCESS : EXIT_FAILURE; } else if (cell->action == ACT_SINGLE_SLASH) diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index cf07a9dbd5e..a335acca68c 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -451,6 +451,8 @@ sub psql_fails_like '\set WATCH_INTERVAL 1e500', qr/is out of range/, 'WATCH_INTERVAL variable is out of range'); +psql_like($node, '\echo :WATCH_INTERVAL', + qr/^2$/m, 'WATCH_INTERVAL variable was not altered'); # Test \g output piped into a program. # The program is perl -pe '' to simply copy the input to the output. @@ -537,4 +539,11 @@ sub psql_fails_like qr/backslash commands are restricted; only \\unrestrict is allowed/, 'meta-command in restrict mode fails'); +psql_fails_like( + $node, + qq{\\restrict test +\\unrestrict `echo test`}, + qr/wrong key/, + '\unrestrict does not do backquote expansion'); + done_testing(); diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c index fdd7e2308ca..81b9e203b5c 100644 --- a/src/bin/psql/tab-complete.in.c +++ b/src/bin/psql/tab-complete.in.c @@ -5300,7 +5300,7 @@ match_previous_words(int pattern_id, else if (TailMatchesCS("\\dew*")) COMPLETE_WITH_QUERY(Query_for_list_of_fdws); else if (TailMatchesCS("\\df*")) - COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines); else if (HeadMatchesCS("\\df*")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); diff --git a/src/bin/psql/variables.c b/src/bin/psql/variables.c index 6b64302ebca..07f5e3f6f2d 100644 --- a/src/bin/psql/variables.c +++ b/src/bin/psql/variables.c @@ -224,6 +224,7 @@ ParseVariableDouble(const char *value, const char *name, double *result, double if (name) pg_log_error("invalid value \"%s\" for variable \"%s\": must be less than %.2f", value, name, max); + return false; } *result = dblval; return true; diff --git a/src/bin/scripts/po/de.po b/src/bin/scripts/po/de.po index ce0cbba47bd..58c0bb7ae1a 100644 --- a/src/bin/scripts/po/de.po +++ b/src/bin/scripts/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-04-27 00:51+0000\n" +"POT-Creation-Date: 2026-08-08 06:22+0000\n" "PO-Revision-Date: 2025-04-27 15:40+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -37,17 +37,27 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "ungültige Speicheranforderungsgröße %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format @@ -168,27 +178,27 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu Zeile)" msgstr[1] "(%lu Zeilen)" -#: ../../fe_utils/print.c:3154 +#: ../../fe_utils/print.c:3155 #, c-format msgid "Interrupted\n" msgstr "Unterbrochen\n" -#: ../../fe_utils/print.c:3188 +#: ../../fe_utils/print.c:3189 #, c-format msgid "Cannot print table contents: number of cells % is equal to or exceeds maximum %zu.\n" msgstr "Kann Tabelleninhalt nicht ausgeben: Anzahl der Zellen % ist gleich oder überschreitet Maximum %zu.\n" -#: ../../fe_utils/print.c:3229 +#: ../../fe_utils/print.c:3230 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kann keinen weiteren Spaltenkopf zur Tabelle hinzufügen: Spaltenzahl %d überschritten.\n" -#: ../../fe_utils/print.c:3272 +#: ../../fe_utils/print.c:3273 #, c-format msgid "Cannot add cell to table content: total cell count of % exceeded.\n" msgstr "Kann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl % überschritten.\n" -#: ../../fe_utils/print.c:3530 +#: ../../fe_utils/print.c:3531 #, c-format msgid "invalid output format (internal error): %d" msgstr "ungültiges Ausgabeformat (interner Fehler): %d" @@ -216,13 +226,13 @@ msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" #: clusterdb.c:113 clusterdb.c:132 createdb.c:149 createdb.c:168 #: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:184 reindexdb.c:203 vacuumdb.c:291 vacuumdb.c:311 +#: reindexdb.c:184 reindexdb.c:203 vacuumdb.c:292 vacuumdb.c:312 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." #: clusterdb.c:130 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:201 vacuumdb.c:309 +#: pg_isready.c:109 reindexdb.c:201 vacuumdb.c:310 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" @@ -951,9 +961,9 @@ msgstr "kann nicht mehrere Jobs verwenden, um Systemkataloge zu reindizieren" msgid "cannot reindex all databases and a specific one at the same time" msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig reindizieren" -#: reindexdb.c:302 reindexdb.c:309 vacuumdb.c:558 vacuumdb.c:565 vacuumdb.c:572 -#: vacuumdb.c:579 vacuumdb.c:586 vacuumdb.c:593 vacuumdb.c:600 vacuumdb.c:607 -#: vacuumdb.c:614 vacuumdb.c:621 vacuumdb.c:628 vacuumdb.c:635 +#: reindexdb.c:302 reindexdb.c:309 vacuumdb.c:559 vacuumdb.c:566 vacuumdb.c:573 +#: vacuumdb.c:580 vacuumdb.c:587 vacuumdb.c:594 vacuumdb.c:601 vacuumdb.c:608 +#: vacuumdb.c:615 vacuumdb.c:622 vacuumdb.c:629 vacuumdb.c:636 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "Option »%s« kann nicht mit Serverversionen älter als PostgreSQL %s verwendet werden" @@ -1064,70 +1074,70 @@ msgstr "" "Für weitere Informationen lesen Sie bitte die Beschreibung des\n" "SQL-Befehls REINDEX.\n" -#: vacuumdb.c:324 vacuumdb.c:327 vacuumdb.c:330 vacuumdb.c:333 vacuumdb.c:336 -#: vacuumdb.c:339 vacuumdb.c:342 vacuumdb.c:345 vacuumdb.c:354 +#: vacuumdb.c:325 vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:337 +#: vacuumdb.c:340 vacuumdb.c:343 vacuumdb.c:346 vacuumdb.c:355 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "kann Option »%s« nicht verwenden, wenn nur Analyze durchgeführt wird" -#: vacuumdb.c:357 +#: vacuumdb.c:358 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "kann Option »%s« nicht verwenden, wenn volles Vacuum durchgeführt wird" -#: vacuumdb.c:363 vacuumdb.c:371 +#: vacuumdb.c:364 vacuumdb.c:372 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "kann Option »%s« nicht mit der Option »%s« verwenden" -#: vacuumdb.c:379 +#: vacuumdb.c:380 #, c-format msgid "cannot use the \"%s\" option without \"%s\" or \"%s\"" msgstr "kann Option »%s« nicht ohne »%s« oder »%s« verwenden" -#: vacuumdb.c:453 +#: vacuumdb.c:454 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig vacuumen" -#: vacuumdb.c:457 +#: vacuumdb.c:458 #, c-format msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time" msgstr "kann nicht alle Tabellen in Schemas und bestimmte Tabellen gleichzeitig vacuumen" -#: vacuumdb.c:461 +#: vacuumdb.c:462 #, c-format msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" msgstr "kann nicht bestimmte Tabelle(n) vacuumen und gleichzeitig Schemas ausschließen" -#: vacuumdb.c:465 +#: vacuumdb.c:466 #, c-format msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" msgstr "kann nicht alle Tabellen in Schemas vacuumen und gleichzeitig Schemas ausschließen" -#: vacuumdb.c:478 +#: vacuumdb.c:479 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: vacuumdb.c:545 +#: vacuumdb.c:546 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Erzeuge minimale Optimierer-Statistiken (1 Ziel)" -#: vacuumdb.c:546 +#: vacuumdb.c:547 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Erzeuge mittlere Optimierer-Statistiken (10 Ziele)" -#: vacuumdb.c:547 +#: vacuumdb.c:548 msgid "Generating default (full) optimizer statistics" msgstr "Erzeuge volle Optimierer-Statistiken" -#: vacuumdb.c:645 +#: vacuumdb.c:646 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: bearbeite Datenbank »%s«: %s\n" -#: vacuumdb.c:648 +#: vacuumdb.c:649 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: führe Vacuum in Datenbank »%s« aus\n" diff --git a/src/bin/scripts/po/ru.po b/src/bin/scripts/po/ru.po index df18f6fb518..7daf43d9570 100644 --- a/src/bin/scripts/po/ru.po +++ b/src/bin/scripts/po/ru.po @@ -3,13 +3,13 @@ # This file is distributed under the same license as the PostgreSQL package. # Serguei A. Mokhov, , 2003-2004. # Oleg Bartunov , 2004. -# SPDX-FileCopyrightText: 2012-2017, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Alexander Lakhin +# SPDX-FileCopyrightText: 2012-2017, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pgscripts (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2025-09-13 17:25+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:51+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -39,17 +39,27 @@ msgstr "подробности: " msgid "hint: " msgstr "подсказка: " -#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 #, c-format msgid "out of memory\n" msgstr "нехватка памяти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:159 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" +#: ../../common/fe_memutils.c:209 +#, c-format +msgid "invalid memory allocation request size %zu + %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu\n" + +#: ../../common/fe_memutils.c:228 +#, c-format +msgid "invalid memory allocation request size %zu * %zu\n" +msgstr "недопустимый размер в запросе на выделение памяти: %zu * %zu\n" + #: ../../common/file_utils.c:69 ../../common/file_utils.c:370 #: ../../common/file_utils.c:428 ../../common/file_utils.c:502 #, c-format @@ -171,12 +181,12 @@ msgstr[0] "(%lu строка)" msgstr[1] "(%lu строки)" msgstr[2] "(%lu строк)" -#: ../../fe_utils/print.c:3154 +#: ../../fe_utils/print.c:3155 #, c-format msgid "Interrupted\n" msgstr "Прервано\n" -#: ../../fe_utils/print.c:3188 +#: ../../fe_utils/print.c:3189 #, c-format msgid "" "Cannot print table contents: number of cells % is equal to or " @@ -185,13 +195,13 @@ msgstr "" "Вывести содержимое таблицы нельзя: число ячеек % достигло максимума " "%zu.\n" -#: ../../fe_utils/print.c:3229 +#: ../../fe_utils/print.c:3230 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" "Ошибка добавления заголовка таблицы: превышен предел числа столбцов (%d).\n" -#: ../../fe_utils/print.c:3272 +#: ../../fe_utils/print.c:3273 #, c-format msgid "" "Cannot add cell to table content: total cell count of % exceeded.\n" @@ -199,7 +209,7 @@ msgstr "" "Ошибка добавления ячейки в таблицу: превышен предел числа ячеек " "(%).\n" -#: ../../fe_utils/print.c:3530 +#: ../../fe_utils/print.c:3531 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутренняя ошибка): %d" diff --git a/src/bin/scripts/t/100_vacuumdb.pl b/src/bin/scripts/t/100_vacuumdb.pl index ef2faf610b6..d8b89fc899c 100644 --- a/src/bin/scripts/t/100_vacuumdb.pl +++ b/src/bin/scripts/t/100_vacuumdb.pl @@ -322,6 +322,7 @@ $node->safe_psql('postgres', "CREATE TABLE regression_vacuumdb_parted (a INT) PARTITION BY LIST (a);\n" . "CREATE TABLE regression_vacuumdb_part1 PARTITION OF regression_vacuumdb_parted FOR VALUES IN (1);\n" + . "CREATE INDEX ON regression_vacuumdb_parted ((a + 1));\n" . "INSERT INTO regression_vacuumdb_parted VALUES (1);\n" . "ANALYZE regression_vacuumdb_part1;\n"); $node->issues_sql_like( diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index e97ace18104..fa04109f2d7 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -985,10 +985,10 @@ retrieve_objects(PGconn *conn, vacuumingOptions *vacopts, " AND a.attnum OPERATOR(pg_catalog.>) 0::pg_catalog.int2\n" " AND NOT a.attisdropped\n" " AND a.attstattarget IS DISTINCT FROM 0::pg_catalog.int2\n" + " AND NOT p.inherited\n" " AND NOT EXISTS (SELECT NULL FROM pg_catalog.pg_statistic s\n" " WHERE s.starelid OPERATOR(pg_catalog.=) a.attrelid\n" - " AND s.staattnum OPERATOR(pg_catalog.=) a.attnum\n" - " AND s.stainherit OPERATOR(pg_catalog.=) p.inherited))\n"); + " AND s.staattnum OPERATOR(pg_catalog.=) a.attnum))\n"); /* inheritance and regular stats */ appendPQExpBufferStr(&catalog_query, diff --git a/src/common/blkreftable.c b/src/common/blkreftable.c index 5c85d6a5c6d..b33687a9f36 100644 --- a/src/common/blkreftable.c +++ b/src/common/blkreftable.c @@ -657,6 +657,15 @@ BlockRefTableReaderNextRelation(BlockRefTableReader *reader, return false; } + /* Sanity-check the fork number. */ + if (sentry.forknum < 0 || sentry.forknum > MAX_FORKNUM) + { + reader->error_callback(reader->error_callback_arg, + "file \"%s\" has invalid fork number %d", + reader->error_filename, sentry.forknum); + return false; + } + /* * Sanity-check the nchunks value. In the backend, palloc_array would * enforce this anyway (with a more generic error message); but in @@ -678,6 +687,19 @@ BlockRefTableReaderNextRelation(BlockRefTableReader *reader, BlockRefTableRead(reader, reader->chunk_size, sentry.nchunks * sizeof(uint16)); + /* Sanity-check the chunk sizes. */ + for (unsigned i = 0; i < sentry.nchunks; ++i) + { + if (reader->chunk_size[i] > MAX_ENTRIES_PER_CHUNK) + { + reader->error_callback(reader->error_callback_arg, + "file \"%s\" chunk %u has invalid size %u", + reader->error_filename, i, + (unsigned) reader->chunk_size[i]); + return false; + } + } + /* Set up for chunk scan. */ reader->total_chunks = sentry.nchunks; reader->consumed_chunks = 0; diff --git a/src/common/unicode/case_test.c b/src/common/unicode/case_test.c index 6dfc4d130ea..d98384e6141 100644 --- a/src/common/unicode/case_test.c +++ b/src/common/unicode/case_test.c @@ -330,6 +330,8 @@ tfunc_fold(char *dst, size_t dstsize, const char *src, static void test_convert_case() { + size_t needed; + /* test string with no case changes */ test_convert(tfunc_lower, "√∞", "√∞"); /* test adjust-to-cased behavior */ @@ -354,6 +356,12 @@ test_convert_case() /* U+FF11 FULLWIDTH ONE is alphanumeric for full case mapping */ test_convert(tfunc_title, "\uFF11a", "\uFF11a"); + /* invalid UTF8: truncated multibyte sequence */ + needed = unicode_strfold(NULL, 0, "abc\xCE", 4, false); + Assert(needed == 3); + /* invalid UTF8: invalid byte */ + needed = unicode_strfold(NULL, 0, "abc\xF8xyz", 7, false); + Assert(needed == 3); #ifdef USE_ICU icu_test_full(""); diff --git a/src/common/unicode_case.c b/src/common/unicode_case.c index 073faf6a0d5..8639b203e0c 100644 --- a/src/common/unicode_case.c +++ b/src/common/unicode_case.c @@ -193,6 +193,22 @@ unicode_strfold(char *dst, size_t dstsize, const char *src, ssize_t srclen, NULL); } +/* local version of pg_utf_mblen() to be inlinable */ +static int +utf8_mblen(const unsigned char *s) +{ + if ((*s & 0x80) == 0) + return 1; + else if ((*s & 0xe0) == 0xc0) + return 2; + else if ((*s & 0xf0) == 0xe0) + return 3; + else if ((*s & 0xf8) == 0xf0) + return 4; + else + return -1; +} + /* * Implement Unicode Default Case Conversion algorithm. * @@ -229,14 +245,21 @@ convert_case(char *dst, size_t dstsize, const char *src, ssize_t srclen, Assert(boundary == 0); /* start of text is always a boundary */ } - while ((srclen < 0 || srcoff < srclen) && src[srcoff] != '\0') + srclen = (srclen < 0) ? strlen(src) : srclen; + while (srcoff < srclen && src[srcoff] != '\0') { - pg_wchar u1 = utf8_to_unicode((unsigned char *) src + srcoff); - int u1len = unicode_utf8len(u1); + int u1len = utf8_mblen((const unsigned char *) src + srcoff); + pg_wchar u1; pg_wchar simple = 0; const pg_wchar *special = NULL; enum CaseMapResult casemap_result; + /* invalid UTF8 */ + if (u1len < 0 || srcoff + u1len > srclen) + break; + + u1 = utf8_to_unicode((const unsigned char *) src + srcoff); + if (str_casekind == CaseTitle) { if (srcoff == boundary) @@ -305,61 +328,67 @@ convert_case(char *dst, size_t dstsize, const char *src, ssize_t srclen, * 3-17. The character at the given offset must be directly preceded by a * Cased character, and must not be directly followed by a Cased character. * - * Case_Ignorable characters are ignored. NB: some characters may be both + * Case_Ignorable characters are ignored. Neither beginning of string nor end + * of string are considered Cased characters. NB: some characters may be both * Cased and Case_Ignorable, in which case they are ignored. */ static bool check_final_sigma(const unsigned char *str, size_t len, size_t offset) { - /* the start of the string is not preceded by a Cased character */ - if (offset == 0) - return false; + bool preceded_by_cased = false; + bool followed_by_cased = false; + pg_wchar curr; + int ulen; - /* iterate backwards, looking for Cased character */ - for (int i = offset - 1; i >= 0; i--) + /* iterate backwards looking for preceding character */ + for (int i = offset; i > 0;) { - if ((str[i] & 0x80) == 0 || (str[i] & 0xC0) == 0xC0) - { - pg_wchar curr = utf8_to_unicode(str + i); - - if (pg_u_prop_case_ignorable(curr)) - continue; - else if (pg_u_prop_cased(curr)) - break; - else - return false; - } - else if ((str[i] & 0xC0) == 0x80) + /* skip backwards through continuation bytes */ + i--; + if ((str[i] & 0xC0) == 0x80) continue; - Assert(false); /* invalid UTF-8 */ + /* now at leading byte of previous sequence */ + Assert((str[i] & 0x80) == 0 || (str[i] & 0xC0) == 0xC0); + + ulen = utf8_mblen((const unsigned char *) str + i); + + /* invalid UTF8 */ + if (ulen < 0 || i + ulen > len) + return false; + + curr = utf8_to_unicode((const unsigned char *) str + i); + + if (!pg_u_prop_case_ignorable(curr)) + { + preceded_by_cased = pg_u_prop_cased(curr); + break; + } } - /* end of string is not followed by a Cased character */ - if (offset == len) - return true; + ulen = utf8_mblen((const unsigned char *) str + offset); - /* iterate forwards, looking for Cased character */ - for (int i = offset + 1; i < len && str[i] != '\0'; i++) + /* iterate forward looking for following character */ + for (int i = offset + ulen; i < len;) { - if ((str[i] & 0x80) == 0 || (str[i] & 0xC0) == 0xC0) - { - pg_wchar curr = utf8_to_unicode(str + i); + ulen = utf8_mblen((const unsigned char *) str + i); - if (pg_u_prop_case_ignorable(curr)) - continue; - else if (pg_u_prop_cased(curr)) - return false; - else - break; + /* invalid UTF8 */ + if (ulen < 0 || i + ulen > len) + return false; + + curr = utf8_to_unicode((const unsigned char *) str + i); + + if (!pg_u_prop_case_ignorable(curr)) + { + followed_by_cased = pg_u_prop_cased(curr); + break; } - else if ((str[i] & 0xC0) == 0x80) - continue; - Assert(false); /* invalid UTF-8 */ + i += ulen; } - return true; + return (preceded_by_cased && !followed_by_cased); } /* diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c index 0bb7523f422..2d80ee3ed70 100644 --- a/src/common/unicode_norm.c +++ b/src/common/unicode_norm.c @@ -236,7 +236,7 @@ recompose_code(uint32 start, uint32 code, uint32 *result) /* Check if two current characters are LV and T */ else if (start >= SBASE && start < (SBASE + SCOUNT) && ((start - SBASE) % TCOUNT) == 0 && - code >= TBASE && code < (TBASE + TCOUNT)) + code > TBASE && code < (TBASE + TCOUNT)) { /* make syllable of form LVT */ uint32 tindex = code - TBASE; diff --git a/src/fe_utils/conditional.c b/src/fe_utils/conditional.c index 9e1ad687f08..0565aadb203 100644 --- a/src/fe_utils/conditional.c +++ b/src/fe_utils/conditional.c @@ -57,6 +57,7 @@ conditional_stack_push(ConditionalStack cstack, ifState new_state) p->if_state = new_state; p->query_len = -1; p->paren_depth = -1; + p->lex_state = NULL; p->next = cstack->head; cstack->head = p; } @@ -73,6 +74,8 @@ conditional_stack_pop(ConditionalStack cstack) if (!p) return false; cstack->head = cstack->head->next; + if (p->lex_state) + free(p->lex_state); free(p); return true; } @@ -166,8 +169,39 @@ conditional_stack_get_query_len(ConditionalStack cstack) return cstack->head->query_len; } +/* + * Save current lexer state in topmost stack entry. + * + * The lexer state is presumed to be a single pg_malloc'd chunk. + * It will be freed automatically when the stack entry is popped. + */ +void +conditional_stack_set_lex_state(ConditionalStack cstack, + struct PsqlScanStateSave *lex_state) +{ + Assert(!conditional_stack_empty(cstack)); + if (cstack->head->lex_state) /* free old state, if any */ + free(cstack->head->lex_state); + cstack->head->lex_state = lex_state; +} + +/* + * Fetch last-recorded lexer state from topmost stack entry. + * Will return NULL if no stack or it was never saved. + */ +struct PsqlScanStateSave * +conditional_stack_get_lex_state(ConditionalStack cstack) +{ + if (conditional_stack_empty(cstack)) + return NULL; + return cstack->head->lex_state; +} + /* * Save current parenthesis nesting depth in topmost stack entry. + * + * (These functions are obsolete, and kept around only to avoid API/ABI + * breakage in the back branches.) */ void conditional_stack_set_paren_depth(ConditionalStack cstack, int depth) diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c index 4af0f32f2fc..4e135aba60e 100644 --- a/src/fe_utils/print.c +++ b/src/fe_utils/print.c @@ -1458,9 +1458,10 @@ print_aligned_vertical(const printTableContent *cont, } /* - * Calculate available width for data in wrapped mode + * Determine data column width: fit output width in wrapped mode, or + * ensure alignment with the record header line in aligned mode. */ - if (cont->opt->format == PRINT_WRAPPED) + if (cont->opt->format == PRINT_WRAPPED || cont->opt->format == PRINT_ALIGNED) { unsigned int swidth, rwidth = 0, @@ -1532,7 +1533,7 @@ print_aligned_vertical(const printTableContent *cont, if (width < rwidth) width = rwidth; - if (output_columns > 0) + if (cont->opt->format == PRINT_WRAPPED && output_columns > 0) { unsigned int min_width; diff --git a/src/fe_utils/psqlscan.l b/src/fe_utils/psqlscan.l index fc5bfa597bb..baaadcd60e3 100644 --- a/src/fe_utils/psqlscan.l +++ b/src/fe_utils/psqlscan.l @@ -61,6 +61,10 @@ typedef int YYSTYPE; #define ECHO psqlscan_emit(cur_state, yytext, yyleng) +static bool psqlscan_is_copy_from_stdin(PsqlScanState state); +static void psqlscan_track_identifier(PsqlScanState state, + const char *identifier); + %} %option reentrant @@ -671,11 +675,15 @@ other . ";" { ECHO; - if (cur_state->paren_depth == 0 && cur_state->begin_depth == 0) + if (cur_state->paren_depth == 0 && + cur_state->begin_depth == 0) { + /* Remember if this subcommand was COPY FROM STDIN */ + if (psqlscan_is_copy_from_stdin(cur_state)) + cur_state->copy_stdin_count++; /* Terminate lexing temporarily */ cur_state->start_state = YY_START; - cur_state->identifier_count = 0; + cur_state->init_idents_count = 0; return LEXRES_SEMI; } } @@ -688,8 +696,16 @@ other . "\\"[;:] { /* Force a semi-colon or colon into the query buffer */ psqlscan_emit(cur_state, yytext + 1, 1); - if (yytext[1] == ';') - cur_state->identifier_count = 0; + /* Reset BEGIN/END/COPY tracking if semi at outer level */ + if (yytext[1] == ';' && + cur_state->paren_depth == 0 && + cur_state->begin_depth == 0) + { + /* Remember if this subcommand was COPY FROM STDIN */ + if (psqlscan_is_copy_from_stdin(cur_state)) + cur_state->copy_stdin_count++; + cur_state->init_idents_count = 0; + } } "\\" { @@ -915,55 +931,7 @@ other . {identifier} { - /* - * We need to track if we are inside a BEGIN .. END block - * in a function definition, so that semicolons contained - * therein don't terminate the whole statement. Short of - * writing a full parser here, the following heuristic - * should work. First, we track whether the beginning of - * the statement matches CREATE [OR REPLACE] - * {FUNCTION|PROCEDURE} - */ - - if (cur_state->identifier_count == 0) - memset(cur_state->identifiers, 0, sizeof(cur_state->identifiers)); - - if (pg_strcasecmp(yytext, "create") == 0 || - pg_strcasecmp(yytext, "function") == 0 || - pg_strcasecmp(yytext, "procedure") == 0 || - pg_strcasecmp(yytext, "or") == 0 || - pg_strcasecmp(yytext, "replace") == 0) - { - if (cur_state->identifier_count < sizeof(cur_state->identifiers)) - cur_state->identifiers[cur_state->identifier_count] = pg_tolower((unsigned char) yytext[0]); - } - - cur_state->identifier_count++; - - if (cur_state->identifiers[0] == 'c' && - (cur_state->identifiers[1] == 'f' || cur_state->identifiers[1] == 'p' || - (cur_state->identifiers[1] == 'o' && cur_state->identifiers[2] == 'r' && - (cur_state->identifiers[3] == 'f' || cur_state->identifiers[3] == 'p'))) && - cur_state->paren_depth == 0) - { - if (pg_strcasecmp(yytext, "begin") == 0) - cur_state->begin_depth++; - else if (pg_strcasecmp(yytext, "case") == 0) - { - /* - * CASE also ends with END. We only need to track - * this if we are already inside a BEGIN. - */ - if (cur_state->begin_depth >= 1) - cur_state->begin_depth++; - } - else if (pg_strcasecmp(yytext, "end") == 0) - { - if (cur_state->begin_depth > 0) - cur_state->begin_depth--; - } - } - + psqlscan_track_identifier(cur_state, yytext); ECHO; } @@ -990,6 +958,145 @@ other . /* LCOV_EXCL_STOP */ +/* + * Record the first few keywords/identifiers of a statement + * in the idents[] array, of length idents_size. + * *idents_count is the number of entries filled so far. + * + * We record the interesting keywords using their first character, which + * works so long as those are all different. We could switch to an enum + * if that stops being true, but for now this is easy and compact. + */ +static void +psqlscan_record_initial_keyword(const char *identifier, + char *idents, + int idents_size, + int *idents_count) +{ + if (*idents_count < idents_size) + { + /* + * What we need to recognize is CREATE [OR REPLACE] FUNCTION/PROCEDURE. + * We record these keywords in lower case. We also need to recognize + * COPY ... FROM STDIN. (Note: the backend grammar doesn't + * distinguish STDIN from STDOUT, so we should not do so here either.) + * We record these keywords in upper case, to avoid conflicting with + * the first set. + */ + if (pg_strcasecmp(identifier, "create") == 0 || + pg_strcasecmp(identifier, "function") == 0 || + pg_strcasecmp(identifier, "procedure") == 0 || + pg_strcasecmp(identifier, "or") == 0 || + pg_strcasecmp(identifier, "replace") == 0) + idents[*idents_count] = pg_tolower((unsigned char) identifier[0]); + else if (pg_strcasecmp(identifier, "copy") == 0 || + pg_strcasecmp(identifier, "from") == 0 || + pg_strcasecmp(identifier, "stdin") == 0 || + pg_strcasecmp(identifier, "stdout") == 0) + idents[*idents_count] = pg_toupper((unsigned char) identifier[0]); + /* For other keywords or identifiers, leave '\0' in the array entry */ + (*idents_count)++; + } +} + +/* + * Does the current input match CREATE [OR REPLACE] {FUNCTION|PROCEDURE}? + */ +static bool +psqlscan_is_create_routine(const char *idents) +{ + return idents[0] == 'c' && + (idents[1] == 'f' || idents[1] == 'p' || + (idents[1] == 'o' && idents[2] == 'r' && + (idents[3] == 'f' || idents[3] == 'p'))); +} + +/* + * Does the current input match COPY ... FROM STDIN? + */ +static bool +psqlscan_is_copy_from_stdin(PsqlScanState state) +{ + const char *idents = state->init_idents; + + /* + * The first word must be COPY, but after that there could be up to four + * identifiers (BINARY database.schema.table) before FROM. Since some of + * the words we track are not reserved words, don't assume the intervening + * array entries are '\0'. Life is simplified here by the fact that + * psqlscan_track_identifier ignores everything within parens: we won't + * see column lists nor the query in COPY (query). + */ + if (idents[0] != 'C') + return false; + for (int i = 1; i < lengthof(state->init_idents) - 1; i++) + { + /* Scan to find FROM; if not seen within range, it's not valid COPY */ + if (idents[i] != 'F') + continue; + /* It's COPY FROM STDIN only if the next word is STDIN */ + return (idents[i + 1] == 'S'); + } + return false; +} + +/* + * This function is called each time the lexer recognizes an unquoted + * identifier (which could also be a keyword, and indeed keywords are the + * only case we really care about here). It presently has two tasks: + * + * 1. Track whether we are inside BEGIN .. END in a function definition, + * so that semicolons contained therein don't terminate the whole statement. + * Short of writing a full parser here, the following heuristic should work. + * + * We track whether the beginning of the statement matches CREATE [OR REPLACE] + * {FUNCTION|PROCEDURE}. If so, count BEGIN and END pairs. We also have to + * account for CASE ... END. + * + * 2. Record enough information for psqlscan_is_copy_from_stdin() to recognize + * COPY FROM STDIN commands. + */ +static void +psqlscan_track_identifier(PsqlScanState state, const char *identifier) +{ + /* None of this needs to happen when we're inside parentheses */ + if (state->paren_depth != 0) + return; + + /* Reset all my state at the start of each new statement */ + if (state->init_idents_count == 0) + memset(state->init_idents, 0, sizeof(state->init_idents)); + + /* Record initial keywords if init_idents_count is small enough */ + psqlscan_record_initial_keyword(identifier, + state->init_idents, + lengthof(state->init_idents), + &state->init_idents_count); + + /* + * Track BEGIN/CASE/END only when within an appropriate statement. + */ + if (psqlscan_is_create_routine(state->init_idents)) + { + if (pg_strcasecmp(identifier, "begin") == 0) + state->begin_depth++; + else if (pg_strcasecmp(identifier, "case") == 0) + { + /* + * CASE also ends with END. We only need to track this if we are + * already inside a BEGIN. + */ + if (state->begin_depth >= 1) + state->begin_depth++; + } + else if (pg_strcasecmp(identifier, "end") == 0) + { + if (state->begin_depth > 0) + state->begin_depth--; + } + } +} + /* * Create a lexer working state struct. * @@ -1263,10 +1370,9 @@ psql_scan_finish(PsqlScanState state) /* * Reset lexer scanning state to start conditions. This is appropriate * for executing \r psql commands (or any other time that we discard the - * prior contents of query_buf). It is not, however, necessary to do this - * when we execute and clear the buffer after getting a PSCAN_SEMICOLON or - * PSCAN_EOL scan result, because the scan state must be INITIAL when those - * conditions are returned. + * prior contents of query_buf). Do not call this between psql_scan() + * calls that are scanning successive chunks of a single query string; + * do call it when preparing to process a new query string. * * Note that this is unrelated to flushing unread input; that task is * done by psql_scan_finish(). @@ -1280,8 +1386,9 @@ psql_scan_reset(PsqlScanState state) if (state->dolqstart) free(state->dolqstart); state->dolqstart = NULL; - state->identifier_count = 0; state->begin_depth = 0; + state->copy_stdin_count = 0; + state->init_idents_count = 0; } /* @@ -1305,6 +1412,26 @@ psql_scan_reselect_sql_lexer(PsqlScanState state) state->start_state = INITIAL; } +/* + * Return the number of COPY ... FROM STDIN commands in the input string. + * + * This should be called only after we've finished parsing a complete + * string and are ready to send it to the backend. + */ +int +psql_scan_count_copy_from_stdin(PsqlScanState state) +{ + if (state->init_idents_count > 0) + { + /* Count any COPY FROM STDIN following the last semicolon */ + if (psqlscan_is_copy_from_stdin(state)) + state->copy_stdin_count++; + /* ... but do so only once */ + state->init_idents_count = 0; + } + return state->copy_stdin_count; +} + /* * Return true if lexer is currently in an "inside quotes" state. * diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c index 130d1020d50..0e2a82540ad 100644 --- a/src/fe_utils/string_utils.c +++ b/src/fe_utils/string_utils.c @@ -805,6 +805,116 @@ appendPsqlMetaConnect(PQExpBuffer buf, const char *dbname) } +/* + * SplitGUCList --- parse a string containing identifiers or file names + * + * This is used to split the value of a GUC_LIST_QUOTE GUC variable, without + * presuming whether the elements will be taken as identifiers or file names. + * See comparable code in src/backend/utils/adt/varlena.c. + * + * Inputs: + * rawstring: the input string; must be overwritable! On return, it's + * been modified to contain the separated identifiers. + * separator: the separator punctuation expected between identifiers + * (typically '.' or ','). Whitespace may also appear around + * identifiers. + * Outputs: + * namelist: receives a malloc'd, null-terminated array of pointers to + * identifiers within rawstring. Caller should free this + * even on error return. + * + * Returns true if okay, false if there is a syntax error in the string. + */ +bool +SplitGUCList(char *rawstring, char separator, + char ***namelist) +{ + char *nextp = rawstring; + bool done = false; + char **nextptr; + + /* + * Since we disallow empty identifiers, this is a conservative + * overestimate of the number of pointers we could need. Allow one for + * list terminator. + */ + *namelist = nextptr = + pg_malloc_array(char *, (strlen(rawstring) / 2 + 2)); + *nextptr = NULL; + + while (isspace((unsigned char) *nextp)) + nextp++; /* skip leading whitespace */ + + if (*nextp == '\0') + return true; /* allow empty string */ + + /* At the top of the loop, we are at start of a new identifier. */ + do + { + char *curname; + char *endp; + + if (*nextp == '"') + { + /* Quoted name --- collapse quote-quote pairs */ + curname = nextp + 1; + for (;;) + { + endp = strchr(nextp + 1, '"'); + if (endp == NULL) + return false; /* mismatched quotes */ + if (endp[1] != '"') + break; /* found end of quoted name */ + /* Collapse adjacent quotes into one quote, and look again */ + memmove(endp, endp + 1, strlen(endp)); + nextp = endp; + } + /* endp now points at the terminating quote */ + nextp = endp + 1; + } + else + { + /* Unquoted name --- extends to separator or whitespace */ + curname = nextp; + while (*nextp && *nextp != separator && + !isspace((unsigned char) *nextp)) + nextp++; + endp = nextp; + if (curname == nextp) + return false; /* empty unquoted name not allowed */ + } + + while (isspace((unsigned char) *nextp)) + nextp++; /* skip trailing whitespace */ + + if (*nextp == separator) + { + nextp++; + while (isspace((unsigned char) *nextp)) + nextp++; /* skip leading whitespace for next */ + /* we expect another name, so done remains false */ + } + else if (*nextp == '\0') + done = true; + else + return false; /* invalid syntax */ + + /* Now safe to overwrite separator with a null */ + *endp = '\0'; + + /* + * Finished isolating current name --- add it to output array + */ + *nextptr++ = curname; + + /* Loop back if we didn't reach end of string */ + } while (!done); + + *nextptr = NULL; + return true; +} + + /* * Deconstruct the text representation of a 1-dimensional Postgres array * into individual items. diff --git a/src/include/access/heapam_xlog.h b/src/include/access/heapam_xlog.h index 277df6b3cf0..5ec551e8d56 100644 --- a/src/include/access/heapam_xlog.h +++ b/src/include/access/heapam_xlog.h @@ -110,6 +110,9 @@ (XLH_DELETE_CONTAINS_OLD_TUPLE | XLH_DELETE_CONTAINS_OLD_KEY) /* This is what we need to know about delete */ +#define HEAP_DELETE_BLKREF_HEAP 0 +#define HEAP_DELETE_BLKREF_VM 1 + typedef struct xl_heap_delete { TransactionId xmax; /* xmax of the deleted tuple */ @@ -157,12 +160,15 @@ typedef struct xl_heap_header #define SizeOfHeapHeader (offsetof(xl_heap_header, t_hoff) + sizeof(uint8)) /* This is what we need to know about insert */ +#define HEAP_INSERT_BLKREF_HEAP 0 +#define HEAP_INSERT_BLKREF_VM 1 + typedef struct xl_heap_insert { OffsetNumber offnum; /* inserted tuple's offset */ uint8 flags; - /* xl_heap_header & TUPLE DATA in backup block 0 */ + /* xl_heap_header & TUPLE DATA in HEAP_INSERT_BLKREF_HEAP */ } xl_heap_insert; #define SizeOfHeapInsert (offsetof(xl_heap_insert, flags) + sizeof(uint8)) @@ -173,10 +179,14 @@ typedef struct xl_heap_insert * The main data of the record consists of this xl_heap_multi_insert header. * 'offsets' array is omitted if the whole page is reinitialized * (XLOG_HEAP_INIT_PAGE). - * - * In block 0's data portion, there is an xl_multi_insert_tuple struct, - * followed by the tuple data for each tuple. There is padding to align - * each xl_multi_insert_tuple struct. + */ +#define HEAP_MULTI_INSERT_BLKREF_HEAP 0 +#define HEAP_MULTI_INSERT_BLKREF_VM 1 + +/* + * In HEAP_MULTI_INSERT_BLKREF_HEAP's data portion, there is an + * xl_multi_insert_tuple struct, followed by the tuple data for each tuple. + * There is padding to align each xl_multi_insert_tuple struct. */ typedef struct xl_heap_multi_insert { @@ -201,7 +211,7 @@ typedef struct xl_multi_insert_tuple /* * This is what we need to know about update|hot_update * - * Backup blk 0: new page + * HEAP_UPDATE_BLKREF_HEAP_NEW: new page * * If XLH_UPDATE_PREFIX_FROM_OLD or XLH_UPDATE_SUFFIX_FROM_OLD flags are set, * the prefix and/or suffix come first, as one or two uint16s. @@ -213,8 +223,25 @@ typedef struct xl_multi_insert_tuple * If XLH_UPDATE_CONTAINS_NEW_TUPLE flag is given, the tuple data is * included even if a full-page image was taken. * - * Backup blk 1: old page, if different. (no data, just a reference to the blk) + * HEAP_UPDATE_BLKREF_HEAP_OLD: old page, if different. (no data, just a reference + * to the block) + * + * HEAP_UPDATE_BLKREF_VM_NEW: VM page covering the new heap page. Registered + * when XLH_UPDATE_NEW_ALL_VISIBLE_CLEARED is set and the new heap page's VM bit + * was actually cleared. Also covers the old heap page's VM bits when both heap + * pages map to the same VM page and both blocks' VM bits were actually cleared. + * + * HEAP_UPDATE_BLKREF_VM_OLD: VM page covering the old heap page. Only + * registered when XLH_UPDATE_OLD_ALL_VISIBLE_CLEARED is set and the old heap + * page's VM bits were actually cleared. Also only registered when the old heap + * page's VM bits are on a different VM page than the new heap page's or they + * are on the same VM page and only the old block's VM bits are cleared. */ +#define HEAP_UPDATE_BLKREF_HEAP_NEW 0 +#define HEAP_UPDATE_BLKREF_HEAP_OLD 1 +#define HEAP_UPDATE_BLKREF_VM_NEW 2 +#define HEAP_UPDATE_BLKREF_VM_OLD 3 + typedef struct xl_heap_update { TransactionId old_xmax; /* xmax of the old tuple */ @@ -393,6 +420,9 @@ typedef struct xlhp_prune_items #define XLH_LOCK_ALL_FROZEN_CLEARED 0x01 /* This is what we need to know about lock */ +#define HEAP_LOCK_BLKREF_HEAP 0 +#define HEAP_LOCK_BLKREF_VM 1 + typedef struct xl_heap_lock { TransactionId xmax; /* might be a MultiXactId */ diff --git a/src/include/access/visibilitymap.h b/src/include/access/visibilitymap.h index ea889bf9ec7..1bc59c9ac33 100644 --- a/src/include/access/visibilitymap.h +++ b/src/include/access/visibilitymap.h @@ -26,6 +26,8 @@ #define VM_ALL_FROZEN(r, b, v) \ ((visibilitymap_get_status((r), (b), (v)) & VISIBILITYMAP_ALL_FROZEN) != 0) +extern bool visibilitymap_clear_locked(Relation rel, BlockNumber heapBlk, + Buffer vmbuf, uint8 flags); extern bool visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags); extern void visibilitymap_pin(Relation rel, BlockNumber heapBlk, diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index a1870d8e5aa..7639bd523e1 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -87,6 +87,8 @@ typedef struct ReadLocalXLogPageNoWaitPrivate extern XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf); extern Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id); +extern void XLogFlushBufferForRedoIfInit(XLogReaderState *record, + uint8 block_id, Buffer buffer); extern XLogRedoAction XLogReadBufferForRedoExtended(XLogReaderState *record, uint8 block_id, ReadBufferMode mode, bool get_cleanup_lock, diff --git a/src/include/c.h b/src/include/c.h index 508c007cedd..ae9dbaf22f3 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -264,19 +264,26 @@ #endif /* - * Use "pg_attribute_always_inline" in place of "inline" for functions that + * Use "pg_always_inline" in place of "inline" for functions that * we wish to force inlining of, even when the compiler's heuristics would * choose not to. But, if possible, don't force inlining in unoptimized * debug builds. + * + * XXX The "pg_attribute_always_inline" variant is kept for backwards + * compatibility with existing code. All new code should use the shorter + * variant "pg_always_inline." */ #if (defined(__GNUC__) && __GNUC__ > 3 && defined(__OPTIMIZE__)) || defined(__SUNPRO_C) /* GCC > 3 and Sunpro support always_inline via __attribute__ */ +#define pg_always_inline __attribute__((always_inline)) inline #define pg_attribute_always_inline __attribute__((always_inline)) inline #elif defined(_MSC_VER) /* MSVC has a special keyword for this */ +#define pg_always_inline __forceinline #define pg_attribute_always_inline __forceinline #else /* Otherwise, the best we can do is to say "inline" */ +#define pg_always_inline inline #define pg_attribute_always_inline inline #endif diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h index 4b9fcec0e5d..ddcd977f355 100644 --- a/src/include/catalog/dependency.h +++ b/src/include/catalog/dependency.h @@ -120,6 +120,10 @@ extern void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, DependencyType self_behavior, bool reverse_self); +extern void CheckUsageOnTypesInExpr(Node *expr, List *rtable, Oid roleid); + +extern void CheckUsageOnTypesInSingleRelExpr(Node *expr, Oid relId, Oid roleid); + extern ObjectAddresses *new_object_addresses(void); extern void add_exact_object_address(const ObjectAddress *object, diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index 4daa8bef5ee..60430aee0d5 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -65,6 +65,7 @@ extern void index_check_primary_key(Relation heapRel, #define INDEX_CREATE_IF_NOT_EXISTS (1 << 4) #define INDEX_CREATE_PARTITIONED (1 << 5) #define INDEX_CREATE_INVALID (1 << 6) +#define INDEX_CREATE_DEFERRABLE (1 << 7) extern Oid index_create(Relation heapRelation, const char *indexRelationName, diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat index 6d9dc1528d6..b722a77a480 100644 --- a/src/include/catalog/pg_operator.dat +++ b/src/include/catalog/pg_operator.dat @@ -3057,7 +3057,7 @@ oprrest => 'scalargesel', oprjoin => 'scalargejoinsel' }, # generic range type operators -{ oid => '3882', descr => 'equal', +{ oid => '3882', oid_symbol => 'RANGE_EQ_OP', descr => 'equal', oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'anyrange', oprright => 'anyrange', oprresult => 'bool', oprcom => '=(anyrange,anyrange)', oprnegate => '<>(anyrange,anyrange)', oprcode => 'range_eq', @@ -3263,7 +3263,7 @@ oprname => '@@', oprleft => 'jsonb', oprright => 'jsonpath', oprresult => 'bool', oprcode => 'jsonb_path_match_opr(jsonb,jsonpath)', oprrest => 'matchingsel', oprjoin => 'matchingjoinsel' }, -{ oid => '2860', descr => 'equal', +{ oid => '2860', oid_symbol => 'MULTIRANGE_EQ_OP', descr => 'equal', oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'anymultirange', oprright => 'anymultirange', oprresult => 'bool', oprcom => '=(anymultirange,anymultirange)', diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h index f3432b4b6a1..fff772a720d 100644 --- a/src/include/commands/defrem.h +++ b/src/include/commands/defrem.h @@ -85,7 +85,7 @@ extern void RemoveOperatorById(Oid operOid); extern ObjectAddress AlterOperator(AlterOperatorStmt *stmt); /* commands/statscmds.c */ -extern ObjectAddress CreateStatistics(CreateStatsStmt *stmt, bool check_rights); +extern ObjectAddress CreateStatistics(List *relids, CreateStatsStmt *stmt, bool check_rights); extern ObjectAddress AlterStatistics(AlterStatsStmt *stmt); extern void RemoveStatisticsById(Oid statsOid); extern void RemoveStatisticsDataById(Oid statsOid, bool inh); diff --git a/src/include/commands/typecmds.h b/src/include/commands/typecmds.h index 6cc387e3337..b2ffec8c3be 100644 --- a/src/include/commands/typecmds.h +++ b/src/include/commands/typecmds.h @@ -35,7 +35,8 @@ extern Oid AssignTypeMultirangeArrayOid(void); extern ObjectAddress AlterDomainDefault(List *names, Node *defaultRaw); extern ObjectAddress AlterDomainNotNull(List *names, bool notNull); extern ObjectAddress AlterDomainAddConstraint(List *names, Node *newConstraint, - ObjectAddress *constrAddr); + ObjectAddress *constrAddr, + bool is_readd); extern ObjectAddress AlterDomainValidateConstraint(List *names, const char *constrName); extern ObjectAddress AlterDomainDropConstraint(List *names, const char *constrName, DropBehavior behavior, bool missing_ok); diff --git a/src/include/executor/execScan.h b/src/include/executor/execScan.h index 2003cbc7ed5..2a66639eed4 100644 --- a/src/include/executor/execScan.h +++ b/src/include/executor/execScan.h @@ -23,12 +23,12 @@ * This routine substitutes a test tuple if inside an EvalPlanQual recheck. * Otherwise, it simply executes the access method's next-tuple routine. * - * The pg_attribute_always_inline attribute allows the compiler to inline - * this function into its caller. When EPQState is NULL, the EvalPlanQual - * logic is completely eliminated at compile time, avoiding unnecessary - * run-time checks and code for cases where EPQ is not required. + * The pg_always_inline attribute allows the compiler to inline this function + * into its caller. When EPQState is NULL, the EvalPlanQual logic is completely + * eliminated at compile time, avoiding unnecessary run-time checks and code + * for cases where EPQ is not required. */ -static pg_attribute_always_inline TupleTableSlot * +static pg_always_inline TupleTableSlot * ExecScanFetch(ScanState *node, EPQState *epqstate, ExecScanAccessMtd accessMtd, @@ -144,9 +144,9 @@ ExecScanFetch(ScanState *node, * conditions enforced by the access method. * * This function is an alternative to ExecScan, used when callers may omit - * 'qual' or 'projInfo'. The pg_attribute_always_inline attribute allows the - * compiler to eliminate non-relevant branches at compile time, avoiding - * run-time checks in those cases. + * 'qual' or 'projInfo'. The pg_always_inline attribute allows the compiler + * to eliminate non-relevant branches at compile time, avoiding run-time + * checks in those cases. * * Conditions: * -- The AMI "cursor" is positioned at the previously returned tuple. @@ -156,7 +156,7 @@ ExecScanFetch(ScanState *node, * positioned before the first qualifying tuple. * ---------------------------------------------------------------- */ -static pg_attribute_always_inline TupleTableSlot * +static pg_always_inline TupleTableSlot * ExecScanExtended(ScanState *node, ExecScanAccessMtd accessMtd, /* function returning a tuple */ ExecScanRecheckMtd recheckMtd, diff --git a/src/include/fe_utils/conditional.h b/src/include/fe_utils/conditional.h index 435e9755755..3315b2cfd83 100644 --- a/src/include/fe_utils/conditional.h +++ b/src/include/fe_utils/conditional.h @@ -49,18 +49,18 @@ typedef enum ifState * query_len is used to determine what accumulated text to throw away at the * end of an inactive branch. (We could, perhaps, teach the lexer to not add * stuff to the query buffer in the first place when inside an inactive branch; - * but that would be very invasive.) We also need to save and restore the - * lexer's parenthesis nesting depth when throwing away text. (We don't need - * to save and restore any of its other state, such as comment nesting depth, - * because a backslash command could never appear inside a comment or SQL - * literal.) + * but that would be very invasive.) We also need to save and restore some + * lexer state, such as parenthesis nesting depth, when throwing away text. */ +struct PsqlScanStateSave; /* opaque outside lexer */ + typedef struct IfStackElem { ifState if_state; /* current state, see enum above */ int query_len; /* length of query_buf at last branch start */ - int paren_depth; /* parenthesis depth at last branch start */ + int paren_depth; /* (obsolete, not used anymore) */ struct IfStackElem *next; /* next surrounding \if, if any */ + struct PsqlScanStateSave *lex_state; /* lexer state at last branch start */ } IfStackElem; typedef struct ConditionalStackData @@ -95,6 +95,11 @@ extern void conditional_stack_set_query_len(ConditionalStack cstack, int len); extern int conditional_stack_get_query_len(ConditionalStack cstack); +extern void conditional_stack_set_lex_state(ConditionalStack cstack, + struct PsqlScanStateSave *lex_state); + +extern struct PsqlScanStateSave *conditional_stack_get_lex_state(ConditionalStack cstack); + extern void conditional_stack_set_paren_depth(ConditionalStack cstack, int depth); extern int conditional_stack_get_paren_depth(ConditionalStack cstack); diff --git a/src/include/fe_utils/psqlscan.h b/src/include/fe_utils/psqlscan.h index 39d2065fe98..5e19bf73090 100644 --- a/src/include/fe_utils/psqlscan.h +++ b/src/include/fe_utils/psqlscan.h @@ -26,6 +26,9 @@ /* Abstract type for lexer's internal state */ typedef struct PsqlScanStateData *PsqlScanState; +/* Abstract type for state save/restore */ +typedef struct PsqlScanStateSave PsqlScanStateSave; + /* Termination states for psql_scan() */ typedef enum { @@ -85,6 +88,8 @@ extern void psql_scan_reset(PsqlScanState state); extern void psql_scan_reselect_sql_lexer(PsqlScanState state); +extern int psql_scan_count_copy_from_stdin(PsqlScanState state); + extern bool psql_scan_in_quote(PsqlScanState state); extern void psql_scan_get_location(PsqlScanState state, diff --git a/src/include/fe_utils/psqlscan_int.h b/src/include/fe_utils/psqlscan_int.h index 2a3a9d7c82a..5d8847eff37 100644 --- a/src/include/fe_utils/psqlscan_int.h +++ b/src/include/fe_utils/psqlscan_int.h @@ -120,12 +120,14 @@ typedef struct PsqlScanStateData char *dolqstart; /* current $foo$ quote start string */ /* - * State to track boundaries of BEGIN ... END blocks in function - * definitions, so that semicolons do not send query too early. + * State used to track boundaries of BEGIN ... END blocks in function + * definitions, so that semicolons do not send query too early. We also + * use this state to detect and count COPY FROM STDIN commands. */ - int identifier_count; /* identifiers since start of statement */ - char identifiers[4]; /* records the first few identifiers */ int begin_depth; /* depth of begin/end pairs */ + int copy_stdin_count; /* number of COPY FROM STDIN commands */ + int init_idents_count; /* # identifiers since start of statement */ + char init_idents[8]; /* records the first few identifiers */ /* * Callback functions provided by the program making use of the lexer, @@ -135,6 +137,24 @@ typedef struct PsqlScanStateData void *cb_passthrough; } PsqlScanStateData; +/* + * Conditional scanning (\if ... \endif) needs to be able to reset the + * lexer's state to what it was at the beginning of a chunk of text that + * we choose to ignore. PsqlScanStateSave holds the values that need + * to be saved and restored. We assume that saving/restoring happens only + * while processing a backslash command, so we needn't save state that is + * concerned with comment or SQL literal processing: we won't be inside + * one of those. + */ +struct PsqlScanStateSave +{ + int paren_depth; /* depth of nesting in parentheses */ + int begin_depth; /* depth of begin/end pairs */ + int copy_stdin_count; /* number of COPY FROM STDIN commands */ + int init_idents_count; /* # identifiers since start of statement */ + char init_idents[8]; /* records the first few identifiers */ +}; + /* * Functions exported by psqlscan.l, but only meant for use within diff --git a/src/include/fe_utils/string_utils.h b/src/include/fe_utils/string_utils.h index dc991a93219..b1052c30832 100644 --- a/src/include/fe_utils/string_utils.h +++ b/src/include/fe_utils/string_utils.h @@ -48,6 +48,8 @@ extern bool appendShellStringNoError(PQExpBuffer buf, const char *str); extern void appendConnStrVal(PQExpBuffer buf, const char *str); extern void appendPsqlMetaConnect(PQExpBuffer buf, const char *dbname); +extern bool SplitGUCList(char *rawstring, char separator, char ***namelist); + extern bool parsePGArray(const char *atext, char ***itemarray, int *nitems); extern void appendPGArray(PQExpBuffer buffer, const char *value); diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 161b09fd04b..c94398c0b05 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -3491,6 +3491,7 @@ typedef struct CreateStatsStmt char *stxcomment; /* comment to apply to stats, or NULL */ bool transformed; /* true when transformStatsStmt is finished */ bool if_not_exists; /* do nothing if stats name already exists */ + Oid owner; /* OID of owner, or InvalidOid for default */ } CreateStatsStmt; /* diff --git a/src/include/optimizer/clauses.h b/src/include/optimizer/clauses.h index 0dffec00ede..5935c50ffe1 100644 --- a/src/include/optimizer/clauses.h +++ b/src/include/optimizer/clauses.h @@ -23,6 +23,16 @@ typedef struct List **windowFuncs; /* lists of WindowFuncs for each winref */ } WindowFuncLists; +/* + * Callback used by expression_has_grouping_conflict below. Given a Var, the + * callback returns the equality operator that the relevant grouping mechanism + * (GROUP BY, DISTINCT, DISTINCT ON, window PARTITION BY, or set operation) + * uses for the column the Var references, or InvalidOid if the Var does not + * participate in that grouping. Returning InvalidOid signals "not a grouping + * column" to both the opfamily and collation checks. + */ +typedef Oid (*grouping_eqop_callback) (Var *var, void *context); + extern bool contain_agg_clause(Node *clause); extern bool contain_window_function(Node *clause); @@ -55,4 +65,8 @@ extern Query *inline_set_returning_function(PlannerInfo *root, extern Bitmapset *pull_paramids(Expr *expr); +extern bool expression_has_grouping_conflict(Node *expr, + grouping_eqop_callback get_eqop, + void *context); + #endif /* CLAUSES_H */ diff --git a/src/include/parser/parse_relation.h b/src/include/parser/parse_relation.h index d59599cf242..a05f48317b5 100644 --- a/src/include/parser/parse_relation.h +++ b/src/include/parser/parse_relation.h @@ -31,6 +31,7 @@ extern void checkNameSpaceConflicts(ParseState *pstate, List *namespace1, extern ParseNamespaceItem *GetNSItemByRangeTablePosn(ParseState *pstate, int varno, int sublevels_up); +extern ParseNamespaceItem *GetNSItemByVar(ParseState *pstate, Var *var); extern RangeTblEntry *GetRTEByRangeTablePosn(ParseState *pstate, int varno, int sublevels_up); diff --git a/src/include/replication/logical.h b/src/include/replication/logical.h index 2e562bee5a9..556a0ef2c48 100644 --- a/src/include/replication/logical.h +++ b/src/include/replication/logical.h @@ -152,4 +152,7 @@ extern bool LogicalReplicationSlotHasPendingWal(XLogRecPtr end_of_wal); extern XLogRecPtr LogicalSlotAdvanceAndCheckSnapState(XLogRecPtr moveto, bool *found_consistent_snapshot); +/* GUCs */ +extern PGDLLIMPORT char *output_plugin_libraries_string; + #endif diff --git a/src/include/replication/walreceiver.h b/src/include/replication/walreceiver.h index 89f63f908f8..8d0354e1003 100644 --- a/src/include/replication/walreceiver.h +++ b/src/include/replication/walreceiver.h @@ -164,6 +164,13 @@ typedef struct extern PGDLLIMPORT WalRcvData *WalRcv; +/* + * Server's WAL flush position as reported by the last IDENTIFY_SYSTEM call. + * Set by walrcv_identify_system(), used by the walreceiver to avoid + * requesting streaming from a point ahead of the upstream's flush position. + */ +extern PGDLLIMPORT XLogRecPtr WalRcvIdentifySystemLsn; + typedef struct { bool logical; /* True if this is logical replication stream, diff --git a/src/include/storage/read_stream.h b/src/include/storage/read_stream.h index 9b0d65161d0..f27254a3eff 100644 --- a/src/include/storage/read_stream.h +++ b/src/include/storage/read_stream.h @@ -99,6 +99,7 @@ extern ReadStream *read_stream_begin_smgr_relation(int flags, ReadStreamBlockNumberCB callback, void *callback_private_data, size_t per_buffer_data_size); +extern void read_stream_clear_strategy(ReadStream *stream); extern void read_stream_reset(ReadStream *stream); extern void read_stream_end(ReadStream *stream); diff --git a/src/include/tsearch/ts_type.h b/src/include/tsearch/ts_type.h index d9d5334f28b..72e47697371 100644 --- a/src/include/tsearch/ts_type.h +++ b/src/include/tsearch/ts_type.h @@ -35,7 +35,9 @@ * * The positions for each lexeme must be sorted. * - * Note, tsvectorsend/recv believe that sizeof(WordEntry) == 4 + * Note that while the WordEntry items must be sorted per tsCompareString(), + * the per-lexeme data storage could be in some other order, ie the series + * of WordEntry->pos values need not be strictly ascending. */ typedef struct @@ -46,13 +48,15 @@ typedef struct pos:20; /* MAX 1Mb */ } WordEntry; -#define MAXSTRLEN ( (1<<11) - 1) -#define MAXSTRPOS ( (1<<20) - 1) +#define MAXSTRLEN ( (1<<11) - 1) /* maximum value of WordEntry.len */ +#define MAXSTRPOS ( (1<<20) - 1) /* maximum value of WordEntry.pos */ extern int compareWordEntryPos(const void *a, const void *b); /* - * Equivalent to + * Representation of positions (and weights) associated with a lexeme. + * + * WordEntryPos is equivalent to * typedef struct { * uint16 * weight:2, @@ -75,40 +79,53 @@ typedef struct WordEntryPos pos[1]; } WordEntryPosVector1; +#define MAXNUMPOS (256) /* semi-arbitrary limit on npos */ +/* Macros for getting/setting the fields of a WordEntryPos */ #define WEP_GETWEIGHT(x) ( (x) >> 14 ) #define WEP_GETPOS(x) ( (x) & 0x3fff ) #define WEP_SETWEIGHT(x,v) ( (x) = ( (v) << 14 ) | ( (x) & 0x3fff ) ) #define WEP_SETPOS(x,v) ( (x) = ( (x) & 0xc000 ) | ( (v) & 0x3fff ) ) -#define MAXENTRYPOS (1<<14) -#define MAXNUMPOS (256) +#define MAXENTRYPOS (1<<14) /* max value of WordEntryPos pos field, +1 */ +/* Macro for clamping a position to what will fit in WordEntryPos pos field */ #define LIMITPOS(x) ( ( (x) >= MAXENTRYPOS ) ? (MAXENTRYPOS-1) : (x) ) /* This struct represents a complete tsvector datum */ typedef struct { int32 vl_len_; /* varlena header (do not touch directly!) */ - int32 size; + int32 size; /* number of entries[] items */ WordEntry entries[FLEXIBLE_ARRAY_MEMBER]; /* lexemes follow the entries[] array */ } TSVectorData; typedef TSVectorData *TSVector; +/* + * Calculate the size of a TSVector given the number of WordEntries and + * the total space needed for lexeme text and positions. NOTE: callers + * must enforce lenstr <= MAXSTRPOS, which ensures that WordEntry.pos + * fields will not overflow, and also protects against integer overflow here. + * (Since we prohibit empty lexemes, nentries can't exceed lenstr.) + */ #define DATAHDRSIZE (offsetof(TSVectorData, entries)) #define CALCDATASIZE(nentries, lenstr) (DATAHDRSIZE + (nentries) * sizeof(WordEntry) + (lenstr) ) /* pointer to start of a tsvector's WordEntry array */ -#define ARRPTR(x) ( (x)->entries ) +#define ARRPTR(tsv) ( (tsv)->entries ) /* pointer to start of a tsvector's lexeme storage */ -#define STRPTR(x) ( (char *) &(x)->entries[(x)->size] ) +#define STRPTR(tsv) ( (char *) &(tsv)->entries[(tsv)->size] ) -#define _POSVECPTR(x, e) ((WordEntryPosVector *)(STRPTR(x) + SHORTALIGN((e)->pos + (e)->len))) -#define POSDATALEN(x,e) ( ( (e)->haspos ) ? (_POSVECPTR(x,e)->npos) : 0 ) -#define POSDATAPTR(x,e) (_POSVECPTR(x,e)->pos) +/* pointer to WordEntryPosVector for a WordEntry */ +#define _POSVECPTR(tsv,we) ((WordEntryPosVector *) \ + (STRPTR(tsv) + SHORTALIGN((we)->pos + (we)->len))) +/* number of positions stored for a WordEntry */ +#define POSDATALEN(tsv,we) ( (we)->haspos ? _POSVECPTR(tsv,we)->npos : 0 ) +/* pointer to start of positions stored for a WordEntry */ +#define POSDATAPTR(tsv,we) (_POSVECPTR(tsv,we)->pos) /* * fmgr interface functions @@ -233,7 +250,8 @@ typedef TSQueryData *TSQuery; */ #define COMPUTESIZE(size, lenofoperand) ( HDRSIZETQ + (size) * sizeof(QueryItem) + (lenofoperand) ) #define TSQUERY_TOO_BIG(size, lenofoperand) \ - ((size) > (MaxAllocSize - HDRSIZETQ - (lenofoperand)) / sizeof(QueryItem)) + ((size_t) (lenofoperand) > MaxAllocSize - HDRSIZETQ || \ + (size) > (MaxAllocSize - HDRSIZETQ - (lenofoperand)) / sizeof(QueryItem)) /* Returns a pointer to the first QueryItem in a TSQuery */ #define GETQUERY(x) ((QueryItem*)( (char*)(x)+HDRSIZETQ )) diff --git a/src/include/utils/acl.h b/src/include/utils/acl.h index 01ae5b719fd..13bb8128747 100644 --- a/src/include/utils/acl.h +++ b/src/include/utils/acl.h @@ -227,6 +227,9 @@ extern void select_best_grantor(Oid roleId, AclMode privileges, const Acl *acl, Oid ownerId, Oid *grantorId, AclMode *grantOptions); +/* DATABASEOID syscache hash value for our own database, set by initialize_acl */ +extern uint32 cached_db_hash; + extern void initialize_acl(void); /* diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h index ac57bc8a130..e0c2fc7f7aa 100644 --- a/src/include/utils/lsyscache.h +++ b/src/include/utils/lsyscache.h @@ -86,10 +86,13 @@ extern bool get_compatible_hash_operators(Oid opno, Oid *lhs_opno, Oid *rhs_opno); extern bool get_op_hash_functions(Oid opno, RegProcedure *lhs_procno, RegProcedure *rhs_procno); +extern bool get_op_hash_functions_ext(Oid opno, Oid inputtype, + RegProcedure *lhs_procno, RegProcedure *rhs_procno); extern List *get_op_index_interpretation(Oid opno); extern bool equality_ops_are_compatible(Oid opno1, Oid opno2); extern bool comparison_ops_are_compatible(Oid opno1, Oid opno2); extern bool collations_agree_on_equality(Oid coll1, Oid coll2); +extern bool op_is_safe_index_member(Oid opno); extern Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum); extern char *get_attname(Oid relid, AttrNumber attnum, bool missing_ok); diff --git a/src/include/utils/numeric.h b/src/include/utils/numeric.h index 9e79fc376cb..d38c9d58a34 100644 --- a/src/include/utils/numeric.h +++ b/src/include/utils/numeric.h @@ -17,6 +17,9 @@ #include "common/pg_prng.h" #include "fmgr.h" +/* forward declaration to avoid node.h include */ +struct Node; + /* * Limits on the precision and scale specifiable in a NUMERIC typmod. The * precision is strictly positive, but the scale may be positive or negative. @@ -103,6 +106,8 @@ extern Numeric numeric_mod_opt_error(Numeric num1, Numeric num2, bool *have_error); extern int32 numeric_int4_opt_error(Numeric num, bool *have_error); extern int64 numeric_int8_opt_error(Numeric num, bool *have_error); +extern int32 make_numeric_typmod_safe(int32 precision, int32 scale, + struct Node *escontext); extern Numeric random_numeric(pg_prng_state *state, Numeric rmin, Numeric rmax); diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 6cf00008f63..c09eda3a84d 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -709,6 +709,8 @@ extern bool pgstat_lock_entry(PgStat_EntryRef *entry_ref, bool nowait); extern bool pgstat_lock_entry_shared(PgStat_EntryRef *entry_ref, bool nowait); extern void pgstat_unlock_entry(PgStat_EntryRef *entry_ref); extern bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, uint64 objid); +extern bool pgstat_drop_entry_ext(PgStat_Kind kind, Oid dboid, uint64 objid, + bool missing_ok); extern void pgstat_drop_all_entries(void); extern void pgstat_drop_matching_entries(bool (*do_drop) (PgStatShared_HashEntry *, Datum), Datum match_data); diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index b552359915f..09c794239ca 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -664,6 +664,15 @@ RelationCloseSmgr(Relation relation) * RELATION_IS_OTHER_TEMP * Test for a temporary relation that belongs to some other session. * + * Reading another session's temp-table data through never works right: + * the owning session keeps the data in its private local buffer pool, + * which we cannot access. Existing buffer-manager entry points + * (ReadBuffer_common(), StartReadBuffersImpl(), read_stream_begin_impl(), + * PrefetchBuffer() and ExtendBufferedRelCommon()) already enforce this; any + * new buffer-access entry points must do the same. Command-level code + * (TRUNCATE, ALTER TABLE, VACUUM, CLUSTER, REINDEX, ...) additionally uses + * this macro for command-specific error messages. + * * Beware of multiple eval of argument */ #define RELATION_IS_OTHER_TEMP(relation) \ diff --git a/src/interfaces/ecpg/ecpglib/data.c b/src/interfaces/ecpg/ecpglib/data.c index fa562767585..a63d465acf4 100644 --- a/src/interfaces/ecpg/ecpglib/data.c +++ b/src/interfaces/ecpg/ecpglib/data.c @@ -526,6 +526,13 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno, src_size, dec_size; + if (size < 2 || pval[0] != '\\' || pval[1] != 'x') + { + ecpg_raise(lineno, ECPG_BYTEA_FORMAT, + ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); + return false; + } + dst_size = ecpg_hex_enc_len(varcharsize); src_size = size - 2; /* exclude backslash + 'x' */ dec_size = src_size < dst_size ? src_size : dst_size; diff --git a/src/interfaces/ecpg/ecpglib/error.c b/src/interfaces/ecpg/ecpglib/error.c index 26fdcdb69e9..fba8b4468dd 100644 --- a/src/interfaces/ecpg/ecpglib/error.c +++ b/src/interfaces/ecpg/ecpglib/error.c @@ -130,6 +130,13 @@ ecpg_raise(int line, int code, const char *sqlstate, const char *str) ecpg_gettext("inserting an array of variables is not supported on line %d"), line); break; + case ECPG_BYTEA_FORMAT: + snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), + /*------ + translator: this string will be truncated at 149 characters expanded. */ + ecpg_gettext("invalid input syntax for type bytea: \"%s\", on line %d"), str, line); + break; + case ECPG_NO_CONN: snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), /*------ diff --git a/src/interfaces/ecpg/ecpglib/po/ru.po b/src/interfaces/ecpg/ecpglib/po/ru.po index 18282264d30..738fdcb92d2 100644 --- a/src/interfaces/ecpg/ecpglib/po/ru.po +++ b/src/interfaces/ecpg/ecpglib/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: ecpglib (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" "PO-Revision-Date: 2019-09-09 13:30+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -25,7 +25,7 @@ msgstr "пустое сообщение" msgid "" msgstr "<ПО_УМОЛЧАНИЮ>" -#: descriptor.c:866 misc.c:88 +#: descriptor.c:483 descriptor.c:874 misc.c:88 msgid "NULL" msgstr "NULL" diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h index c4bc526463d..d8216b365b6 100644 --- a/src/interfaces/ecpg/include/ecpgerrno.h +++ b/src/interfaces/ecpg/include/ecpgerrno.h @@ -32,6 +32,7 @@ #define ECPG_NO_ARRAY -214 #define ECPG_DATA_NOT_ARRAY -215 #define ECPG_ARRAY_INSERT -216 +#define ECPG_BYTEA_FORMAT -217 #define ECPG_NO_CONN -220 #define ECPG_NOT_CONN -221 diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer index 390e7713bfb..f3f63b8622e 100644 --- a/src/interfaces/ecpg/preproc/ecpg.trailer +++ b/src/interfaces/ecpg/preproc/ecpg.trailer @@ -1421,32 +1421,24 @@ ECPGDeallocateDescr: DEALLOCATE SQL_DESCRIPTOR quoted_ident_stringvar * manipulate a descriptor header */ -ECPGGetDescriptorHeader: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar ECPGGetDescHeaderItems +ECPGGetDescriptorHeader: SQL_GET SQL_DESCRIPTOR quoted_ident_stringvar ECPGGetDescHeaderItem { @$ = @3; } ; -ECPGGetDescHeaderItems: ECPGGetDescHeaderItem - | ECPGGetDescHeaderItems ',' ECPGGetDescHeaderItem - ; - ECPGGetDescHeaderItem: cvariable '=' desc_header_item { push_assignment(@1, $3); } ; -ECPGSetDescriptorHeader: SET SQL_DESCRIPTOR quoted_ident_stringvar ECPGSetDescHeaderItems +ECPGSetDescriptorHeader: SET SQL_DESCRIPTOR quoted_ident_stringvar ECPGSetDescHeaderItem { @$ = @3; } ; -ECPGSetDescHeaderItems: ECPGSetDescHeaderItem - | ECPGSetDescHeaderItems ',' ECPGSetDescHeaderItem - ; - ECPGSetDescHeaderItem: desc_header_item '=' IntConstVar { push_assignment(@3, $1); diff --git a/src/interfaces/ecpg/preproc/po/ru.po b/src/interfaces/ecpg/preproc/po/ru.po index e2c3683b46d..26eeac816a5 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: 2025-08-30 15:59+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" "PO-Revision-Date: 2025-08-30 22:23+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -394,7 +394,7 @@ msgstr "имя типа \"string\" в режиме Informix зарезервир msgid "type \"%s\" is already defined" msgstr "тип \"%s\" уже определён" -#: preproc.y:539 preproc.y:9532 preproc.y:9877 variable.c:652 +#: preproc.y:539 preproc.y:9524 preproc.y:9869 variable.c:652 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "многомерные массивы с простыми типами данных не поддерживаются" @@ -562,23 +562,23 @@ msgstr "слишком много уровней в определении вл msgid "pointers to varchar are not implemented" msgstr "указатели на varchar не реализованы" -#: preproc.y:9497 +#: preproc.y:9489 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "команда EXEC SQL VAR не может включать инициализатор" -#: preproc.y:9820 +#: preproc.y:9812 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "массивы индикаторов на входе недопустимы" -#: preproc.y:10054 +#: preproc.y:10046 #, c-format msgid "operator not allowed in variable definition" msgstr "недопустимый оператор в определении переменной" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:10099 +#: preproc.y:10091 #, c-format msgid "%s at or near \"%s\"" msgstr "%s (примерное положение: \"%s\")" diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c index 9f6dacd2aea..39124c93919 100644 --- a/src/interfaces/ecpg/preproc/type.c +++ b/src/interfaces/ecpg/preproc/type.c @@ -101,7 +101,7 @@ ECPGmake_struct_type(struct ECPGstruct_member *rm, enum ECPGttype type, ne->type_name = mm_strdup(type_name); ne->u.members = ECPGstruct_member_dup(rm); - ne->struct_sizeof = mm_strdup(struct_sizeof); + ne->struct_sizeof = struct_sizeof ? mm_strdup(struct_sizeof) : NULL; return ne; } diff --git a/src/interfaces/ecpg/test/expected/sql-bytea.c b/src/interfaces/ecpg/test/expected/sql-bytea.c index 8338c6008dd..901594a6f63 100644 --- a/src/interfaces/ecpg/test/expected/sql-bytea.c +++ b/src/interfaces/ecpg/test/expected/sql-bytea.c @@ -356,17 +356,36 @@ if (sqlca.sqlcode < 0) sqlprint();} if (sqlca.sqlcode < 0) sqlprint();} #line 115 "bytea.pgc" + + /* Test for invalid bytea format */ + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select '' :: text", ECPGt_EOIT, + ECPGt_bytea,&(recv_buf[0]),(long)DATA_SIZE,(long)1,sizeof(struct bytea_2), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 118 "bytea.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 118 "bytea.pgc" + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select '\\\\a1234' :: text", ECPGt_EOIT, + ECPGt_bytea,&(recv_buf[0]),(long)DATA_SIZE,(long)1,sizeof(struct bytea_2), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 119 "bytea.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 119 "bytea.pgc" + + { ECPGtrans(__LINE__, NULL, "commit"); -#line 116 "bytea.pgc" +#line 121 "bytea.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 116 "bytea.pgc" +#line 121 "bytea.pgc" { ECPGdisconnect(__LINE__, "CURRENT"); -#line 117 "bytea.pgc" +#line 122 "bytea.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 117 "bytea.pgc" +#line 122 "bytea.pgc" return 0; diff --git a/src/interfaces/ecpg/test/expected/sql-bytea.stderr b/src/interfaces/ecpg/test/expected/sql-bytea.stderr index cb828a76020..58589474856 100644 --- a/src/interfaces/ecpg/test/expected/sql-bytea.stderr +++ b/src/interfaces/ecpg/test/expected/sql-bytea.stderr @@ -181,7 +181,29 @@ SQL error: invalid statement name "cursor1" on line 82 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_process_output on line 115: OK: DROP TABLE [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGtrans on line 116: action "commit"; connection "ecpg1_regression" +[NO_PID]: ecpg_execute on line 118: query: select '' :: text; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 118: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 118: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 118: RESULT: offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: raising sqlcode -217 on line 118: invalid input syntax for type bytea: "", on line 118 +[NO_PID]: sqlca: code: -217, state: 42804 +SQL error: invalid input syntax for type bytea: "", on line 118 +[NO_PID]: ecpg_execute on line 119: query: select '\\a1234' :: text; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 119: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 119: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 119: RESULT: \\a1234 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: raising sqlcode -217 on line 119: invalid input syntax for type bytea: "\\a1234", on line 119 +[NO_PID]: sqlca: code: -217, state: 42804 +SQL error: invalid input syntax for type bytea: "\\a1234", on line 119 +[NO_PID]: ECPGtrans on line 121: action "commit"; connection "ecpg1_regression" [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: deallocate_one on line 0: name sel_stmt [NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/sql/bytea.pgc b/src/interfaces/ecpg/test/sql/bytea.pgc index e8741231194..da9152758a2 100644 --- a/src/interfaces/ecpg/test/sql/bytea.pgc +++ b/src/interfaces/ecpg/test/sql/bytea.pgc @@ -113,6 +113,11 @@ while (0) dump_binary(recv_short_buf.arr, recv_short_buf.len, ind[1]); exec sql drop table test; + + /* Test for invalid bytea format */ + exec sql select ''::text into :recv_buf[0]; + exec sql select '\\a1234'::text into :recv_buf[0]; + exec sql commit; exec sql disconnect; diff --git a/src/interfaces/libpq-oauth/Makefile b/src/interfaces/libpq-oauth/Makefile index 71cd1829720..51145f085a8 100644 --- a/src/interfaces/libpq-oauth/Makefile +++ b/src/interfaces/libpq-oauth/Makefile @@ -55,10 +55,6 @@ SHLIB_EXPORTS = exports.txt # Disable -bundle_loader on macOS. BE_DLLLIBS = -# By default, a library without an SONAME doesn't get a static library, so we -# add it to the build explicitly. -all: all-lib all-static-lib - # Shared library stuff include $(top_srcdir)/src/Makefile.shlib @@ -67,6 +63,28 @@ include $(top_srcdir)/src/Makefile.shlib %_shlib.o: %.c %.o $(CC) $(CFLAGS) $(CFLAGS_SL) $(CPPFLAGS) $(CPPFLAGS_SHLIB) -c $< -o $@ +.PHONY: all-tests +all-tests: oauth_tests$(X) + +oauth_tests$(X): test-oauth-curl.o oauth-utils.o $(WIN32RES) | submake-libpgport submake-libpq + $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(SHLIB_LINK) -o $@ + +# +# Top-Level Targets +# +# The existence of a t/ folder induces the buildfarm to run Make directly on +# this subdirectory, bypassing the recursion skip in src/interfaces/Makefile. +# Wrap the standard build targets in a with_libcurl conditional to avoid +# building OAuth code on platforms that haven't requested it. (The "clean"-style +# targets remain available.) +# + +ifeq ($(with_libcurl), yes) + +# By default, a library without an SONAME doesn't get a static library, so we +# add it to the build explicitly. +all: all-lib all-static-lib + # Ignore the standard rules for SONAME-less installation; we want both the # static and shared libraries to go into libdir. install: all installdirs $(stlib) $(shlib) @@ -76,9 +94,19 @@ install: all installdirs $(stlib) $(shlib) installdirs: $(MKDIR_P) '$(DESTDIR)$(libdir)' +check: all-tests + $(prove_check) + +installcheck: all-tests + $(prove_installcheck) + +endif # with_libcurl + uninstall: rm -f '$(DESTDIR)$(libdir)/$(stlib)' rm -f '$(DESTDIR)$(libdir)/$(shlib)' clean distclean: clean-lib rm -f $(OBJS) $(OBJS_STATIC) $(OBJS_SHLIB) + rm -f test-oauth-curl.o oauth_tests$(X) + rm -rf tmp_check diff --git a/src/interfaces/libpq-oauth/meson.build b/src/interfaces/libpq-oauth/meson.build index 4f006e2c381..881e3f24f10 100644 --- a/src/interfaces/libpq-oauth/meson.build +++ b/src/interfaces/libpq-oauth/meson.build @@ -47,3 +47,38 @@ libpq_oauth_so = shared_module(libpq_oauth_name, link_args: export_fmt.format(export_file.full_path()), kwargs: default_lib_args, ) + +libpq_oauth_test_deps = [] + +oauth_test_sources = files('test-oauth-curl.c') + libpq_oauth_so_sources + +if host_system == 'windows' + oauth_test_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'oauth_tests', + '--FILEDESC', 'OAuth unit test program',]) +endif + +libpq_oauth_test_deps += executable('oauth_tests', + oauth_test_sources, + dependencies: [frontend_shlib_code, libpq, libpq_oauth_deps], + kwargs: default_bin_args + { + 'c_args': default_bin_args.get('c_args', []) + libpq_oauth_so_c_args, + 'c_pch': pch_postgres_fe_h, + 'include_directories': [libpq_inc, postgres_inc], + 'install': false, + } +) + +testprep_targets += libpq_oauth_test_deps + +tests += { + 'name': 'libpq-oauth', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_oauth.pl', + ], + 'deps': libpq_oauth_test_deps, + }, +} diff --git a/src/interfaces/libpq-oauth/oauth-curl.c b/src/interfaces/libpq-oauth/oauth-curl.c index 64b5306372a..4d7ae1ae790 100644 --- a/src/interfaces/libpq-oauth/oauth-curl.c +++ b/src/interfaces/libpq-oauth/oauth-curl.c @@ -28,6 +28,7 @@ #error libpq-oauth is not supported on this platform #endif +#include "common/int.h" #include "common/jsonapi.h" #include "fe-auth-oauth.h" #include "mb/pg_wchar.h" @@ -144,7 +145,7 @@ struct device_authz /* Fields below are parsed from the corresponding string above. */ int expires_in; - int interval; + int32 interval; }; static void @@ -976,7 +977,7 @@ parse_json_number(const char *s) * expensive network polling loop.) Tests may remove the lower bound with * PGOAUTHDEBUG, for improved performance. */ -static int +static int32 parse_interval(struct async_ctx *actx, const char *interval_str) { double parsed; @@ -987,8 +988,8 @@ parse_interval(struct async_ctx *actx, const char *interval_str) if (parsed < 1) return actx->debugging ? 0 : 1; - else if (parsed >= INT_MAX) - return INT_MAX; + else if (parsed >= INT32_MAX) + return INT32_MAX; return parsed; } @@ -2590,10 +2591,7 @@ handle_token_response(struct async_ctx *actx, char **token) */ if (strcmp(err->error, "slow_down") == 0) { - int prev_interval = actx->authz.interval; - - actx->authz.interval += 5; - if (actx->authz.interval < prev_interval) + if (pg_add_s32_overflow(actx->authz.interval, 5, &actx->authz.interval)) { actx_error(actx, "slow_down interval overflow"); goto token_cleanup; @@ -2666,9 +2664,7 @@ initialize_curl(PGconn *conn) * PG_BOOL_YES/NO in cases where that's not the final answer. */ static volatile PGTernaryBool init_successful = PG_BOOL_UNKNOWN; -#if HAVE_THREADSAFE_CURL_GLOBAL_INIT curl_version_info_data *info; -#endif #if !HAVE_THREADSAFE_CURL_GLOBAL_INIT @@ -2716,6 +2712,8 @@ initialize_curl(PGconn *conn) goto done; } + info = curl_version_info(CURLVERSION_NOW); + #if HAVE_THREADSAFE_CURL_GLOBAL_INIT /* @@ -2725,7 +2723,6 @@ initialize_curl(PGconn *conn) * situation), then double-check to make sure the runtime setting agrees, * to try to catch silent downgrades. */ - info = curl_version_info(CURLVERSION_NOW); if (!(info->features & CURL_VERSION_THREADSAFE)) { /* @@ -2742,6 +2739,22 @@ initialize_curl(PGconn *conn) } #endif + if (oauth_unsafe_debugging_enabled()) + { + /* + * Record the version of libcurl and its SSL library when tracing, + * since those are likely to be relevant to network debugging. Neither + * of these strings should be NULL in a useful installation, but + * that's no reason to crash if they are, so provide fallbacks. + * + * Other Curl dependency info might be helpful in the future, too; + * just be sure to check info->age as needed when adding more. + */ + fprintf(stderr, "[libpq] initialized libcurl %s (%s)\n", + info->version ? info->version : "version unknown", + info->ssl_version ? info->ssl_version : "no SSL"); + } + init_successful = PG_BOOL_YES; done: @@ -2959,8 +2972,25 @@ pg_fe_run_oauth_flow_impl(PGconn *conn) * Wait for the required interval before issuing the next * request. */ - if (!set_timer(actx, actx->authz.interval * 1000)) - goto error_return; + { + /* + * Avoid overflow of long int. (By the time we reach + * LONG_MAX milliseconds -- 24 days on 32-bit platforms -- + * continuing to honor slow_down requests seems pretty + * pointless anyway.) + */ + int64 interval_ms; + + if (pg_mul_s64_overflow(actx->authz.interval, 1000, + &interval_ms) + || (interval_ms > LONG_MAX)) + { + interval_ms = LONG_MAX; + } + + if (!set_timer(actx, (long) interval_ms)) + goto error_return; + } /* * No Curl requests are running, so we can simplify by having diff --git a/src/interfaces/libpq-oauth/t/001_oauth.pl b/src/interfaces/libpq-oauth/t/001_oauth.pl new file mode 100644 index 00000000000..6c972056bbd --- /dev/null +++ b/src/interfaces/libpq-oauth/t/001_oauth.pl @@ -0,0 +1,24 @@ +# Copyright (c) 2025, PostgreSQL Global Development Group +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Utils; +use Test::More; + +# Defer entirely to the oauth_tests executable. stdout/err is routed through +# Test::More so that our logging infrastructure can handle it correctly. Using +# IPC::Run::new_chunker seems to help interleave the two streams a little better +# than without. +# +# TODO: prove can also deal with native executables itself, which we could +# probably make use of via PROVE_TESTS on the Makefile side. But the Meson setup +# calls Perl directly, which would require more code to work around... and +# there's still the matter of logging. +my $builder = Test::More->builder; +my $out = $builder->output; +my $err = $builder->failure_output; + +IPC::Run::run ['oauth_tests'], + '>' => (IPC::Run::new_chunker, sub { $out->print($_[0]) }), + '2>' => (IPC::Run::new_chunker, sub { $err->print($_[0]) }) + or die "oauth_tests returned $?"; diff --git a/src/interfaces/libpq-oauth/test-oauth-curl.c b/src/interfaces/libpq-oauth/test-oauth-curl.c new file mode 100644 index 00000000000..8263aff2f4a --- /dev/null +++ b/src/interfaces/libpq-oauth/test-oauth-curl.c @@ -0,0 +1,527 @@ +/* + * test-oauth-curl.c + * + * A unit test driver for libpq-oauth. This #includes oauth-curl.c, which lets + * the tests reference static functions and other internals. + * + * USE_ASSERT_CHECKING is required, to make it easy for tests to wrap + * must-succeed code as part of test setup. + * + * Copyright (c) 2025, PostgreSQL Global Development Group + */ + +#include "oauth-curl.c" + +#include + +#ifdef USE_ASSERT_CHECKING + +/* + * TAP Helpers + */ + +static int num_tests = 0; + +/* + * Reports ok/not ok to the TAP stream on stdout. + */ +#define ok(OK, TEST) \ + ok_impl(OK, TEST, #OK, __FILE__, __LINE__) + +static bool +ok_impl(bool ok, const char *test, const char *teststr, const char *file, int line) +{ + printf("%sok %d - %s\n", ok ? "" : "not ", ++num_tests, test); + + if (!ok) + { + printf("# at %s:%d:\n", file, line); + printf("# expression is false: %s\n", teststr); + } + + return ok; +} + +/* + * Like ok(this == that), but with more diagnostics on failure. + * + * Only works on ints, but luckily that's all we need here. Note that the much + * simpler-looking macro implementation + * + * is_diag(ok(THIS == THAT, TEST), THIS, #THIS, THAT, #THAT) + * + * suffers from multiple evaluation of the macro arguments... + */ +#define is(THIS, THAT, TEST) \ + do { \ + int this_ = (THIS), \ + that_ = (THAT); \ + is_diag( \ + ok_impl(this_ == that_, TEST, #THIS " == " #THAT, __FILE__, __LINE__), \ + this_, #THIS, that_, #THAT \ + ); \ + } while (0) + +static bool +is_diag(bool ok, int this, const char *thisstr, int that, const char *thatstr) +{ + if (!ok) + printf("# %s = %d; %s = %d\n", thisstr, this, thatstr, that); + + return ok; +} + +/* + * Utilities + */ + +/* + * Creates a partially-initialized async_ctx for the purposes of testing. Free + * with free_test_actx(). + */ +static struct async_ctx * +init_test_actx(void) +{ + struct async_ctx *actx; + + actx = calloc(1, sizeof(*actx)); + Assert(actx); + + actx->mux = PGINVALID_SOCKET; + actx->timerfd = -1; + actx->debugging = true; + + initPQExpBuffer(&actx->errbuf); + + Assert(setup_multiplexer(actx)); + + return actx; +} + +static void +free_test_actx(struct async_ctx *actx) +{ + termPQExpBuffer(&actx->errbuf); + + if (actx->mux != PGINVALID_SOCKET) + close(actx->mux); + if (actx->timerfd >= 0) + close(actx->timerfd); + + free(actx); +} + +static char dummy_buf[4 * 1024]; /* for fill_pipe/drain_pipe */ + +/* + * Writes to the write side of a pipe until it won't take any more data. Returns + * the amount written. + */ +static ssize_t +fill_pipe(int fd) +{ + int mode; + ssize_t written = 0; + + /* Don't block. */ + Assert((mode = fcntl(fd, F_GETFL)) != -1); + Assert(fcntl(fd, F_SETFL, mode | O_NONBLOCK) == 0); + + while (true) + { + ssize_t w; + + w = write(fd, dummy_buf, sizeof(dummy_buf)); + if (w < 0) + { + if (errno != EAGAIN && errno != EWOULDBLOCK) + { + perror("write to pipe"); + written = -1; + } + break; + } + + written += w; + } + + /* Reset the descriptor flags. */ + Assert(fcntl(fd, F_SETFD, mode) == 0); + + return written; +} + +/* + * Drains the requested amount of data from the read side of a pipe. + */ +static bool +drain_pipe(int fd, ssize_t n) +{ + Assert(n > 0); + + while (n) + { + size_t to_read = (n <= sizeof(dummy_buf)) ? n : sizeof(dummy_buf); + ssize_t drained; + + drained = read(fd, dummy_buf, to_read); + if (drained < 0) + { + perror("read from pipe"); + return false; + } + + n -= drained; + } + + return true; +} + +/* + * Tests whether the multiplexer is marked ready by the deadline. This is a + * macro so that file/line information makes sense during failures. + * + * NB: our current multiplexer implementations (epoll/kqueue) are *readable* + * when the underlying libcurl sockets are *writable*. This behavior is pinned + * here to record that expectation; PGRES_POLLING_READING is hardcoded + * throughout the flow and would need to be changed if a new multiplexer does + * something different. + */ +#define mux_is_ready(MUX, DEADLINE, TEST) \ + do { \ + int res_ = PQsocketPoll(MUX, 1, 0, DEADLINE); \ + Assert(res_ != -1); \ + ok(res_ > 0, "multiplexer is ready " TEST); \ + } while (0) + +/* + * The opposite of mux_is_ready(). + */ +#define mux_is_not_ready(MUX, TEST) \ + do { \ + int res_ = PQsocketPoll(MUX, 1, 0, 0); \ + Assert(res_ != -1); \ + is(res_, 0, "multiplexer is not ready " TEST); \ + } while (0) + +/* + * Test Suites + */ + +/* Per-suite timeout. Set via the PG_TEST_TIMEOUT_DEFAULT envvar. */ +static pg_usec_time_t timeout_us = 180 * 1000 * 1000; + +static void +test_set_timer(void) +{ + struct async_ctx *actx = init_test_actx(); + const pg_usec_time_t deadline = PQgetCurrentTimeUSec() + timeout_us; + + printf("# test_set_timer\n"); + + /* A zero-duration timer should result in a near-immediate ready signal. */ + Assert(set_timer(actx, 0)); + mux_is_ready(actx->mux, deadline, "when timer expires"); + is(timer_expired(actx), 1, "timer_expired() returns 1 when timer expires"); + + /* Resetting the timer far in the future should unset the ready signal. */ + Assert(set_timer(actx, INT_MAX)); + mux_is_not_ready(actx->mux, "when timer is reset to the future"); + is(timer_expired(actx), 0, "timer_expired() returns 0 with unexpired timer"); + + /* Setting another zero-duration timer should override the previous one. */ + Assert(set_timer(actx, 0)); + mux_is_ready(actx->mux, deadline, "when timer is re-expired"); + is(timer_expired(actx), 1, "timer_expired() returns 1 when timer is re-expired"); + + /* And disabling that timer should once again unset the ready signal. */ + Assert(set_timer(actx, -1)); + mux_is_not_ready(actx->mux, "when timer is unset"); + is(timer_expired(actx), 0, "timer_expired() returns 0 when timer is unset"); + + { + bool expired; + + /* Make sure drain_timer_events() functions correctly as well. */ + Assert(set_timer(actx, 0)); + mux_is_ready(actx->mux, deadline, "when timer is re-expired (drain_timer_events)"); + + Assert(drain_timer_events(actx, &expired)); + mux_is_not_ready(actx->mux, "when timer is drained after expiring"); + is(expired, 1, "drain_timer_events() reports expiration"); + is(timer_expired(actx), 0, "timer_expired() returns 0 after timer is drained"); + + /* A second drain should do nothing. */ + Assert(drain_timer_events(actx, &expired)); + mux_is_not_ready(actx->mux, "when timer is drained a second time"); + is(expired, 0, "drain_timer_events() reports no expiration"); + is(timer_expired(actx), 0, "timer_expired() still returns 0"); + } + + free_test_actx(actx); +} + +static void +test_register_socket(void) +{ + struct async_ctx *actx = init_test_actx(); + int pipefd[2]; + int rfd, + wfd; + bool bidirectional; + + /* Create a local pipe for communication. */ + Assert(pipe(pipefd) == 0); + rfd = pipefd[0]; + wfd = pipefd[1]; + + /* + * Some platforms (FreeBSD) implement bidirectional pipes, affecting the + * behavior of some of these tests. Store that knowledge for later. + */ + bidirectional = PQsocketPoll(rfd /* read */ , 0, 1 /* write */ , 0) > 0; + + /* + * This suite runs twice -- once using CURL_POLL_IN/CURL_POLL_OUT for + * read/write operations, respectively, and once using CURL_POLL_INOUT for + * both sides. + */ + for (int inout = 0; inout < 2; inout++) + { + const int in_event = inout ? CURL_POLL_INOUT : CURL_POLL_IN; + const int out_event = inout ? CURL_POLL_INOUT : CURL_POLL_OUT; + const pg_usec_time_t deadline = PQgetCurrentTimeUSec() + timeout_us; + size_t bidi_pipe_size = 0; /* silence compiler warnings */ + + printf("# test_register_socket %s\n", inout ? "(INOUT)" : ""); + + /* + * At the start of the test, the read side should be blocked and the + * write side should be open. (There's a mistake at the end of this + * loop otherwise.) + */ + Assert(PQsocketPoll(rfd, 1, 0, 0) == 0); + Assert(PQsocketPoll(wfd, 0, 1, 0) > 0); + + /* + * For bidirectional systems, emulate unidirectional behavior here by + * filling up the "read side" of the pipe. + */ + if (bidirectional) + Assert((bidi_pipe_size = fill_pipe(rfd)) > 0); + + /* Listen on the read side. The multiplexer shouldn't be ready yet. */ + Assert(register_socket(NULL, rfd, in_event, actx, NULL) == 0); + mux_is_not_ready(actx->mux, "when fd is not readable"); + + /* Writing to the pipe should result in a read-ready multiplexer. */ + Assert(write(wfd, "x", 1) == 1); + mux_is_ready(actx->mux, deadline, "when fd is readable"); + + /* + * Update the registration to wait on write events instead. The + * multiplexer should be unset. + */ + Assert(register_socket(NULL, rfd, CURL_POLL_OUT, actx, NULL) == 0); + mux_is_not_ready(actx->mux, "when waiting for writes on readable fd"); + + /* Re-register for read events. */ + Assert(register_socket(NULL, rfd, in_event, actx, NULL) == 0); + mux_is_ready(actx->mux, deadline, "when waiting for reads again"); + + /* Stop listening. The multiplexer should be unset. */ + Assert(register_socket(NULL, rfd, CURL_POLL_REMOVE, actx, NULL) == 0); + mux_is_not_ready(actx->mux, "when readable fd is removed"); + + /* Listen again. */ + Assert(register_socket(NULL, rfd, in_event, actx, NULL) == 0); + mux_is_ready(actx->mux, deadline, "when readable fd is re-added"); + + /* + * Draining the pipe should unset the multiplexer again, once the old + * event is cleared. + */ + Assert(drain_pipe(rfd, 1)); + Assert(comb_multiplexer(actx)); + mux_is_not_ready(actx->mux, "when fd is drained"); + + /* Undo any unidirectional emulation. */ + if (bidirectional) + Assert(drain_pipe(wfd, bidi_pipe_size)); + + /* Listen on the write side. An empty buffer should be writable. */ + Assert(register_socket(NULL, rfd, CURL_POLL_REMOVE, actx, NULL) == 0); + Assert(register_socket(NULL, wfd, out_event, actx, NULL) == 0); + mux_is_ready(actx->mux, deadline, "when fd is writable"); + + /* As above, wait on read events instead. */ + Assert(register_socket(NULL, wfd, CURL_POLL_IN, actx, NULL) == 0); + mux_is_not_ready(actx->mux, "when waiting for reads on writable fd"); + + /* Re-register for write events. */ + Assert(register_socket(NULL, wfd, out_event, actx, NULL) == 0); + mux_is_ready(actx->mux, deadline, "when waiting for writes again"); + + { + ssize_t written; + + /* + * Fill the pipe. Once the old writable event is cleared, the mux + * should not be ready. + */ + Assert((written = fill_pipe(wfd)) > 0); + printf("# pipe buffer is full at %zd bytes\n", written); + + Assert(comb_multiplexer(actx)); + mux_is_not_ready(actx->mux, "when fd buffer is full"); + + /* Drain the pipe again. */ + Assert(drain_pipe(rfd, written)); + mux_is_ready(actx->mux, deadline, "when fd buffer is drained"); + } + + /* Stop listening. */ + Assert(register_socket(NULL, wfd, CURL_POLL_REMOVE, actx, NULL) == 0); + mux_is_not_ready(actx->mux, "when fd is removed"); + + /* Make sure an expired timer doesn't interfere with event draining. */ + { + bool expired; + + /* Make the rfd appear unidirectional if necessary. */ + if (bidirectional) + Assert((bidi_pipe_size = fill_pipe(rfd)) > 0); + + /* Set the timer and wait for it to expire. */ + Assert(set_timer(actx, 0)); + Assert(PQsocketPoll(actx->timerfd, 1, 0, deadline) > 0); + is(timer_expired(actx), 1, "timer is expired"); + + /* Register for read events and make the fd readable. */ + Assert(register_socket(NULL, rfd, in_event, actx, NULL) == 0); + Assert(write(wfd, "x", 1) == 1); + mux_is_ready(actx->mux, deadline, "when fd is readable and timer expired"); + + /* + * Draining the pipe should unset the multiplexer again, once the + * old event is drained and the timer is reset. + * + * Order matters, since comb_multiplexer() doesn't have to remove + * stale events when active events exist. Follow the call sequence + * used in the code: drain the timer expiration, drain the pipe, + * then clear the stale events. + */ + Assert(drain_timer_events(actx, &expired)); + Assert(drain_pipe(rfd, 1)); + Assert(comb_multiplexer(actx)); + + is(expired, 1, "drain_timer_events() reports expiration"); + is(timer_expired(actx), 0, "timer is no longer expired"); + mux_is_not_ready(actx->mux, "when fd is drained and timer reset"); + + /* Stop listening. */ + Assert(register_socket(NULL, rfd, CURL_POLL_REMOVE, actx, NULL) == 0); + + /* Undo any unidirectional emulation. */ + if (bidirectional) + Assert(drain_pipe(wfd, bidi_pipe_size)); + } + + /* Ensure comb_multiplexer() can handle multiple stale events. */ + { + int rfd2, + wfd2; + + /* Create a second local pipe. */ + Assert(pipe(pipefd) == 0); + rfd2 = pipefd[0]; + wfd2 = pipefd[1]; + + /* Make both rfds appear unidirectional if necessary. */ + if (bidirectional) + { + Assert((bidi_pipe_size = fill_pipe(rfd)) > 0); + Assert(fill_pipe(rfd2) == bidi_pipe_size); + } + + /* Register for read events on both fds, and make them readable. */ + Assert(register_socket(NULL, rfd, in_event, actx, NULL) == 0); + Assert(register_socket(NULL, rfd2, in_event, actx, NULL) == 0); + + Assert(write(wfd, "x", 1) == 1); + Assert(write(wfd2, "x", 1) == 1); + + mux_is_ready(actx->mux, deadline, "when two fds are readable"); + + /* + * Drain both fds. comb_multiplexer() should then ensure that the + * mux is no longer readable. + */ + Assert(drain_pipe(rfd, 1)); + Assert(drain_pipe(rfd2, 1)); + Assert(comb_multiplexer(actx)); + mux_is_not_ready(actx->mux, "when two fds are drained"); + + /* Stop listening. */ + Assert(register_socket(NULL, rfd, CURL_POLL_REMOVE, actx, NULL) == 0); + Assert(register_socket(NULL, rfd2, CURL_POLL_REMOVE, actx, NULL) == 0); + + /* Undo any unidirectional emulation. */ + if (bidirectional) + { + Assert(drain_pipe(wfd, bidi_pipe_size)); + Assert(drain_pipe(wfd2, bidi_pipe_size)); + } + + close(rfd2); + close(wfd2); + } + } + + close(rfd); + close(wfd); + free_test_actx(actx); +} + +int +main(int argc, char *argv[]) +{ + const char *timeout; + + /* Grab the default timeout. */ + timeout = getenv("PG_TEST_TIMEOUT_DEFAULT"); + if (timeout) + { + int timeout_s = atoi(timeout); + + if (timeout_s > 0) + timeout_us = timeout_s * 1000 * 1000; + } + + /* + * Set up line buffering for our output, to let stderr interleave in the + * log files. + */ + setvbuf(stdout, NULL, PG_IOLBF, 0); + + test_set_timer(); + test_register_socket(); + + printf("1..%d\n", num_tests); + return 0; +} + +#else /* !USE_ASSERT_CHECKING */ + +/* + * Skip the test suite when we don't have assertions. + */ +int +main(int argc, char *argv[]) +{ + printf("1..0 # skip: cassert is not enabled\n"); + + return 0; +} + +#endif /* USE_ASSERT_CHECKING */ diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index dca44fdc5d2..f93124b1b23 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -55,6 +55,8 @@ static int pqPutMsgBytes(const void *buf, size_t len, PGconn *conn); static int pqSendSome(PGconn *conn, int len); static int pqSocketCheck(PGconn *conn, int forRead, int forWrite, pg_usec_time_t end_time); +static int pqReadData_internal(PGconn *conn); +static int pqDrainPending(PGconn *conn); /* * PQlibVersion: return the libpq version number @@ -593,6 +595,13 @@ pqPutMsgEnd(PGconn *conn) /* ---------- * pqReadData: read more data, if any is available + * + * Upon a successful return, callers may assume that either 1) all available + * bytes have been consumed from the socket, or 2) the socket is still marked + * readable by the OS. (In other words: after a successful pqReadData, it's + * safe to tell a client to poll for readable bytes on the socket without any + * further draining of the SSL/GSS transport buffers.) + * * Possible return values: * 1: successfully loaded at least one more byte * 0: no data is presently available, but no error detected @@ -605,8 +614,7 @@ pqPutMsgEnd(PGconn *conn) int pqReadData(PGconn *conn) { - int someread = 0; - int nread; + int available; if (conn->sock == PGINVALID_SOCKET) { @@ -614,6 +622,40 @@ pqReadData(PGconn *conn) return -1; } + available = pqReadData_internal(conn); + if (available < 0) + return -1; + else if (available > 0) + { + /* + * Make sure there are no bytes stuck in layers between conn->inBuffer + * and the socket, to make it safe for clients to poll on PQsocket(). + */ + if (pqDrainPending(conn)) + return -1; + } + else + { + /* + * If we're not returning any bytes from the underlying transport, + * that must imply there aren't any in the transport buffer... + */ + Assert(pqsecure_bytes_pending(conn) == 0); + } + + return available; +} + +/* + * Workhorse for pqReadData(). It's kept separate from the pqDrainPending() + * logic to avoid adding to this function's goto complexity. + */ +static int +pqReadData_internal(PGconn *conn) +{ + int someread = 0; + int nread; + /* Left-justify any data in the buffer to make room */ if (conn->inStart < conn->inEnd) { @@ -800,6 +842,110 @@ pqReadData(PGconn *conn) return -1; } +/*--- + * Drain any transport data that is already buffered in userspace and add it + * to conn->inBuffer, enlarging inBuffer if necessary. The drain fails if + * inBuffer cannot be made to hold all available transport data. + * + * We assume that the underlying secure transport implementation does not + * attempt to read any more data from the socket while draining the transport + * buffer. After a successful return, pqsecure_bytes_pending() must be zero. + * + * This operation is necessary to prevent deadlock, due to a layering + * violation designed into our asynchronous client API: pqReadData() and all + * the parsing routines above it receive data from the SSL/GSS transport + * buffer, but clients poll on the raw PQsocket() handle. So data can be + * "lost" in the intermediate layer if we don't take it out here. + * + * To illustrate what we're trying to prevent, say that the server is sending + * two messages at once in response to a query (Aaaa and Bb), the libpq buffer + * is five characters in size, and TLS records max out at three-character + * payloads. Here's what would happen if pqReadData() didn't call + * pqDrainPending(): + * + * Client libpq SSL Socket + * | | | | + * | [ ] [ ] [ ] [1] Buffers are empty, client is + * x --------------------------> | polling on socket + * | | | | + * | [ ] [ ] [xxx] [2] First record is received; poll + * | <-------------------------- | signals read-ready + * | | | | + * x ---> [ ] [ ] [xxx] [3] Client calls PQconsumeInput() + * | | | | + * | [ ] -> [ ] [xxx] [4] libpq calls pqReadData() to fill + * | | | | the receive buffer + * | [ ] [Aaa] <-- [ ] [5] SSL pulls payload off the wire + * | | | | and decrypts it + * | [Aaa ] <- [ ] [ ] [6] pqsecure_read() takes all data + * | | | | + * | <--- [Aaa ] [ ] [ ] [7] PQconsumeInput() returns with a + * x --------------------------> | partial message, PQisBusy() is + * | | | | still true, client polls again + * | [Aaa ] [ ] [xxx] [8] Second record is received; poll + * | <-------------------------- | signals read-ready + * | | | | + * x ---> [Aaa ] [ ] [xxx] [9] Client calls PQconsumeInput() + * | | | | + * | [Aaa ] -> [ ] [xxx] [10] libpq calls pqReadData() to fill + * | | | | the receive buffer + * | [Aaa ] [aBb] <-- [ ] [11] SSL decrypts + * | | | | + * | [AaaaB] <- [b ] [ ] [12] pqsecure_read() fills its + * | | | | buffer, taking only two bytes + * | <--- [AaaaB] [b ] [ ] [13] PQconsumeInput() returns with a + * | | | | complete message buffered; + * | | | | PQisBusy() is false + * x ---> [AaaaB] [b ] [ ] [14] Client calls PQgetResult() + * | | | | + * | <--- [B ] [b ] [ ] [15] Aaaa is returned; PQisBusy() is + * x --------------------------> | true and client polls again + * . | | . + * . [B ] [b ] . [16] No packets, and client hangs. + * . | | . + * + * The pqDrainPending() call fixes the above scenario at step [13]. Before + * returning to the Client, it first expands the libpq buffer and moves the + * remaining data from the SSL buffer to the libpq buffer. + * + * The function returns 0 on success and -1 on error. Success means that + * there was no data pending or it was successfully drained to conn->inBuffer. + * On error, conn->errorMessage is set. + */ +static int +pqDrainPending(PGconn *conn) +{ + ssize_t bytes_pending; + ssize_t nread; + + bytes_pending = pqsecure_bytes_pending(conn); + if (bytes_pending <= 0) + return bytes_pending; + + /* Expand the input buffer if necessary. */ + if (pqCheckInBufferSpace(conn->inEnd + (size_t) bytes_pending, conn)) + return -1; /* errorMessage already set */ + + nread = pqsecure_read(conn, conn->inBuffer + conn->inEnd, + bytes_pending); + + /* + * When there are bytes pending, pqsecure_read() is not supposed to fail + * or do a short read, but let's check anyway to be safe. + */ + if (nread < 0) + return -1; + conn->inEnd += nread; + if (nread != bytes_pending) + { + libpq_append_conn_error(conn, + "drained only %zd of %zd pending bytes in transport buffer", + nread, bytes_pending); + return -1; + } + return 0; +} + /* * pqSendSome: send data waiting in the output buffer. * @@ -1099,14 +1245,12 @@ pqSocketCheck(PGconn *conn, int forRead, int forWrite, pg_usec_time_t end_time) return -1; } -#ifdef USE_SSL - /* Check for SSL library buffering read bytes */ - if (forRead && conn->ssl_in_use && pgtls_read_pending(conn)) + /* Check for SSL/GSS library buffering read bytes */ + if (forRead && pqsecure_bytes_pending(conn) != 0) { /* short-circuit the select */ return 1; } -#endif } /* We will retry as long as we get EINTR */ diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index 45b80455b0f..0b9f111f41e 100644 --- a/src/interfaces/libpq/fe-protocol3.c +++ b/src/interfaces/libpq/fe-protocol3.c @@ -42,7 +42,8 @@ (id) == PqMsg_FunctionCallResponse || \ (id) == PqMsg_NoticeResponse || \ (id) == PqMsg_NotificationResponse || \ - (id) == PqMsg_RowDescription) + (id) == PqMsg_RowDescription || \ + (id) == PqMsg_ParameterDescription) static void handleFatalError(PGconn *conn); @@ -1880,6 +1881,13 @@ getCopyDataMessage(PGconn *conn) return -1; } + /* + * An error may have been triggered while processing the message, + * report it if it's the case + */ + if (conn->error_result && conn->status == CONNECTION_BAD) + return -2; + /* Drop the processed message and loop around for another */ pqParseDone(conn, conn->inCursor); } @@ -2374,6 +2382,13 @@ pqFunctionCall3(PGconn *conn, Oid fnid, return pqPrepareAsyncResult(conn); } + /* + * An error may have been triggered while processing the message, bail + * out + */ + if (conn->error_result && conn->status == CONNECTION_BAD) + return pqPrepareAsyncResult(conn); + /* Completed parsing this message, keep going */ pqParseDone(conn, conn->inStart + 5 + msgLength); needInput = false; diff --git a/src/interfaces/libpq/fe-secure-gssapi.c b/src/interfaces/libpq/fe-secure-gssapi.c index 843b31e175f..05abdbffcc6 100644 --- a/src/interfaces/libpq/fe-secure-gssapi.c +++ b/src/interfaces/libpq/fe-secure-gssapi.c @@ -471,6 +471,13 @@ gss_read(PGconn *conn, void *recv_buffer, size_t length, ssize_t *ret) return PGRES_POLLING_OK; } +ssize_t +pg_GSS_bytes_pending(PGconn *conn) +{ + Assert(PqGSSResultLength >= PqGSSResultNext); + return (ssize_t) (PqGSSResultLength - PqGSSResultNext); +} + /* * Negotiate GSSAPI transport for a connection. When complete, returns * PGRES_POLLING_OK. Will return PGRES_POLLING_READING or diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index d2045c73ae6..5fe1da4ad38 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "libpq-fe.h" #include "fe-auth.h" @@ -67,7 +68,7 @@ static int verify_cb(int ok, X509_STORE_CTX *ctx); static int openssl_verify_peer_name_matches_certificate_name(PGconn *conn, - ASN1_STRING *name_entry, + const ASN1_STRING *name_entry, char **store_name); static int openssl_verify_peer_name_matches_certificate_ip(PGconn *conn, ASN1_OCTET_STRING *addr_entry, @@ -230,10 +231,40 @@ pgtls_read(PGconn *conn, void *ptr, size_t len) return n; } -bool -pgtls_read_pending(PGconn *conn) +ssize_t +pgtls_bytes_pending(PGconn *conn) { - return SSL_pending(conn->ssl) > 0; + int pending; + + /* + * OpenSSL readahead is documented to break SSL_pending(). Plus, we can't + * afford to have OpenSSL take bytes off the socket without processing + * them; that breaks the postconditions for pqsecure_drain_pending(). + */ + Assert(!SSL_get_read_ahead(conn->ssl)); + + pending = SSL_pending(conn->ssl); + if (pending < 0) + { + /* shouldn't be possible */ + Assert(false); + libpq_append_conn_error(conn, "OpenSSL reports negative bytes pending"); + return -1; + } + else if (pending == INT_MAX) + { + /* + * If we ever found a legitimate way to hit this, we'd need to loop + * around in the caller to call pgtls_bytes_pending() again. Throw an + * error rather than complicate the code in that way, because + * SSL_read() should be bounded to the size of a single TLS record, + * and conn->inBuffer can't currently go past INT_MAX in size anyway. + */ + libpq_append_conn_error(conn, "OpenSSL reports INT_MAX bytes pending"); + return -1; + } + + return (ssize_t) pending; } ssize_t @@ -467,7 +498,8 @@ cert_cb(SSL *ssl, void *arg) * into a plain C string. */ static int -openssl_verify_peer_name_matches_certificate_name(PGconn *conn, ASN1_STRING *name_entry, +openssl_verify_peer_name_matches_certificate_name(PGconn *conn, + const ASN1_STRING *name_entry, char **store_name) { int len; @@ -650,14 +682,14 @@ pgtls_verify_peer_name_matches_certificate_guts(PGconn *conn, */ if (check_cn) { - X509_NAME *subject_name; + const X509_NAME *subject_name; subject_name = X509_get_subject_name(conn->peer); if (subject_name != NULL) { int cn_index; - cn_index = X509_NAME_get_index_by_NID(subject_name, + cn_index = X509_NAME_get_index_by_NID(unconstify(X509_NAME *, subject_name), NID_commonName, -1); if (cn_index >= 0) { diff --git a/src/interfaces/libpq/fe-secure.c b/src/interfaces/libpq/fe-secure.c index e686681ba15..3e161506a37 100644 --- a/src/interfaces/libpq/fe-secure.c +++ b/src/interfaces/libpq/fe-secure.c @@ -243,6 +243,30 @@ pqsecure_raw_read(PGconn *conn, void *ptr, size_t len) return n; } +/* + * Return the number of bytes available in the transport buffer. + * + * If pqsecure_read() is called for this number of bytes, it's guaranteed to + * return successfully with the same number of bytes, without reading from the + * underlying socket. See pqDrainPending() for a more complete discussion of + * the concepts involved. + */ +ssize_t +pqsecure_bytes_pending(PGconn *conn) +{ +#ifdef USE_SSL + if (conn->ssl_in_use) + return pgtls_bytes_pending(conn); +#endif +#ifdef ENABLE_GSS + if (conn->gssenc) + return pg_GSS_bytes_pending(conn); +#endif + + /* Plaintext connections have no transport buffer. */ + return 0; +} + /* * Write data to a secure connection. * diff --git a/src/interfaces/libpq/fe-trace.c b/src/interfaces/libpq/fe-trace.c index fae5b47e551..f97319c5d96 100644 --- a/src/interfaces/libpq/fe-trace.c +++ b/src/interfaces/libpq/fe-trace.c @@ -452,11 +452,12 @@ pqTraceOutput_CopyOutResponse(FILE *f, const char *message, int *cursor) } static void -pqTraceOutput_BackendKeyData(FILE *f, const char *message, int *cursor, bool regress) +pqTraceOutput_BackendKeyData(FILE *f, const char *message, int *cursor, int length, + bool regress) { fprintf(f, "BackendKeyData\t"); pqTraceOutputInt32(f, message, cursor, regress); - pqTraceOutputInt32(f, message, cursor, regress); + pqTraceOutputNchar(f, length - *cursor + 1, message, cursor, regress); } static void @@ -762,7 +763,8 @@ pqTraceOutputMessage(PGconn *conn, const char *message, bool toServer) /* No message content */ break; case PqMsg_BackendKeyData: - pqTraceOutput_BackendKeyData(conn->Pfdebug, message, &logCursor, regress); + pqTraceOutput_BackendKeyData(conn->Pfdebug, message, &logCursor, + length, regress); break; case PqMsg_NoData: fprintf(conn->Pfdebug, "NoData"); @@ -876,7 +878,8 @@ pqTraceOutputNoTypeByteMessage(PGconn *conn, const char *message) pqTraceOutputInt16(conn->Pfdebug, message, &logCursor); pqTraceOutputInt16(conn->Pfdebug, message, &logCursor); pqTraceOutputInt32(conn->Pfdebug, message, &logCursor, regress); - pqTraceOutputInt32(conn->Pfdebug, message, &logCursor, regress); + pqTraceOutputNchar(conn->Pfdebug, length - logCursor, message, + &logCursor, regress); } else if (version == NEGOTIATE_SSL_CODE) { diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index c1a72952ff3..3d2a9f671f3 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -821,6 +821,7 @@ extern int pqWriteReady(PGconn *conn); extern PostgresPollingStatusType pqsecure_open_client(PGconn *); extern void pqsecure_close(PGconn *); extern ssize_t pqsecure_read(PGconn *, void *ptr, size_t len); +extern ssize_t pqsecure_bytes_pending(PGconn *); extern ssize_t pqsecure_write(PGconn *, const void *ptr, size_t len); extern ssize_t pqsecure_raw_read(PGconn *, void *ptr, size_t len); extern ssize_t pqsecure_raw_write(PGconn *, const void *ptr, size_t len); @@ -857,9 +858,9 @@ extern void pgtls_close(PGconn *conn); extern ssize_t pgtls_read(PGconn *conn, void *ptr, size_t len); /* - * Is there unread data waiting in the SSL read buffer? + * Return the number of bytes available in the transport buffer. */ -extern bool pgtls_read_pending(PGconn *conn); +extern ssize_t pgtls_bytes_pending(PGconn *conn); /* * Write data to a secure connection. @@ -907,6 +908,7 @@ extern PostgresPollingStatusType pqsecure_open_gss(PGconn *conn); */ extern ssize_t pg_GSS_write(PGconn *conn, const void *ptr, size_t len); extern ssize_t pg_GSS_read(PGconn *conn, void *ptr, size_t len); +extern ssize_t pg_GSS_bytes_pending(PGconn *conn); #endif /* === in fe-trace.c === */ diff --git a/src/interfaces/libpq/po/de.po b/src/interfaces/libpq/po/de.po index 7f3a1bd8172..c3fc1a10439 100644 --- a/src/interfaces/libpq/po/de.po +++ b/src/interfaces/libpq/po/de.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 18\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-04 18:40+0000\n" -"PO-Revision-Date: 2026-02-06 12:38+0100\n" +"POT-Creation-Date: 2026-08-08 06:10+0000\n" +"PO-Revision-Date: 2026-08-08 09:46+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,122 +17,122 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../libpq-oauth/oauth-curl.c:308 ../libpq-oauth/oauth-curl.c:2011 +#: ../libpq-oauth/oauth-curl.c:309 ../libpq-oauth/oauth-curl.c:2012 #, c-format msgid "libcurl easy handle removal failed: %s" msgstr "libcurl-Easy-Handle-Removal fehlgeschlagen: %s" -#: ../libpq-oauth/oauth-curl.c:328 +#: ../libpq-oauth/oauth-curl.c:329 #, c-format msgid "libcurl multi handle cleanup failed: %s" msgstr "libcurl-Multi-Handle-Cleanup fehlgeschlagen: %s" -#: ../libpq-oauth/oauth-curl.c:394 ../libpq-oauth/oauth-curl.c:405 +#: ../libpq-oauth/oauth-curl.c:395 ../libpq-oauth/oauth-curl.c:406 #, c-format msgid "failed to set %s on OAuth connection: %s" msgstr "konnte %s nicht setzen für die OAuth-Verbindung: %s" -#: ../libpq-oauth/oauth-curl.c:416 +#: ../libpq-oauth/oauth-curl.c:417 #, c-format msgid "failed to get %s from OAuth response: %s" msgstr "konnte %s nicht ermitteln aus der OAuth-Antwort: %s" -#: ../libpq-oauth/oauth-curl.c:485 fe-auth-oauth.c:209 fe-auth-oauth.c:271 +#: ../libpq-oauth/oauth-curl.c:486 fe-auth-oauth.c:209 fe-auth-oauth.c:271 #: fe-auth-oauth.c:333 #, c-format msgid "field \"%s\" must be a string" msgstr "Feld »%s« muss eine Zeichenkette sein" -#: ../libpq-oauth/oauth-curl.c:489 +#: ../libpq-oauth/oauth-curl.c:490 #, c-format msgid "field \"%s\" must be a number" msgstr "Feld »%s« muss eine Zahl sein" -#: ../libpq-oauth/oauth-curl.c:493 +#: ../libpq-oauth/oauth-curl.c:494 #, c-format msgid "field \"%s\" must be an array of strings" msgstr "Feld »%s« muss ein Array von Zeichenketten sein" -#: ../libpq-oauth/oauth-curl.c:498 +#: ../libpq-oauth/oauth-curl.c:499 #, c-format msgid "field \"%s\" has unexpected type" msgstr "Feld »%s« hat unerwarteten Typ" -#: ../libpq-oauth/oauth-curl.c:522 ../libpq-oauth/oauth-curl.c:632 +#: ../libpq-oauth/oauth-curl.c:523 ../libpq-oauth/oauth-curl.c:633 #: fe-auth-oauth.c:215 fe-auth-oauth.c:277 #, c-format msgid "JSON is too deeply nested" msgstr "JSON ist zu tief geschachtelt" -#: ../libpq-oauth/oauth-curl.c:574 fe-auth-oauth.c:324 +#: ../libpq-oauth/oauth-curl.c:575 fe-auth-oauth.c:324 #, c-format msgid "field \"%s\" is duplicated" msgstr "Feld »%s« ist doppelt vorhanden" -#: ../libpq-oauth/oauth-curl.c:614 ../libpq-oauth/oauth-curl.c:674 +#: ../libpq-oauth/oauth-curl.c:615 ../libpq-oauth/oauth-curl.c:675 #: fe-auth-oauth.c:264 fe-auth-oauth.c:298 #, c-format msgid "top-level element must be an object" msgstr "Element auf oberster Ebene muss ein Objekt sein" -#: ../libpq-oauth/oauth-curl.c:777 +#: ../libpq-oauth/oauth-curl.c:778 #, c-format msgid "no content type was provided" msgstr "kein Content-Typ wurde angegeben" -#: ../libpq-oauth/oauth-curl.c:816 +#: ../libpq-oauth/oauth-curl.c:817 #, c-format msgid "unexpected content type: \"%s\"" msgstr "unerwarteter Content-Typ: »%s«" -#: ../libpq-oauth/oauth-curl.c:841 +#: ../libpq-oauth/oauth-curl.c:842 #, c-format msgid "response contains embedded NULLs" msgstr "Antwort enthält Null-Bytes" -#: ../libpq-oauth/oauth-curl.c:851 +#: ../libpq-oauth/oauth-curl.c:852 #, c-format msgid "response is not valid UTF-8" msgstr "Antwort ist kein gültiges UTF-8" -#: ../libpq-oauth/oauth-curl.c:891 +#: ../libpq-oauth/oauth-curl.c:892 #, c-format msgid "field \"%s\" is missing" msgstr "Feld »%s« fehlt" -#: ../libpq-oauth/oauth-curl.c:1097 +#: ../libpq-oauth/oauth-curl.c:1098 msgid "failed to parse token error response" msgstr "konnte Token-Fehler-Antwort nicht parsen" -#: ../libpq-oauth/oauth-curl.c:1125 +#: ../libpq-oauth/oauth-curl.c:1126 #, c-format msgid "provider rejected the oauth_client_secret" msgstr "Provider hat das oauth_client_secret abgelehnt" -#: ../libpq-oauth/oauth-curl.c:1126 +#: ../libpq-oauth/oauth-curl.c:1127 #, c-format msgid "provider requires client authentication, and no oauth_client_secret is set" msgstr "Provider erfordert Client-Authentifizierung, aber kein oauth_client_secret ist gesetzt" -#: ../libpq-oauth/oauth-curl.c:1559 +#: ../libpq-oauth/oauth-curl.c:1560 #, c-format msgid "checking timer expiration: %m" msgstr "prüfe Ablauf des Timers: %m" -#: ../libpq-oauth/oauth-curl.c:1721 +#: ../libpq-oauth/oauth-curl.c:1722 #, c-format msgid "failed to create libcurl multi handle" msgstr "konnte libcurl-Multi-Handle nicht erzeugen" -#: ../libpq-oauth/oauth-curl.c:1741 +#: ../libpq-oauth/oauth-curl.c:1742 #, c-format msgid "failed to create libcurl handle" msgstr "konnte libcurl-Handle nicht erzeugen" -#: ../libpq-oauth/oauth-curl.c:1825 ../libpq-oauth/oauth-curl.c:1866 -#: ../libpq-oauth/oauth-curl.c:2184 ../libpq-oauth/oauth-curl.c:2345 -#: ../libpq-oauth/oauth-curl.c:2406 ../libpq-oauth/oauth-curl.c:2495 -#: ../libpq-oauth/oauth-curl.c:2789 ../libpq-oauth/oauth-curl.c:3006 +#: ../libpq-oauth/oauth-curl.c:1826 ../libpq-oauth/oauth-curl.c:1867 +#: ../libpq-oauth/oauth-curl.c:2185 ../libpq-oauth/oauth-curl.c:2346 +#: ../libpq-oauth/oauth-curl.c:2407 ../libpq-oauth/oauth-curl.c:2496 +#: ../libpq-oauth/oauth-curl.c:2802 ../libpq-oauth/oauth-curl.c:3036 #: fe-auth-oauth.c:146 fe-auth-oauth.c:489 fe-auth-oauth.c:561 #: fe-auth-oauth.c:723 fe-auth-oauth.c:1016 fe-auth-oauth.c:1029 #: fe-auth-oauth.c:1117 fe-auth-oauth.c:1130 fe-auth-oauth.c:1266 @@ -146,77 +146,77 @@ msgstr "konnte libcurl-Handle nicht erzeugen" #: fe-connect.c:6210 fe-connect.c:6308 fe-connect.c:6559 fe-connect.c:6586 #: fe-connect.c:6662 fe-connect.c:6685 fe-connect.c:6709 fe-connect.c:6744 #: fe-connect.c:6830 fe-connect.c:6838 fe-connect.c:7195 fe-connect.c:7377 -#: fe-exec.c:530 fe-exec.c:1331 fe-exec.c:3270 fe-exec.c:4341 fe-exec.c:4534 -#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:212 fe-protocol3.c:235 -#: fe-protocol3.c:258 fe-protocol3.c:275 fe-protocol3.c:296 fe-protocol3.c:370 -#: fe-protocol3.c:751 fe-protocol3.c:991 fe-protocol3.c:1556 -#: fe-protocol3.c:1610 fe-protocol3.c:1656 fe-protocol3.c:1677 -#: fe-protocol3.c:1934 fe-protocol3.c:2335 fe-secure-common.c:110 -#: fe-secure-gssapi.c:508 fe-secure-gssapi.c:699 fe-secure-openssl.c:405 -#: fe-secure-openssl.c:1135 +#: fe-exec.c:531 fe-exec.c:1332 fe-exec.c:3285 fe-exec.c:4335 fe-exec.c:4528 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:214 fe-protocol3.c:237 +#: fe-protocol3.c:260 fe-protocol3.c:277 fe-protocol3.c:298 fe-protocol3.c:372 +#: fe-protocol3.c:753 fe-protocol3.c:993 fe-protocol3.c:1558 +#: fe-protocol3.c:1612 fe-protocol3.c:1658 fe-protocol3.c:1679 +#: fe-protocol3.c:1943 fe-protocol3.c:2355 fe-secure-common.c:110 +#: fe-secure-gssapi.c:515 fe-secure-gssapi.c:706 fe-secure-openssl.c:436 +#: fe-secure-openssl.c:1167 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../libpq-oauth/oauth-curl.c:1853 +#: ../libpq-oauth/oauth-curl.c:1854 #, c-format msgid "response is too large" msgstr "Antwort ist zu groß" -#: ../libpq-oauth/oauth-curl.c:1895 +#: ../libpq-oauth/oauth-curl.c:1896 #, c-format msgid "failed to queue HTTP request: %s" msgstr "Einreihen der HTTP-Anfrage fehlgeschlagen: %s" -#: ../libpq-oauth/oauth-curl.c:1912 ../libpq-oauth/oauth-curl.c:1970 +#: ../libpq-oauth/oauth-curl.c:1913 ../libpq-oauth/oauth-curl.c:1971 #, c-format msgid "asynchronous HTTP request failed: %s" msgstr "asynchrone HTTP-Anfrage fehlgeschlagen: %s" -#: ../libpq-oauth/oauth-curl.c:2022 +#: ../libpq-oauth/oauth-curl.c:2023 #, c-format msgid "no result was retrieved for the finished handle" msgstr "für die abgeschlossene Handle wurde kein Ergebnis abgerufen" -#: ../libpq-oauth/oauth-curl.c:2155 ../libpq-oauth/oauth-curl.c:2461 -#: ../libpq-oauth/oauth-curl.c:2540 +#: ../libpq-oauth/oauth-curl.c:2156 ../libpq-oauth/oauth-curl.c:2462 +#: ../libpq-oauth/oauth-curl.c:2541 #, c-format msgid "unexpected response code %ld" msgstr "unerwarteter Antwortcode %ld" -#: ../libpq-oauth/oauth-curl.c:2162 +#: ../libpq-oauth/oauth-curl.c:2163 msgid "failed to parse OpenID discovery document" msgstr "konnte OpenID-Discovery-Dokument nicht parsen" -#: ../libpq-oauth/oauth-curl.c:2227 +#: ../libpq-oauth/oauth-curl.c:2228 #, c-format msgid "the issuer identifier (%s) does not match oauth_issuer (%s)" msgstr "der Issuer-Identifier (%s) stimmt nicht mit oauth_issuer (%s) überein" -#: ../libpq-oauth/oauth-curl.c:2254 +#: ../libpq-oauth/oauth-curl.c:2255 #, c-format msgid "issuer \"%s\" does not provide a device authorization endpoint" msgstr "Issuer »%s« stellt keinen Device-Authorization-Endpunkt zur Verfügung" -#: ../libpq-oauth/oauth-curl.c:2280 +#: ../libpq-oauth/oauth-curl.c:2281 #, c-format msgid "device authorization endpoint \"%s\" must use HTTPS" msgstr "Device-Authorization-Endpunkt »%s« muss HTTPS verwenden" -#: ../libpq-oauth/oauth-curl.c:2289 +#: ../libpq-oauth/oauth-curl.c:2290 #, c-format msgid "token endpoint \"%s\" must use HTTPS" msgstr "Token-Endpunkt »%s« muss HTTPS verwenden" -#: ../libpq-oauth/oauth-curl.c:2430 +#: ../libpq-oauth/oauth-curl.c:2431 msgid "failed to parse device authorization" msgstr "konnte Device-Authorization nicht parsen" -#: ../libpq-oauth/oauth-curl.c:2518 +#: ../libpq-oauth/oauth-curl.c:2519 msgid "failed to parse access token response" msgstr "konnte Access-Token-Antwort nicht parsen" -#: ../libpq-oauth/oauth-curl.c:2598 +#: ../libpq-oauth/oauth-curl.c:2596 #, c-format msgid "slow_down interval overflow" msgstr "slow_down Intervall-Überlauf" @@ -224,27 +224,27 @@ msgstr "slow_down Intervall-Überlauf" #. translator: The first %s is a URL for the user to visit in a #. browser, and the second %s is a code to be copy-pasted there. #. -#: ../libpq-oauth/oauth-curl.c:2634 +#: ../libpq-oauth/oauth-curl.c:2632 #, c-format msgid "Visit %s and enter the code: %s\n" msgstr "Besuchen Sie %s und geben Sie den Code ein: %s\n" -#: ../libpq-oauth/oauth-curl.c:2639 +#: ../libpq-oauth/oauth-curl.c:2637 #, c-format msgid "device prompt failed" msgstr "Device-Prompt fehlgeschlagen" -#: ../libpq-oauth/oauth-curl.c:2695 +#: ../libpq-oauth/oauth-curl.c:2691 #, c-format msgid "curl_global_init previously failed during OAuth setup" msgstr "curl_global_init zuvor beim OAuth-Setup fehlgeschlagen" -#: ../libpq-oauth/oauth-curl.c:2714 +#: ../libpq-oauth/oauth-curl.c:2710 #, c-format msgid "curl_global_init failed during OAuth setup" msgstr "curl_global_init beim OAuth-Setup fehlgeschlagen" -#: ../libpq-oauth/oauth-curl.c:2735 +#: ../libpq-oauth/oauth-curl.c:2732 #, c-format msgid "" "libcurl is no longer thread-safe\n" @@ -259,19 +259,19 @@ msgstr "" "\tberichtet, dass sie nicht thread-safe ist. Kompilieren Sie libpq neu\n" "\tmit der installierten Version von libcurl." -#: ../libpq-oauth/oauth-curl.c:2897 +#: ../libpq-oauth/oauth-curl.c:2910 msgid "failed to fetch OpenID discovery document" msgstr "konnte OpenID-Discovery-Dokument nicht holen" -#: ../libpq-oauth/oauth-curl.c:2911 +#: ../libpq-oauth/oauth-curl.c:2924 msgid "cannot run OAuth device authorization" msgstr "kann OAuth-Device-Authorization nicht ausführen" -#: ../libpq-oauth/oauth-curl.c:2915 +#: ../libpq-oauth/oauth-curl.c:2928 msgid "failed to obtain device authorization" msgstr "konnte Device-Authorization nicht erhalten" -#: ../libpq-oauth/oauth-curl.c:2926 ../libpq-oauth/oauth-curl.c:2977 +#: ../libpq-oauth/oauth-curl.c:2939 ../libpq-oauth/oauth-curl.c:3007 msgid "failed to obtain access token" msgstr "konnte Access-Token nicht erhalten" @@ -710,7 +710,7 @@ msgstr "unbekannter Passwortverschlüsselungsalgorithmus »%s«" msgid "connection pointer is NULL" msgstr "Verbindung ist ein NULL-Zeiger" -#: fe-cancel.c:85 fe-misc.c:613 +#: fe-cancel.c:85 fe-misc.c:621 #, c-format msgid "connection not open" msgstr "Verbindung nicht offen" @@ -1235,8 +1235,8 @@ msgstr "unerwartete Leerzeichen in »%s« gefunden, verwenden Sie stattdessen Pr msgid "connection pointer is NULL\n" msgstr "Verbindung ist ein NULL-Zeiger\n" -#: fe-connect.c:7649 fe-exec.c:718 fe-exec.c:980 fe-exec.c:3475 -#: fe-protocol3.c:1006 fe-protocol3.c:1039 +#: fe-connect.c:7649 fe-exec.c:719 fe-exec.c:981 fe-exec.c:3490 +#: fe-protocol3.c:1008 fe-protocol3.c:1041 msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" @@ -1260,176 +1260,176 @@ msgstr "Passwort wurde aus Datei »%s« gelesen" msgid "invalid integer value \"%s\" for connection option \"%s\"" msgstr "ungültiger Zahlenwert »%s« für Verbindungsoption »%s«" -#: fe-exec.c:469 fe-exec.c:3549 +#: fe-exec.c:470 fe-exec.c:3564 #, 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:531 fe-protocol3.c:2140 +#: fe-exec.c:532 fe-protocol3.c:2149 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:839 +#: fe-exec.c:840 #, c-format msgid "write to server failed" msgstr "Schreiben zum Server fehlgeschlagen" -#: fe-exec.c:879 +#: fe-exec.c:880 #, c-format msgid "no error text available" msgstr "kein Fehlertext verfügbar" -#: fe-exec.c:968 +#: fe-exec.c:969 msgid "NOTICE" msgstr "HINWEIS" -#: fe-exec.c:1026 +#: fe-exec.c:1027 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult kann nicht mehr als INT_MAX Tupel enthalten" -#: fe-exec.c:1038 +#: fe-exec.c:1039 msgid "size_t overflow" msgstr "Überlauf von size_t" -#: fe-exec.c:1454 fe-exec.c:1523 fe-exec.c:1569 +#: fe-exec.c:1455 fe-exec.c:1524 fe-exec.c:1570 #, c-format msgid "command string is a null pointer" msgstr "Befehlszeichenkette ist ein NULL-Zeiger" -#: fe-exec.c:1460 fe-exec.c:3019 +#: fe-exec.c:1461 fe-exec.c:3034 #, c-format msgid "%s not allowed in pipeline mode" msgstr "%s im Pipeline-Modus nicht erlaubt" -#: fe-exec.c:1528 fe-exec.c:1574 fe-exec.c:1668 +#: fe-exec.c:1529 fe-exec.c:1575 fe-exec.c:1669 #, 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:1564 fe-exec.c:1663 +#: fe-exec.c:1565 fe-exec.c:1664 #, c-format msgid "statement name is a null pointer" msgstr "Anweisungsname ist ein NULL-Zeiger" -#: fe-exec.c:1705 fe-exec.c:3395 +#: fe-exec.c:1706 fe-exec.c:3410 #, c-format msgid "no connection to the server" msgstr "keine Verbindung mit dem Server" -#: fe-exec.c:1713 fe-exec.c:3403 +#: fe-exec.c:1714 fe-exec.c:3418 #, c-format msgid "another command is already in progress" msgstr "ein anderer Befehl ist bereits in Ausführung" -#: fe-exec.c:1743 +#: fe-exec.c:1744 #, c-format msgid "cannot queue commands during COPY" msgstr "während COPY können keine Befehle aufgereiht werden" -#: fe-exec.c:1862 +#: fe-exec.c:1863 #, 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:2221 +#: fe-exec.c:2222 #, c-format msgid "unexpected asyncStatus: %d" msgstr "unerwarteter asyncStatus: %d" -#: fe-exec.c:2377 +#: fe-exec.c:2378 #, 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:2394 +#: fe-exec.c:2395 msgid "COPY terminated by new PQexec" msgstr "COPY von neuem PQexec beendet" -#: fe-exec.c:2410 +#: fe-exec.c:2411 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "PQexec ist während COPY BOTH nicht erlaubt" -#: fe-exec.c:2646 +#: fe-exec.c:2647 #, c-format msgid "unrecognized message type \"%c\"" msgstr "unbekannter Message-Typ »%c«" -#: fe-exec.c:2718 fe-exec.c:2772 fe-exec.c:2840 fe-protocol3.c:2071 +#: fe-exec.c:2719 fe-exec.c:2773 fe-exec.c:2841 fe-protocol3.c:2080 #, c-format msgid "no COPY in progress" msgstr "keine COPY in Ausführung" -#: fe-exec.c:3026 +#: fe-exec.c:3041 #, c-format msgid "connection in wrong state" msgstr "Verbindung im falschen Zustand" -#: fe-exec.c:3069 +#: fe-exec.c:3084 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "kann Pipeline-Modus nicht einschalten, Verbindung ist nicht inaktiv" -#: fe-exec.c:3105 fe-exec.c:3126 +#: fe-exec.c:3120 fe-exec.c:3141 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "kann Pipeline-Modus nicht beenden, wegen nicht eingesammelter Ergebnisse" -#: fe-exec.c:3109 +#: fe-exec.c:3124 #, 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:3120 +#: fe-exec.c:3135 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "kann Pipeline-Modus nicht beenden während COPY aktiv ist" -#: fe-exec.c:3319 +#: fe-exec.c:3334 #, 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:3438 +#: fe-exec.c:3453 msgid "invalid ExecStatusType code" msgstr "ungültiger ExecStatusType-Kode" -#: fe-exec.c:3465 +#: fe-exec.c:3480 msgid "PGresult is not an error result\n" msgstr "PGresult ist kein Fehlerresultat\n" -#: fe-exec.c:3533 fe-exec.c:3556 +#: fe-exec.c:3548 fe-exec.c:3571 #, 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:3571 +#: fe-exec.c:3586 #, 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:3882 +#: fe-exec.c:3897 #, c-format msgid "could not interpret result from server: %s" msgstr "konnte Ergebnis vom Server nicht interpretieren: %s" -#: fe-exec.c:4157 fe-exec.c:4292 +#: fe-exec.c:4172 fe-exec.c:4286 #, c-format msgid "incomplete multibyte character" msgstr "unvollständiges Mehrbyte-Zeichen" -#: fe-exec.c:4159 fe-exec.c:4311 +#: fe-exec.c:4174 fe-exec.c:4305 #, c-format msgid "invalid multibyte character" msgstr "ungültiges Mehrbytezeichen" -#: fe-exec.c:4413 +#: fe-exec.c:4407 #, c-format msgid "escaped string size exceeds the maximum allowed (%zu)" msgstr "Größe der escapten Zeichenkette überschreitet erlaubtes Maximum (%zu)" -#: fe-exec.c:4590 +#: fe-exec.c:4584 #, c-format msgid "escaped bytea size exceeds the maximum allowed (%zu)" msgstr "Größe des escapten bytea-Wertes überschreitet erlaubtes Maximum (%zu)" @@ -1480,18 +1480,18 @@ msgstr "konnte nicht in Datei »%s« schreiben: %s" msgid "query to initialize large object functions did not return data" msgstr "Abfrage zur Initialisierung der Large-Object-Funktionen ergab keine Daten" -#: fe-misc.c:239 +#: fe-misc.c:241 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "Integer der Größe %lu wird von pqGetInt nicht unterstützt" -#: fe-misc.c:272 +#: fe-misc.c:274 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "Integer der Größe %lu wird von pqPutInt nicht unterstützt" -#: fe-misc.c:791 fe-secure-openssl.c:181 fe-secure-openssl.c:287 -#: fe-secure.c:222 fe-secure.c:389 +#: fe-misc.c:833 fe-secure-openssl.c:182 fe-secure-openssl.c:318 +#: fe-secure.c:222 fe-secure.c:413 #, c-format msgid "" "server closed the connection unexpectedly\n" @@ -1502,215 +1502,225 @@ msgstr "" "\tDas heißt wahrscheinlich, dass der Server abnormal beendete\n" "\tbevor oder während die Anweisung bearbeitet wurde." -#: fe-misc.c:858 +#: fe-misc.c:942 +#, c-format +msgid "drained only %zd of %zd pending bytes in transport buffer" +msgstr "nur %zd von %zd ausstehenden Bytes im Transportpuffer geleert" + +#: fe-misc.c:1004 msgid "connection not open\n" msgstr "Verbindung nicht offen\n" -#: fe-misc.c:1046 +#: fe-misc.c:1192 #, c-format msgid "timeout expired" msgstr "Timeout abgelaufen" -#: fe-misc.c:1098 +#: fe-misc.c:1244 #, c-format msgid "invalid socket" msgstr "ungültiges Socket" -#: fe-misc.c:1121 +#: fe-misc.c:1265 #, c-format msgid "%s() failed: %s" msgstr "%s() fehlgeschlagen: %s" -#: fe-protocol3.c:190 +#: fe-protocol3.c:192 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "Nachricht vom Typ 0x%02x kam vom Server im Ruhezustand" -#: fe-protocol3.c:403 +#: fe-protocol3.c:405 #, 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:445 +#: fe-protocol3.c:447 #, 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:469 +#: fe-protocol3.c:471 #, 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:504 +#: fe-protocol3.c:506 #, 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:551 fe-protocol3.c:591 +#: fe-protocol3.c:553 fe-protocol3.c:593 msgid "insufficient data in \"T\" message" msgstr "nicht genug Daten in »T«-Nachricht" -#: fe-protocol3.c:662 fe-protocol3.c:868 +#: fe-protocol3.c:664 fe-protocol3.c:870 msgid "out of memory for query result" msgstr "Speicher für Anfrageergebnis aufgebraucht" -#: fe-protocol3.c:731 +#: fe-protocol3.c:733 msgid "insufficient data in \"t\" message" msgstr "nicht genug Daten in »t«-Nachricht" -#: fe-protocol3.c:790 fe-protocol3.c:822 fe-protocol3.c:840 +#: fe-protocol3.c:792 fe-protocol3.c:824 fe-protocol3.c:842 msgid "insufficient data in \"D\" message" msgstr "nicht genug Daten in »D«-Nachricht" -#: fe-protocol3.c:796 +#: fe-protocol3.c:798 msgid "unexpected field count in \"D\" message" msgstr "unerwartete Feldzahl in »D«-Nachricht" -#: fe-protocol3.c:1052 +#: fe-protocol3.c:1054 msgid "no error message available\n" msgstr "keine Fehlermeldung verfügbar\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1100 fe-protocol3.c:1119 +#: fe-protocol3.c:1102 fe-protocol3.c:1121 #, c-format msgid " at character %s" msgstr " bei Zeichen %s" -#: fe-protocol3.c:1132 +#: fe-protocol3.c:1134 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1135 +#: fe-protocol3.c:1137 #, c-format msgid "HINT: %s\n" msgstr "TIP: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1140 #, c-format msgid "QUERY: %s\n" msgstr "ANFRAGE: %s\n" -#: fe-protocol3.c:1145 +#: fe-protocol3.c:1147 #, c-format msgid "CONTEXT: %s\n" msgstr "KONTEXT: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1156 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMANAME: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1160 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABELLENNAME: %s\n" -#: fe-protocol3.c:1162 +#: fe-protocol3.c:1164 #, c-format msgid "COLUMN NAME: %s\n" msgstr "SPALTENNAME: %s\n" -#: fe-protocol3.c:1166 +#: fe-protocol3.c:1168 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATENTYPNAME: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1172 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT-NAME: %s\n" -#: fe-protocol3.c:1182 +#: fe-protocol3.c:1184 msgid "LOCATION: " msgstr "ORT: " -#: fe-protocol3.c:1184 +#: fe-protocol3.c:1186 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1186 +#: fe-protocol3.c:1188 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1394 +#: fe-protocol3.c:1396 #, c-format msgid "LINE %d: " msgstr "ZEILE %d: " -#: fe-protocol3.c:1456 +#: fe-protocol3.c:1458 #, c-format msgid "received invalid protocol negotiation message: server requested downgrade to a higher-numbered version" msgstr "ungültige Protokollverhandlungsnachricht empfangen: Server verlangte Herabstufung auf eine Version mit einer höheren Nummer" -#: fe-protocol3.c:1462 +#: fe-protocol3.c:1464 #, c-format msgid "received invalid protocol negotiation message: server requested downgrade to pre-3.0 protocol version" msgstr "ungültige Protokollverhandlungsnachricht empfangen: Server verlangte Herabstufung auf eine Protokollversion vor 3.0" -#: fe-protocol3.c:1469 +#: fe-protocol3.c:1471 #, c-format msgid "received invalid protocol negotiation message: server requested downgrade to non-existent 3.1 protocol version" msgstr "ungültige Protokollverhandlungsnachricht empfangen: Server verlangte Herabstufung auf nicht existierende Protokollversion 3.1" -#: fe-protocol3.c:1475 +#: fe-protocol3.c:1477 #, c-format msgid "received invalid protocol negotiation message: server reported negative number of unsupported parameters" msgstr "ungültige Protokollverhandlungsnachricht empfangen: Server berichtete eine negative Anzahl nicht unterstützter Parameter" -#: fe-protocol3.c:1481 +#: fe-protocol3.c:1483 #, c-format msgid "received invalid protocol negotiation message: server negotiated but asks for no changes" msgstr "ungültige Protokollverhandlungsnachricht empfangen: Server hat verhandelt aber keine Änderungen verlangt" -#: fe-protocol3.c:1487 +#: fe-protocol3.c:1489 #, c-format msgid "server only supports protocol version %d.%d, but \"%s\" was set to %d.%d" msgstr "Server unterstützt nur Protokollversion %d.%d, aber »%s« war auf %d.%d gesetzt" -#: fe-protocol3.c:1512 +#: fe-protocol3.c:1514 #, c-format msgid "received invalid protocol negotiation message: server reported unsupported parameter name without a \"%s\" prefix (\"%s\")" msgstr "ungültige Protokollverhandlungsnachricht empfangen: Server sendete nicht unterstützten Parameter ohne Präfix »%s« (»%s«)" -#: fe-protocol3.c:1515 +#: fe-protocol3.c:1517 #, c-format msgid "received invalid protocol negotiation message: server reported an unsupported parameter that was not requested (\"%s\")" msgstr "ungültige Protokollverhandlungsnachricht empfangen: Server sendete nicht unterstützten Parameter, der nicht angefordert war (»%s«)" -#: fe-protocol3.c:1522 +#: fe-protocol3.c:1524 #, c-format msgid "received invalid protocol negotiation message: message too short" msgstr "ungültige Protokollverhandlungsnachricht empfangen: Nachricht zu kurz" -#: fe-protocol3.c:1588 +#: fe-protocol3.c:1590 #, c-format msgid "received invalid BackendKeyData message: cancel key with length %d not allowed in protocol version 3.0 (must be 4 bytes)" msgstr "ungültige BackendKeyData-Nachricht empfangen: Stornierungsschlüssel mit Länge %d nicht erlaubt in Protokoll 3.0 (muss 4 Bytes sein)" -#: fe-protocol3.c:1595 +#: fe-protocol3.c:1597 #, c-format msgid "received invalid BackendKeyData message: cancel key with length %d is too short (minimum 4 bytes)" msgstr "ungültige BackendKeyData-Nachricht empfangen: Stornierungsschlüssel mit Länge %d ist zu kurz (Minimum 4 Bytes)" -#: fe-protocol3.c:1602 +#: fe-protocol3.c:1604 #, c-format msgid "received invalid BackendKeyData message: cancel key with length %d is too long (maximum 256 bytes)" msgstr "ungültige BackendKeyData-Nachricht empfangen: Stornierungsschlüssel mit Länge %d ist zu lang (Maximum 256 Bytes)" -#: fe-protocol3.c:1966 +#: fe-protocol3.c:1975 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline: Text COPY OUT nicht ausgeführt" -#: fe-protocol3.c:2341 +#: fe-protocol3.c:2306 +#, c-format +msgid "server returned too much data" +msgstr "Server hat zu viele Daten zurückgesendet" + +#: fe-protocol3.c:2361 #, c-format msgid "protocol error: no function result" msgstr "Protokollfehler: kein Funktionsergebnis" -#: fe-protocol3.c:2353 +#: fe-protocol3.c:2373 #, c-format msgid "protocol error: id=0x%x" msgstr "Protokollfehler: id=0x%x" @@ -1761,12 +1771,12 @@ msgstr "GSSAPI-Wrap-Fehler" 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:726 +#: fe-secure-gssapi.c:215 fe-secure-gssapi.c:733 #, 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:354 fe-secure-gssapi.c:602 +#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:609 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" msgstr "übergroßes GSSAPI-Paket vom Server gesendet (%zu > %zu)" @@ -1780,110 +1790,120 @@ msgstr "GSSAPI-Unwrap-Fehler" msgid "incoming GSSAPI message did not use confidentiality" msgstr "eingehende GSSAPI-Nachricht verwendete keine Vertraulichkeit" -#: fe-secure-gssapi.c:665 +#: fe-secure-gssapi.c:672 msgid "could not initiate GSSAPI security context" msgstr "konnte GSSAPI-Sicherheitskontext nicht initiieren" -#: fe-secure-gssapi.c:715 +#: fe-secure-gssapi.c:722 msgid "GSSAPI size check error" msgstr "GSSAPI-Fehler bei der Größenprüfung" -#: fe-secure-openssl.c:185 fe-secure-openssl.c:291 fe-secure-openssl.c:1382 +#: fe-secure-openssl.c:186 fe-secure-openssl.c:322 fe-secure-openssl.c:1414 #, c-format msgid "SSL SYSCALL error: %s" msgstr "SSL-SYSCALL-Fehler: %s" -#: fe-secure-openssl.c:191 fe-secure-openssl.c:297 fe-secure-openssl.c:1385 +#: fe-secure-openssl.c:192 fe-secure-openssl.c:328 fe-secure-openssl.c:1417 #, c-format msgid "SSL SYSCALL error: EOF detected" msgstr "SSL-SYSCALL-Fehler: Dateiende entdeckt" -#: fe-secure-openssl.c:201 fe-secure-openssl.c:307 fe-secure-openssl.c:1393 +#: fe-secure-openssl.c:202 fe-secure-openssl.c:338 fe-secure-openssl.c:1425 #, c-format msgid "SSL error: %s" msgstr "SSL-Fehler: %s" -#: fe-secure-openssl.c:215 fe-secure-openssl.c:321 +#: fe-secure-openssl.c:216 fe-secure-openssl.c:352 #, c-format msgid "SSL connection has been closed unexpectedly" msgstr "SSL-Verbindung wurde unerwartet geschlossen" -#: fe-secure-openssl.c:220 fe-secure-openssl.c:326 fe-secure-openssl.c:1440 +#: fe-secure-openssl.c:221 fe-secure-openssl.c:357 fe-secure-openssl.c:1472 #, c-format msgid "unrecognized SSL error code: %d" msgstr "unbekannter SSL-Fehlercode: %d" -#: fe-secure-openssl.c:368 +#: fe-secure-openssl.c:251 +#, c-format +msgid "OpenSSL reports negative bytes pending" +msgstr "OpenSSL meldet eine negative Anzahl ausstehender Bytes" + +#: fe-secure-openssl.c:263 +#, c-format +msgid "OpenSSL reports INT_MAX bytes pending" +msgstr "OpenSSL meldet INT_MAX ausstehende Bytes" + +#: fe-secure-openssl.c:399 #, c-format msgid "could not determine server certificate signature algorithm" msgstr "konnte Signaturalgorithmus des Serverzertifikats nicht ermitteln" -#: fe-secure-openssl.c:388 +#: fe-secure-openssl.c:419 #, c-format msgid "could not find digest for NID %s" msgstr "konnte Digest für NID %s nicht finden" -#: fe-secure-openssl.c:397 +#: fe-secure-openssl.c:428 #, c-format msgid "could not generate peer certificate hash" msgstr "konnte Hash des Zertifikats der Gegenstelle nicht erzeugen" -#: fe-secure-openssl.c:479 +#: fe-secure-openssl.c:511 #, c-format msgid "SSL certificate's name entry is missing" msgstr "Namenseintrag fehlt im SSL-Zertifikat" -#: fe-secure-openssl.c:509 +#: fe-secure-openssl.c:541 #, c-format msgid "SSL certificate's address entry is missing" msgstr "Adresseintrag fehlt im SSL-Zertifikat" -#: fe-secure-openssl.c:715 +#: fe-secure-openssl.c:747 #, c-format msgid "WARNING: could not open SSL key logging file \"%s\": %m\n" msgstr "WARNUNG: konnte SSL-Key-Logging-Datei »%s« nicht öffnen: %m\n" -#: fe-secure-openssl.c:723 +#: fe-secure-openssl.c:755 #, c-format msgid "WARNING: could not write to SSL key logging file \"%s\": %m\n" msgstr "WARNUNG: konnte nicht in SSL-Key-Logging-Datei »%s «schreiben: %m\n" -#: fe-secure-openssl.c:776 +#: fe-secure-openssl.c:808 #, c-format msgid "could not create SSL context: %s" msgstr "konnte SSL-Kontext nicht erzeugen: %s" -#: fe-secure-openssl.c:818 +#: fe-secure-openssl.c:850 #, 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:828 +#: fe-secure-openssl.c:860 #, c-format msgid "could not set minimum SSL protocol version: %s" msgstr "konnte minimale SSL-Protokollversion nicht setzen: %s" -#: fe-secure-openssl.c:844 +#: fe-secure-openssl.c:876 #, 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:854 +#: fe-secure-openssl.c:886 #, c-format msgid "could not set maximum SSL protocol version: %s" msgstr "konnte maximale SSL-Protokollversion nicht setzen: %s" -#: fe-secure-openssl.c:892 +#: fe-secure-openssl.c:924 #, c-format msgid "could not load system root certificate paths: %s" msgstr "konnte System-Root-Zertifikat-Pfade nicht laden: %s" -#: fe-secure-openssl.c:909 +#: fe-secure-openssl.c:941 #, c-format msgid "could not read root certificate file \"%s\": %s" msgstr "konnte Root-Zertifikat-Datei »%s« nicht lesen: %s" -#: fe-secure-openssl.c:961 +#: fe-secure-openssl.c:993 #, c-format msgid "" "could not get home directory to locate root certificate file\n" @@ -1892,7 +1912,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:964 +#: fe-secure-openssl.c:996 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1901,127 +1921,127 @@ 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:999 +#: fe-secure-openssl.c:1031 #, c-format msgid "could not open certificate file \"%s\": %s" msgstr "konnte Zertifikatdatei »%s« nicht öffnen: %s" -#: fe-secure-openssl.c:1017 +#: fe-secure-openssl.c:1049 #, c-format msgid "could not read certificate file \"%s\": %s" msgstr "konnte Zertifikatdatei »%s« nicht lesen: %s" -#: fe-secure-openssl.c:1041 +#: fe-secure-openssl.c:1073 #, c-format msgid "could not establish SSL connection: %s" msgstr "konnte SSL-Verbindung nicht aufbauen: %s" -#: fe-secure-openssl.c:1058 +#: fe-secure-openssl.c:1090 #, c-format msgid "WARNING: sslkeylogfile support requires OpenSSL\n" msgstr "WARNUNG: Unterstützung für sslkeylogfile benötigt OpenSSL\n" -#: fe-secure-openssl.c:1060 +#: fe-secure-openssl.c:1092 #, c-format msgid "WARNING: libpq was not built with sslkeylogfile support\n" msgstr "WARNUNG: libpq wurde ohne Unterstützung für sslkeylogfile gebaut\n" -#: fe-secure-openssl.c:1090 +#: fe-secure-openssl.c:1122 #, 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:1107 +#: fe-secure-openssl.c:1139 #, c-format msgid "could not set SSL ALPN extension: %s" msgstr "konnte SSL-ALPN-Erweiterung nicht setzen: %s" -#: fe-secure-openssl.c:1150 +#: fe-secure-openssl.c:1182 #, c-format msgid "could not load SSL engine \"%s\": %s" msgstr "konnte SSL-Engine »%s« nicht laden: %s" -#: fe-secure-openssl.c:1161 +#: fe-secure-openssl.c:1193 #, c-format msgid "could not initialize SSL engine \"%s\": %s" msgstr "konnte SSL-Engine »%s« nicht initialisieren: %s" -#: fe-secure-openssl.c:1176 +#: fe-secure-openssl.c:1208 #, 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:1189 +#: fe-secure-openssl.c:1221 #, 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:1226 +#: fe-secure-openssl.c:1258 #, c-format msgid "certificate present, but not private key file \"%s\"" msgstr "Zertifikat vorhanden, aber keine private Schlüsseldatei »%s«" -#: fe-secure-openssl.c:1229 +#: fe-secure-openssl.c:1261 #, 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:1237 +#: fe-secure-openssl.c:1269 #, 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:1270 +#: fe-secure-openssl.c:1302 #, 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:1294 +#: fe-secure-openssl.c:1326 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "konnte private Schlüsseldatei »%s« nicht laden: %s" -#: fe-secure-openssl.c:1310 +#: fe-secure-openssl.c:1342 #, 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:1379 +#: fe-secure-openssl.c:1411 #, c-format msgid "SSL error: certificate verify failed: %s" msgstr "SSL-Fehler: Zertifikatsüberprüfung fehlgeschlagen: %s" -#: fe-secure-openssl.c:1424 +#: fe-secure-openssl.c:1456 #, 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:1456 +#: fe-secure-openssl.c:1488 #, c-format msgid "direct SSL connection was established without ALPN protocol negotiation extension" msgstr "direkte SSL-Verbindung wurde ohne ALPN-Erweiterung zur Protokollverhandlung aufgebaut" -#: fe-secure-openssl.c:1468 +#: fe-secure-openssl.c:1500 #, c-format msgid "SSL connection was established with unexpected ALPN protocol" msgstr "SSL-Verbindung wurde mit unerwartetem ALPN-Protokoll aufgebaut" -#: fe-secure-openssl.c:1485 +#: fe-secure-openssl.c:1517 #, c-format msgid "certificate could not be obtained: %s" msgstr "Zertifikat konnte nicht ermittelt werden: %s" -#: fe-secure-openssl.c:1564 +#: fe-secure-openssl.c:1596 #, c-format msgid "no SSL error reported" msgstr "kein SSL-Fehler berichtet" -#: fe-secure-openssl.c:1607 +#: fe-secure-openssl.c:1639 #, c-format msgid "SSL error code %lu" msgstr "SSL-Fehlercode %lu" -#: fe-secure-openssl.c:1909 +#: fe-secure-openssl.c:1941 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "WARNUNG: sslpassword abgeschnitten\n" @@ -2031,7 +2051,7 @@ msgstr "WARNUNG: sslpassword abgeschnitten\n" msgid "could not receive data from server: %s" msgstr "konnte keine Daten vom Server empfangen: %s" -#: fe-secure.c:404 +#: fe-secure.c:428 #, 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/ja.po b/src/interfaces/libpq/po/ja.po index 2b28c05029c..966dab180ec 100644 --- a/src/interfaces/libpq/po/ja.po +++ b/src/interfaces/libpq/po/ja.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: libpq (PostgreSQL 18)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-12-16 09:30+0900\n" -"PO-Revision-Date: 2025-12-16 11:17+0900\n" +"POT-Creation-Date: 2026-05-12 14:54+0900\n" +"PO-Revision-Date: 2026-05-15 17:14+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -120,7 +120,7 @@ msgstr "プロバイダはクライアント認証を必須としていますが #: ../libpq-oauth/oauth-curl.c:1559 #, c-format msgid "checking timer expiration: %m" -msgstr "タイマー満了確認中: %m" +msgstr "タイムアウトの確認中: %m" #: ../libpq-oauth/oauth-curl.c:1721 #, c-format @@ -149,12 +149,12 @@ msgstr "libcurl ハンドルの作成に失敗しました" #: fe-connect.c:6210 fe-connect.c:6308 fe-connect.c:6559 fe-connect.c:6586 #: fe-connect.c:6662 fe-connect.c:6685 fe-connect.c:6709 fe-connect.c:6744 #: fe-connect.c:6830 fe-connect.c:6838 fe-connect.c:7195 fe-connect.c:7377 -#: fe-exec.c:530 fe-exec.c:1331 fe-exec.c:3270 fe-exec.c:4341 fe-exec.c:4534 -#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:212 fe-protocol3.c:235 -#: fe-protocol3.c:258 fe-protocol3.c:275 fe-protocol3.c:296 fe-protocol3.c:370 -#: fe-protocol3.c:751 fe-protocol3.c:991 fe-protocol3.c:1556 -#: fe-protocol3.c:1610 fe-protocol3.c:1656 fe-protocol3.c:1677 -#: fe-protocol3.c:1934 fe-protocol3.c:2335 fe-secure-common.c:110 +#: fe-exec.c:531 fe-exec.c:1332 fe-exec.c:3285 fe-exec.c:4335 fe-exec.c:4528 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:213 fe-protocol3.c:236 +#: fe-protocol3.c:259 fe-protocol3.c:276 fe-protocol3.c:297 fe-protocol3.c:371 +#: fe-protocol3.c:752 fe-protocol3.c:992 fe-protocol3.c:1557 +#: fe-protocol3.c:1611 fe-protocol3.c:1657 fe-protocol3.c:1678 +#: fe-protocol3.c:1935 fe-protocol3.c:2347 fe-secure-common.c:110 #: fe-secure-gssapi.c:508 fe-secure-gssapi.c:699 fe-secure-openssl.c:405 #: fe-secure-openssl.c:1135 #, c-format @@ -1237,8 +1237,8 @@ msgstr "\"%s\"に予期しない空白文字があります、代わりにパー msgid "connection pointer is NULL\n" msgstr "接続ポインタはNULLです\n" -#: fe-connect.c:7649 fe-exec.c:718 fe-exec.c:980 fe-exec.c:3475 -#: fe-protocol3.c:1006 fe-protocol3.c:1039 +#: fe-connect.c:7649 fe-exec.c:719 fe-exec.c:981 fe-exec.c:3490 +#: fe-protocol3.c:1007 fe-protocol3.c:1040 msgid "out of memory\n" msgstr "メモリ不足\n" @@ -1262,176 +1262,176 @@ msgstr "パスワードはファイル\"%s\"から取り出しました" msgid "invalid integer value \"%s\" for connection option \"%s\"" msgstr "接続オプション\"%2$s\"に対する不正な整数値\"%1$s\"" -#: fe-exec.c:469 fe-exec.c:3549 +#: fe-exec.c:470 fe-exec.c:3564 #, c-format msgid "row number %d is out of range 0..%d" msgstr "行番号%dは0..%dの範囲を超えています" -#: fe-exec.c:531 fe-protocol3.c:2140 +#: fe-exec.c:532 fe-protocol3.c:2141 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:839 +#: fe-exec.c:840 #, c-format msgid "write to server failed" msgstr "サーバーへの書き込みに失敗" -#: fe-exec.c:879 +#: fe-exec.c:880 #, c-format msgid "no error text available" msgstr "エラー文字列がありません" -#: fe-exec.c:968 +#: fe-exec.c:969 msgid "NOTICE" msgstr "注意" -#: fe-exec.c:1026 +#: fe-exec.c:1027 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresultはINT_MAX個以上のタプルを扱えません" -#: fe-exec.c:1038 +#: fe-exec.c:1039 msgid "size_t overflow" msgstr "size_t オーバーフロー" -#: fe-exec.c:1454 fe-exec.c:1523 fe-exec.c:1569 +#: fe-exec.c:1455 fe-exec.c:1524 fe-exec.c:1570 #, c-format msgid "command string is a null pointer" msgstr "コマンド文字列がヌルポインタです" -#: fe-exec.c:1460 fe-exec.c:3019 +#: fe-exec.c:1461 fe-exec.c:3034 #, c-format msgid "%s not allowed in pipeline mode" msgstr "%sはパイプラインモードでは使用できません" -#: fe-exec.c:1528 fe-exec.c:1574 fe-exec.c:1668 +#: fe-exec.c:1529 fe-exec.c:1575 fe-exec.c:1669 #, c-format msgid "number of parameters must be between 0 and %d" msgstr "パラメータ数は0から%dまでの間でなければなりません" -#: fe-exec.c:1564 fe-exec.c:1663 +#: fe-exec.c:1565 fe-exec.c:1664 #, c-format msgid "statement name is a null pointer" msgstr "文の名前がヌルポインタです" -#: fe-exec.c:1705 fe-exec.c:3395 +#: fe-exec.c:1706 fe-exec.c:3410 #, c-format msgid "no connection to the server" msgstr "サーバーへの接続がありません" -#: fe-exec.c:1713 fe-exec.c:3403 +#: fe-exec.c:1714 fe-exec.c:3418 #, c-format msgid "another command is already in progress" msgstr "他のコマンドがすでに処理中です" -#: fe-exec.c:1743 +#: fe-exec.c:1744 #, c-format msgid "cannot queue commands during COPY" msgstr "COPY中はコマンドのキューイングはできません" -#: fe-exec.c:1862 +#: fe-exec.c:1863 #, c-format msgid "length must be given for binary parameter" msgstr "バイナリパラメータには長さを指定する必要があります" -#: fe-exec.c:2221 +#: fe-exec.c:2222 #, c-format msgid "unexpected asyncStatus: %d" msgstr "想定外のasyncStatus: %d" -#: fe-exec.c:2377 +#: fe-exec.c:2378 #, c-format msgid "synchronous command execution functions are not allowed in pipeline mode" msgstr "同期的にコマンドを実行する関数はパイプラインモード中は実行できません" -#: fe-exec.c:2394 +#: fe-exec.c:2395 msgid "COPY terminated by new PQexec" msgstr "新たなPQexec\"によりCOPYが終了しました" -#: fe-exec.c:2410 +#: fe-exec.c:2411 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "COPY BOTH 実行中の PQexec は許可されていません" -#: fe-exec.c:2646 +#: fe-exec.c:2647 #, c-format msgid "unrecognized message type \"%c\"" msgstr "認識できないメッセージタイプ\"%c\"" -#: fe-exec.c:2718 fe-exec.c:2772 fe-exec.c:2840 fe-protocol3.c:2071 +#: fe-exec.c:2719 fe-exec.c:2773 fe-exec.c:2841 fe-protocol3.c:2072 #, c-format msgid "no COPY in progress" msgstr "実行中のCOPYはありません" -#: fe-exec.c:3026 +#: fe-exec.c:3041 #, c-format msgid "connection in wrong state" msgstr "接続状態が異常です" -#: fe-exec.c:3069 +#: fe-exec.c:3084 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "パイプラインモードに入れません、接続がアイドル状態ではありません" -#: fe-exec.c:3105 fe-exec.c:3126 +#: fe-exec.c:3120 fe-exec.c:3141 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "未回収の結果が残っている状態でパイプラインモードを抜けることはできません" -#: fe-exec.c:3109 +#: fe-exec.c:3124 #, c-format msgid "cannot exit pipeline mode while busy" msgstr "ビジー状態でパイプラインモードを抜けることはできません" -#: fe-exec.c:3120 +#: fe-exec.c:3135 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "COPY実行中にパイプラインモードを抜けることはできません" -#: fe-exec.c:3319 +#: fe-exec.c:3334 #, c-format msgid "cannot send pipeline when not in pipeline mode" msgstr "パイプラインモード外でパイプライン送出はできません" -#: fe-exec.c:3438 +#: fe-exec.c:3453 msgid "invalid ExecStatusType code" msgstr "ExecStatusTypeコードが不正です" -#: fe-exec.c:3465 +#: fe-exec.c:3480 msgid "PGresult is not an error result\n" msgstr "PGresutがエラー結果ではありません\n" -#: fe-exec.c:3533 fe-exec.c:3556 +#: fe-exec.c:3548 fe-exec.c:3571 #, c-format msgid "column number %d is out of range 0..%d" msgstr "列番号%dは0..%dの範囲を超えています" -#: fe-exec.c:3571 +#: fe-exec.c:3586 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "パラメータ%dは0..%dの範囲を超えています" -#: fe-exec.c:3882 +#: fe-exec.c:3897 #, c-format msgid "could not interpret result from server: %s" msgstr "サーバーからの結果を解釈できませんでした: %s" -#: fe-exec.c:4157 fe-exec.c:4292 +#: fe-exec.c:4172 fe-exec.c:4286 #, c-format msgid "incomplete multibyte character" msgstr "不完全なマルチバイト文字" -#: fe-exec.c:4159 fe-exec.c:4311 +#: fe-exec.c:4174 fe-exec.c:4305 #, c-format msgid "invalid multibyte character" msgstr "不正なマルチバイト文字" -#: fe-exec.c:4413 +#: fe-exec.c:4407 #, c-format msgid "escaped string size exceeds the maximum allowed (%zu)" msgstr "エスケープされた文字列のサイズが上限(%zu)を超えています" -#: fe-exec.c:4590 +#: fe-exec.c:4584 #, c-format msgid "escaped bytea size exceeds the maximum allowed (%zu)" msgstr "エスケープされたbyteaのサイズが上限(%zu)を超えています" @@ -1523,196 +1523,201 @@ msgstr "不正なソケットです" msgid "%s() failed: %s" msgstr "%s() が失敗しました: %s" -#: fe-protocol3.c:190 +#: fe-protocol3.c:191 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "待機中にサーバーからメッセージ種類0x%02xが届きました" -#: fe-protocol3.c:403 +#: fe-protocol3.c:404 #, c-format msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" msgstr "サーバーが先行の行記述(\"T\"メッセージ)なしでデータ(\"D\"メッセージ)を送信しました" -#: fe-protocol3.c:445 +#: fe-protocol3.c:446 #, c-format msgid "unexpected response from server; first received character was \"%c\"" msgstr "サーバーから想定外の応答がありました。受け付けた先頭文字は\"%c\"です" -#: fe-protocol3.c:469 +#: fe-protocol3.c:470 #, c-format msgid "message contents do not agree with length in message type \"%c\"" msgstr "メッセージの内容がメッセージタイプ\"%c\"での長さと合っていません" -#: fe-protocol3.c:504 +#: fe-protocol3.c:505 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "サーバーとの同期が失われました。受信したメッセージタイプは\"%c\"、長さは%d" -#: fe-protocol3.c:551 fe-protocol3.c:591 +#: fe-protocol3.c:552 fe-protocol3.c:592 msgid "insufficient data in \"T\" message" msgstr "\"T\"メッセージ内のデータが不十分です" -#: fe-protocol3.c:662 fe-protocol3.c:868 +#: fe-protocol3.c:663 fe-protocol3.c:869 msgid "out of memory for query result" msgstr "問い合わせ結果用のメモリが不足しています" -#: fe-protocol3.c:731 +#: fe-protocol3.c:732 msgid "insufficient data in \"t\" message" msgstr "\"t\"メッセージ内のデータが足りません" -#: fe-protocol3.c:790 fe-protocol3.c:822 fe-protocol3.c:840 +#: fe-protocol3.c:791 fe-protocol3.c:823 fe-protocol3.c:841 msgid "insufficient data in \"D\" message" msgstr "\"D\"\"メッセージ内のデータが不十分です" -#: fe-protocol3.c:796 +#: fe-protocol3.c:797 msgid "unexpected field count in \"D\" message" msgstr "\"D\"メッセージ内のフィールド数が想定外です。" -#: fe-protocol3.c:1052 +#: fe-protocol3.c:1053 msgid "no error message available\n" msgstr "エラーメッセージがありません\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1100 fe-protocol3.c:1119 +#: fe-protocol3.c:1101 fe-protocol3.c:1120 #, c-format msgid " at character %s" msgstr "(文字位置: %s)" -#: fe-protocol3.c:1132 +#: fe-protocol3.c:1133 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1135 +#: fe-protocol3.c:1136 #, c-format msgid "HINT: %s\n" msgstr "HINT: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1139 #, c-format msgid "QUERY: %s\n" msgstr "QUERY: %s\n" -#: fe-protocol3.c:1145 +#: fe-protocol3.c:1146 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXT: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1155 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMA NAME: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1159 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABLE NAME: %s\n" -#: fe-protocol3.c:1162 +#: fe-protocol3.c:1163 #, c-format msgid "COLUMN NAME: %s\n" msgstr "COLUMN NAME: %s\n" -#: fe-protocol3.c:1166 +#: fe-protocol3.c:1167 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPE NAME: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1171 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT NAME: %s\n" -#: fe-protocol3.c:1182 +#: fe-protocol3.c:1183 msgid "LOCATION: " msgstr "LOCATION: " -#: fe-protocol3.c:1184 +#: fe-protocol3.c:1185 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1186 +#: fe-protocol3.c:1187 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1394 +#: fe-protocol3.c:1395 #, c-format msgid "LINE %d: " msgstr "行 %d: " -#: fe-protocol3.c:1456 +#: fe-protocol3.c:1457 #, c-format msgid "received invalid protocol negotiation message: server requested downgrade to a higher-numbered version" msgstr "不正なプロトコルネゴシエーションメッセージを受信: サーバーがより大きなバージョン番号へのダウングレードを要求しました" -#: fe-protocol3.c:1462 +#: fe-protocol3.c:1463 #, c-format msgid "received invalid protocol negotiation message: server requested downgrade to pre-3.0 protocol version" msgstr "不正なプロトコルネゴシエーションメッセージを受信: サーバーが3.0より前のプロトコルバージョンへのダウングレードを要求しました" -#: fe-protocol3.c:1469 +#: fe-protocol3.c:1470 #, c-format msgid "received invalid protocol negotiation message: server requested downgrade to non-existent 3.1 protocol version" msgstr "不正なプロトコルネゴシエーションメッセージを受信: サーバーが、存在しない 3.1 プロトコルバージョンへのダウングレードを要求しました" -#: fe-protocol3.c:1475 +#: fe-protocol3.c:1476 #, c-format msgid "received invalid protocol negotiation message: server reported negative number of unsupported parameters" msgstr "不正なプロトコルネゴシエーションメッセージを受信: サーバーがサポート外パラメータの数として負数を通知しました" -#: fe-protocol3.c:1481 +#: fe-protocol3.c:1482 #, c-format msgid "received invalid protocol negotiation message: server negotiated but asks for no changes" msgstr "不正なプロトコルネゴシエーションメッセージを受信: サーバーがネゴシエーションを行いましたが、変更要求がありませんでした" -#: fe-protocol3.c:1487 +#: fe-protocol3.c:1488 #, c-format msgid "server only supports protocol version %d.%d, but \"%s\" was set to %d.%d" msgstr "サーバーはプロトコルバージョン %d.%d のみサポートしていますが、\"%s\"は %d.%d に設定されています" -#: fe-protocol3.c:1512 +#: fe-protocol3.c:1513 #, c-format msgid "received invalid protocol negotiation message: server reported unsupported parameter name without a \"%s\" prefix (\"%s\")" msgstr "不正なプロトコルネゴシエーションメッセージを受信: サーバーが\"%s\"プレフィクスのないサポートされていないパラメータ名(\"%s\")を報告しました" -#: fe-protocol3.c:1515 +#: fe-protocol3.c:1516 #, c-format msgid "received invalid protocol negotiation message: server reported an unsupported parameter that was not requested (\"%s\")" msgstr "不正なプロトコルネゴシエーションメッセージを受信: サーバーが要求されていないサポート外のパラメータ(\"%s\")を通知しました" -#: fe-protocol3.c:1522 +#: fe-protocol3.c:1523 #, c-format msgid "received invalid protocol negotiation message: message too short" msgstr "不正なプロトコルネゴシエーションメッセージを受信: メッセージが短すぎます" -#: fe-protocol3.c:1588 +#: fe-protocol3.c:1589 #, c-format msgid "received invalid BackendKeyData message: cancel key with length %d not allowed in protocol version 3.0 (must be 4 bytes)" msgstr "不正なBackendKeyDataデータを受信しました: 長さ%dのキャンセルキーはプロトコルバージョン3.0では許可されません(4バイトでなければなりません)" -#: fe-protocol3.c:1595 +#: fe-protocol3.c:1596 #, c-format msgid "received invalid BackendKeyData message: cancel key with length %d is too short (minimum 4 bytes)" msgstr "不正なBackendKeyDataデータを受信しました: 長さ%dのキャンセルキーは短すぎます (最低4バイト)" -#: fe-protocol3.c:1602 +#: fe-protocol3.c:1603 #, c-format msgid "received invalid BackendKeyData message: cancel key with length %d is too long (maximum 256 bytes)" msgstr "不正なBackendKeyDataデータを受信しました: 長さ%dのキャンセルキーは長すぎます (最高256バイト)" -#: fe-protocol3.c:1966 +#: fe-protocol3.c:1967 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline: テキストのCOPY OUTを行っていません" -#: fe-protocol3.c:2341 +#: fe-protocol3.c:2298 +#, c-format +msgid "server returned too much data" +msgstr "サーバーが返却したデータが多すぎます" + +#: fe-protocol3.c:2353 #, c-format msgid "protocol error: no function result" msgstr "プロトコルエラー: 関数の結果がありません" -#: fe-protocol3.c:2353 +#: fe-protocol3.c:2365 #, c-format msgid "protocol error: id=0x%x" msgstr "プロトコルエラー: id=0x%x" diff --git a/src/interfaces/libpq/po/ru.po b/src/interfaces/libpq/po/ru.po index 16cb5c66728..03fbdb31911 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: 2026-02-07 08:57+0200\n" -"PO-Revision-Date: 2026-02-07 10:48+0200\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:41+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -21,99 +21,99 @@ 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" -#: ../libpq-oauth/oauth-curl.c:308 ../libpq-oauth/oauth-curl.c:2011 +#: ../libpq-oauth/oauth-curl.c:309 ../libpq-oauth/oauth-curl.c:2012 #, c-format msgid "libcurl easy handle removal failed: %s" msgstr "ошибка при удалении простого указателя libcurl: %s" -#: ../libpq-oauth/oauth-curl.c:328 +#: ../libpq-oauth/oauth-curl.c:329 #, c-format msgid "libcurl multi handle cleanup failed: %s" msgstr "ошибка при очистке множественного указателя libcurl: %s" -#: ../libpq-oauth/oauth-curl.c:394 ../libpq-oauth/oauth-curl.c:405 +#: ../libpq-oauth/oauth-curl.c:395 ../libpq-oauth/oauth-curl.c:406 #, c-format msgid "failed to set %s on OAuth connection: %s" msgstr "не удалось задать %s для подключения OAuth: %s" -#: ../libpq-oauth/oauth-curl.c:416 +#: ../libpq-oauth/oauth-curl.c:417 #, c-format msgid "failed to get %s from OAuth response: %s" msgstr "не удалось получить %s из ответа OAuth: %s" -#: ../libpq-oauth/oauth-curl.c:485 fe-auth-oauth.c:209 fe-auth-oauth.c:271 +#: ../libpq-oauth/oauth-curl.c:486 fe-auth-oauth.c:209 fe-auth-oauth.c:271 #: fe-auth-oauth.c:333 #, c-format msgid "field \"%s\" must be a string" msgstr "поле \"%s\" должно быть строковым" -#: ../libpq-oauth/oauth-curl.c:489 +#: ../libpq-oauth/oauth-curl.c:490 #, c-format msgid "field \"%s\" must be a number" msgstr "поле \"%s\" должно быть числовым" -#: ../libpq-oauth/oauth-curl.c:493 +#: ../libpq-oauth/oauth-curl.c:494 #, c-format msgid "field \"%s\" must be an array of strings" msgstr "поле \"%s\" должно содержать массив строк" -#: ../libpq-oauth/oauth-curl.c:498 +#: ../libpq-oauth/oauth-curl.c:499 #, c-format msgid "field \"%s\" has unexpected type" msgstr "поле \"%s\" имеет неожиданный тип" -#: ../libpq-oauth/oauth-curl.c:522 ../libpq-oauth/oauth-curl.c:632 +#: ../libpq-oauth/oauth-curl.c:523 ../libpq-oauth/oauth-curl.c:633 #: fe-auth-oauth.c:215 fe-auth-oauth.c:277 #, c-format msgid "JSON is too deeply nested" msgstr "слишком большая вложенность в JSON" -#: ../libpq-oauth/oauth-curl.c:574 fe-auth-oauth.c:324 +#: ../libpq-oauth/oauth-curl.c:575 fe-auth-oauth.c:324 #, c-format msgid "field \"%s\" is duplicated" msgstr "поле \"%s\" дублируется" -#: ../libpq-oauth/oauth-curl.c:614 ../libpq-oauth/oauth-curl.c:674 +#: ../libpq-oauth/oauth-curl.c:615 ../libpq-oauth/oauth-curl.c:675 #: fe-auth-oauth.c:264 fe-auth-oauth.c:298 #, c-format msgid "top-level element must be an object" msgstr "элементом верхнего уровня должен быть объект" -#: ../libpq-oauth/oauth-curl.c:777 +#: ../libpq-oauth/oauth-curl.c:778 #, c-format msgid "no content type was provided" msgstr "тип содержимого не передан" -#: ../libpq-oauth/oauth-curl.c:816 +#: ../libpq-oauth/oauth-curl.c:817 #, c-format msgid "unexpected content type: \"%s\"" msgstr "неожиданный тип содержимого: \"%s\"" -#: ../libpq-oauth/oauth-curl.c:841 +#: ../libpq-oauth/oauth-curl.c:842 #, c-format msgid "response contains embedded NULLs" msgstr "ответ содержит в себе NUL" -#: ../libpq-oauth/oauth-curl.c:851 +#: ../libpq-oauth/oauth-curl.c:852 #, c-format msgid "response is not valid UTF-8" msgstr "ответ не является текстом в кодировке UTF-8" -#: ../libpq-oauth/oauth-curl.c:891 +#: ../libpq-oauth/oauth-curl.c:892 #, c-format msgid "field \"%s\" is missing" msgstr "поле \"%s\" отсутствует" -#: ../libpq-oauth/oauth-curl.c:1097 +#: ../libpq-oauth/oauth-curl.c:1098 msgid "failed to parse token error response" msgstr "не удалось разобрать ответ с ошибкой токена" -#: ../libpq-oauth/oauth-curl.c:1125 +#: ../libpq-oauth/oauth-curl.c:1126 #, c-format msgid "provider rejected the oauth_client_secret" msgstr "провайдер не принял oauth_client_secret" -#: ../libpq-oauth/oauth-curl.c:1126 +#: ../libpq-oauth/oauth-curl.c:1127 #, c-format msgid "" "provider requires client authentication, and no oauth_client_secret is set" @@ -121,25 +121,25 @@ msgstr "" "провайдер требует проверку подлинности клиента, но oauth_client_secret " "отсутствует" -#: ../libpq-oauth/oauth-curl.c:1559 +#: ../libpq-oauth/oauth-curl.c:1560 #, c-format msgid "checking timer expiration: %m" msgstr "проверка состояния таймера: %m" -#: ../libpq-oauth/oauth-curl.c:1721 +#: ../libpq-oauth/oauth-curl.c:1722 #, c-format msgid "failed to create libcurl multi handle" msgstr "не удалось создать множественный указатель libcurl" -#: ../libpq-oauth/oauth-curl.c:1741 +#: ../libpq-oauth/oauth-curl.c:1742 #, c-format msgid "failed to create libcurl handle" msgstr "не удалось создать указатель libcurl" -#: ../libpq-oauth/oauth-curl.c:1825 ../libpq-oauth/oauth-curl.c:1866 -#: ../libpq-oauth/oauth-curl.c:2184 ../libpq-oauth/oauth-curl.c:2345 -#: ../libpq-oauth/oauth-curl.c:2406 ../libpq-oauth/oauth-curl.c:2495 -#: ../libpq-oauth/oauth-curl.c:2789 ../libpq-oauth/oauth-curl.c:3006 +#: ../libpq-oauth/oauth-curl.c:1826 ../libpq-oauth/oauth-curl.c:1867 +#: ../libpq-oauth/oauth-curl.c:2185 ../libpq-oauth/oauth-curl.c:2346 +#: ../libpq-oauth/oauth-curl.c:2407 ../libpq-oauth/oauth-curl.c:2496 +#: ../libpq-oauth/oauth-curl.c:2802 ../libpq-oauth/oauth-curl.c:3036 #: fe-auth-oauth.c:146 fe-auth-oauth.c:489 fe-auth-oauth.c:561 #: fe-auth-oauth.c:723 fe-auth-oauth.c:1016 fe-auth-oauth.c:1029 #: fe-auth-oauth.c:1117 fe-auth-oauth.c:1130 fe-auth-oauth.c:1266 @@ -153,79 +153,79 @@ msgstr "не удалось создать указатель libcurl" #: fe-connect.c:6210 fe-connect.c:6308 fe-connect.c:6559 fe-connect.c:6586 #: fe-connect.c:6662 fe-connect.c:6685 fe-connect.c:6709 fe-connect.c:6744 #: fe-connect.c:6830 fe-connect.c:6838 fe-connect.c:7195 fe-connect.c:7377 -#: fe-exec.c:530 fe-exec.c:1331 fe-exec.c:3270 fe-exec.c:4341 fe-exec.c:4534 -#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:212 fe-protocol3.c:235 -#: fe-protocol3.c:258 fe-protocol3.c:275 fe-protocol3.c:296 fe-protocol3.c:370 -#: fe-protocol3.c:751 fe-protocol3.c:991 fe-protocol3.c:1556 -#: fe-protocol3.c:1610 fe-protocol3.c:1656 fe-protocol3.c:1677 -#: fe-protocol3.c:1934 fe-protocol3.c:2335 fe-secure-common.c:110 -#: fe-secure-gssapi.c:508 fe-secure-gssapi.c:699 fe-secure-openssl.c:405 -#: fe-secure-openssl.c:1135 +#: fe-exec.c:531 fe-exec.c:1332 fe-exec.c:3285 fe-exec.c:4335 fe-exec.c:4528 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:214 fe-protocol3.c:237 +#: fe-protocol3.c:260 fe-protocol3.c:277 fe-protocol3.c:298 fe-protocol3.c:372 +#: fe-protocol3.c:753 fe-protocol3.c:993 fe-protocol3.c:1558 +#: fe-protocol3.c:1612 fe-protocol3.c:1658 fe-protocol3.c:1679 +#: fe-protocol3.c:1943 fe-protocol3.c:2355 fe-secure-common.c:110 +#: fe-secure-gssapi.c:515 fe-secure-gssapi.c:706 fe-secure-openssl.c:436 +#: fe-secure-openssl.c:1167 #, c-format msgid "out of memory" msgstr "нехватка памяти" -#: ../libpq-oauth/oauth-curl.c:1853 +#: ../libpq-oauth/oauth-curl.c:1854 #, c-format msgid "response is too large" msgstr "ответ слишком большой" -#: ../libpq-oauth/oauth-curl.c:1895 +#: ../libpq-oauth/oauth-curl.c:1896 #, c-format msgid "failed to queue HTTP request: %s" msgstr "добавить HTTP-запрос в очередь не удалось: %s" -#: ../libpq-oauth/oauth-curl.c:1912 ../libpq-oauth/oauth-curl.c:1970 +#: ../libpq-oauth/oauth-curl.c:1913 ../libpq-oauth/oauth-curl.c:1971 #, c-format msgid "asynchronous HTTP request failed: %s" msgstr "ошибка асинхронного HTTP-запроса: %s" -#: ../libpq-oauth/oauth-curl.c:2022 +#: ../libpq-oauth/oauth-curl.c:2023 #, c-format msgid "no result was retrieved for the finished handle" msgstr "для завершённого указателя не был получен результат" -#: ../libpq-oauth/oauth-curl.c:2155 ../libpq-oauth/oauth-curl.c:2461 -#: ../libpq-oauth/oauth-curl.c:2540 +#: ../libpq-oauth/oauth-curl.c:2156 ../libpq-oauth/oauth-curl.c:2462 +#: ../libpq-oauth/oauth-curl.c:2541 #, c-format msgid "unexpected response code %ld" msgstr "неожиданный код ответа %ld" -#: ../libpq-oauth/oauth-curl.c:2162 +#: ../libpq-oauth/oauth-curl.c:2163 msgid "failed to parse OpenID discovery document" msgstr "не удалось разобрать документ обнаружения OpenID" -#: ../libpq-oauth/oauth-curl.c:2227 +#: ../libpq-oauth/oauth-curl.c:2228 #, c-format msgid "the issuer identifier (%s) does not match oauth_issuer (%s)" msgstr "идентификатор издателя (%s) не совпадает с oauth_issuer (%s)" -#: ../libpq-oauth/oauth-curl.c:2254 +#: ../libpq-oauth/oauth-curl.c:2255 #, c-format msgid "issuer \"%s\" does not provide a device authorization endpoint" msgstr "издатель \"%s\" не передал конечную точку авторизации устройств" -#: ../libpq-oauth/oauth-curl.c:2280 +#: ../libpq-oauth/oauth-curl.c:2281 #, c-format msgid "device authorization endpoint \"%s\" must use HTTPS" msgstr "конечная точка авторизации устройств \"%s\" должна использовать HTTPS" # well-spelled: токенов -#: ../libpq-oauth/oauth-curl.c:2289 +#: ../libpq-oauth/oauth-curl.c:2290 #, c-format msgid "token endpoint \"%s\" must use HTTPS" msgstr "конечная точка токенов \"%s\" должна использовать HTTPS" -#: ../libpq-oauth/oauth-curl.c:2430 +#: ../libpq-oauth/oauth-curl.c:2431 msgid "failed to parse device authorization" msgstr "не удалось разобрать сообщение авторизации устройства" # well-spelled: токеном -#: ../libpq-oauth/oauth-curl.c:2518 +#: ../libpq-oauth/oauth-curl.c:2519 msgid "failed to parse access token response" msgstr "не удалось разобрать ответ с токеном доступа" -#: ../libpq-oauth/oauth-curl.c:2598 +#: ../libpq-oauth/oauth-curl.c:2596 #, c-format msgid "slow_down interval overflow" msgstr "переполнение интервала замедления (slow_down)" @@ -233,27 +233,27 @@ msgstr "переполнение интервала замедления (slow_d #. translator: The first %s is a URL for the user to visit in a #. browser, and the second %s is a code to be copy-pasted there. #. -#: ../libpq-oauth/oauth-curl.c:2634 +#: ../libpq-oauth/oauth-curl.c:2632 #, c-format msgid "Visit %s and enter the code: %s\n" msgstr "Посетите %s и введите код: %s\n" -#: ../libpq-oauth/oauth-curl.c:2639 +#: ../libpq-oauth/oauth-curl.c:2637 #, c-format msgid "device prompt failed" msgstr "ошибка при запросе устройства" -#: ../libpq-oauth/oauth-curl.c:2695 +#: ../libpq-oauth/oauth-curl.c:2691 #, c-format msgid "curl_global_init previously failed during OAuth setup" msgstr "в curl_global_init ранее возникла ошибка при настройке OAuth" -#: ../libpq-oauth/oauth-curl.c:2714 +#: ../libpq-oauth/oauth-curl.c:2710 #, c-format msgid "curl_global_init failed during OAuth setup" msgstr "в curl_global_init возникла ошибка при настройке OAuth" -#: ../libpq-oauth/oauth-curl.c:2735 +#: ../libpq-oauth/oauth-curl.c:2732 #, c-format msgid "" "libcurl is no longer thread-safe\n" @@ -268,19 +268,19 @@ msgstr "" "\tlibcurl сообщает, что таковой не является. Перекомпилируйте\n" "\tlibpq с установленной версией libcurl." -#: ../libpq-oauth/oauth-curl.c:2897 +#: ../libpq-oauth/oauth-curl.c:2910 msgid "failed to fetch OpenID discovery document" msgstr "не удалось получить документ обнаружения OpenID" -#: ../libpq-oauth/oauth-curl.c:2911 +#: ../libpq-oauth/oauth-curl.c:2924 msgid "cannot run OAuth device authorization" msgstr "не удалось запустить авторизацию устройства OAuth" -#: ../libpq-oauth/oauth-curl.c:2915 +#: ../libpq-oauth/oauth-curl.c:2928 msgid "failed to obtain device authorization" msgstr "не удалось получить авторизацию устройства" -#: ../libpq-oauth/oauth-curl.c:2926 ../libpq-oauth/oauth-curl.c:2977 +#: ../libpq-oauth/oauth-curl.c:2939 ../libpq-oauth/oauth-curl.c:3007 msgid "failed to obtain access token" msgstr "не удалось получить токен доступа" @@ -764,7 +764,7 @@ msgstr "нераспознанный алгоритм шифрования па msgid "connection pointer is NULL" msgstr "нулевой указатель соединения" -#: fe-cancel.c:85 fe-misc.c:613 +#: fe-cancel.c:85 fe-misc.c:621 #, c-format msgid "connection not open" msgstr "соединение не открыто" @@ -1329,8 +1329,8 @@ msgstr "" msgid "connection pointer is NULL\n" msgstr "нулевой указатель соединения\n" -#: fe-connect.c:7649 fe-exec.c:718 fe-exec.c:980 fe-exec.c:3475 -#: fe-protocol3.c:1006 fe-protocol3.c:1039 +#: fe-connect.c:7649 fe-exec.c:719 fe-exec.c:981 fe-exec.c:3490 +#: fe-protocol3.c:1008 fe-protocol3.c:1041 msgid "out of memory\n" msgstr "нехватка памяти\n" @@ -1358,178 +1358,178 @@ msgstr "пароль получен из файла \"%s\"" msgid "invalid integer value \"%s\" for connection option \"%s\"" msgstr "неверное целочисленное значение \"%s\" для параметра соединения \"%s\"" -#: fe-exec.c:469 fe-exec.c:3549 +#: fe-exec.c:470 fe-exec.c:3564 #, c-format msgid "row number %d is out of range 0..%d" msgstr "номер записи %d вне диапазона 0..%d" -#: fe-exec.c:531 fe-protocol3.c:2140 +#: fe-exec.c:532 fe-protocol3.c:2149 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:839 +#: fe-exec.c:840 #, c-format msgid "write to server failed" msgstr "ошибка при передаче данных серверу" -#: fe-exec.c:879 +#: fe-exec.c:880 #, c-format msgid "no error text available" msgstr "текст ошибки отсутствует" -#: fe-exec.c:968 +#: fe-exec.c:969 msgid "NOTICE" msgstr "ЗАМЕЧАНИЕ" -#: fe-exec.c:1026 +#: fe-exec.c:1027 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult не может вместить больше чем INT_MAX кортежей" -#: fe-exec.c:1038 +#: fe-exec.c:1039 msgid "size_t overflow" msgstr "переполнение size_t" -#: fe-exec.c:1454 fe-exec.c:1523 fe-exec.c:1569 +#: fe-exec.c:1455 fe-exec.c:1524 fe-exec.c:1570 #, c-format msgid "command string is a null pointer" msgstr "указатель на командную строку нулевой" -#: fe-exec.c:1460 fe-exec.c:3019 +#: fe-exec.c:1461 fe-exec.c:3034 #, c-format msgid "%s not allowed in pipeline mode" msgstr "%s не допускается в конвейерном режиме" -#: fe-exec.c:1528 fe-exec.c:1574 fe-exec.c:1668 +#: fe-exec.c:1529 fe-exec.c:1575 fe-exec.c:1669 #, c-format msgid "number of parameters must be between 0 and %d" msgstr "число параметров должно быть от 0 до %d" -#: fe-exec.c:1564 fe-exec.c:1663 +#: fe-exec.c:1565 fe-exec.c:1664 #, c-format msgid "statement name is a null pointer" msgstr "указатель на имя оператора нулевой" -#: fe-exec.c:1705 fe-exec.c:3395 +#: fe-exec.c:1706 fe-exec.c:3410 #, c-format msgid "no connection to the server" msgstr "нет соединения с сервером" -#: fe-exec.c:1713 fe-exec.c:3403 +#: fe-exec.c:1714 fe-exec.c:3418 #, c-format msgid "another command is already in progress" msgstr "уже выполняется другая команда" -#: fe-exec.c:1743 +#: fe-exec.c:1744 #, c-format msgid "cannot queue commands during COPY" msgstr "во время COPY нельзя добавлять команды в очередь" -#: fe-exec.c:1862 +#: fe-exec.c:1863 #, c-format msgid "length must be given for binary parameter" msgstr "для двоичного параметра должна быть указана длина" -#: fe-exec.c:2221 +#: fe-exec.c:2222 #, c-format msgid "unexpected asyncStatus: %d" msgstr "неожиданный asyncStatus: %d" -#: fe-exec.c:2377 +#: fe-exec.c:2378 #, c-format msgid "" "synchronous command execution functions are not allowed in pipeline mode" msgstr "" "функции синхронного выполнения команд не допускаются в конвейерном режиме" -#: fe-exec.c:2394 +#: fe-exec.c:2395 msgid "COPY terminated by new PQexec" msgstr "операция COPY прервана вызовом PQexec" -#: fe-exec.c:2410 +#: fe-exec.c:2411 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "вызов PQexec не допускается в процессе COPY BOTH" -#: fe-exec.c:2646 +#: fe-exec.c:2647 #, c-format msgid "unrecognized message type \"%c\"" msgstr "нераспознанный тип сообщения \"%c\"" -#: fe-exec.c:2718 fe-exec.c:2772 fe-exec.c:2840 fe-protocol3.c:2071 +#: fe-exec.c:2719 fe-exec.c:2773 fe-exec.c:2841 fe-protocol3.c:2080 #, c-format msgid "no COPY in progress" msgstr "операция COPY не выполняется" -#: fe-exec.c:3026 +#: fe-exec.c:3041 #, c-format msgid "connection in wrong state" msgstr "соединение в неправильном состоянии" -#: fe-exec.c:3069 +#: fe-exec.c:3084 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "перейти в конвейерный режиме нельзя, соединение не простаивает" -#: fe-exec.c:3105 fe-exec.c:3126 +#: fe-exec.c:3120 fe-exec.c:3141 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "выйти из конвейерного режима нельзя, не собрав все результаты" -#: fe-exec.c:3109 +#: fe-exec.c:3124 #, c-format msgid "cannot exit pipeline mode while busy" msgstr "выйти из конвейерного режима в занятом состоянии нельзя" -#: fe-exec.c:3120 +#: fe-exec.c:3135 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "выйти из конвейерного режима во время COPY нельзя" -#: fe-exec.c:3319 +#: fe-exec.c:3334 #, c-format msgid "cannot send pipeline when not in pipeline mode" msgstr "отправить конвейер, не перейдя в конвейерный режим, нельзя" -#: fe-exec.c:3438 +#: fe-exec.c:3453 msgid "invalid ExecStatusType code" msgstr "неверный код ExecStatusType" -#: fe-exec.c:3465 +#: fe-exec.c:3480 msgid "PGresult is not an error result\n" msgstr "В PGresult не передан результат ошибки\n" -#: fe-exec.c:3533 fe-exec.c:3556 +#: fe-exec.c:3548 fe-exec.c:3571 #, c-format msgid "column number %d is out of range 0..%d" msgstr "номер столбца %d вне диапазона 0..%d" -#: fe-exec.c:3571 +#: fe-exec.c:3586 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "номер параметра %d вне диапазона 0..%d" -#: fe-exec.c:3882 +#: fe-exec.c:3897 #, c-format msgid "could not interpret result from server: %s" msgstr "не удалось интерпретировать ответ сервера: %s" -#: fe-exec.c:4157 fe-exec.c:4292 +#: fe-exec.c:4172 fe-exec.c:4286 #, c-format msgid "incomplete multibyte character" msgstr "неполный многобайтный символ" -#: fe-exec.c:4159 fe-exec.c:4311 +#: fe-exec.c:4174 fe-exec.c:4305 #, c-format msgid "invalid multibyte character" msgstr "неверный многобайтный символ" -#: fe-exec.c:4413 +#: fe-exec.c:4407 #, c-format msgid "escaped string size exceeds the maximum allowed (%zu)" msgstr "размер строки с экранированием превышает максимально допустимый (%zu)" -#: fe-exec.c:4590 +#: fe-exec.c:4584 #, c-format msgid "escaped bytea size exceeds the maximum allowed (%zu)" msgstr "" @@ -1581,18 +1581,18 @@ msgstr "не удалось записать файл \"%s\": %s" msgid "query to initialize large object functions did not return data" msgstr "запрос инициализации функций для больших объектов не вернул данные" -#: fe-misc.c:239 +#: fe-misc.c:241 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "функция pqGetInt не поддерживает integer размером %lu байт" -#: fe-misc.c:272 +#: fe-misc.c:274 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "функция pqPutInt не поддерживает integer размером %lu байт" -#: fe-misc.c:791 fe-secure-openssl.c:181 fe-secure-openssl.c:287 -#: fe-secure.c:222 fe-secure.c:389 +#: fe-misc.c:833 fe-secure-openssl.c:182 fe-secure-openssl.c:318 +#: fe-secure.c:222 fe-secure.c:413 #, c-format msgid "" "server closed the connection unexpectedly\n" @@ -1603,31 +1603,37 @@ msgstr "" "\tСкорее всего сервер прекратил работу из-за сбоя\n" "\tдо или в процессе выполнения запроса." -#: fe-misc.c:858 +#: fe-misc.c:942 +#, c-format +msgid "drained only %zd of %zd pending bytes in transport buffer" +msgstr "" +"выбрано только %zd из %zd байт, ожидающих получения в транспортном буфере" + +#: fe-misc.c:1004 msgid "connection not open\n" msgstr "соединение не открыто\n" -#: fe-misc.c:1046 +#: fe-misc.c:1192 #, c-format msgid "timeout expired" msgstr "тайм-аут" -#: fe-misc.c:1098 +#: fe-misc.c:1244 #, c-format msgid "invalid socket" msgstr "неверный сокет" -#: fe-misc.c:1121 +#: fe-misc.c:1265 #, c-format msgid "%s() failed: %s" msgstr "ошибка в %s(): %s" -#: fe-protocol3.c:190 +#: fe-protocol3.c:192 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "от сервера во время простоя получено сообщение типа 0x%02x" -#: fe-protocol3.c:403 +#: fe-protocol3.c:405 #, c-format msgid "" "server sent data (\"D\" message) without prior row description (\"T\" " @@ -1636,117 +1642,117 @@ msgstr "" "сервер отправил данные (сообщение \"D\") без предварительного описания " "строки (сообщение \"T\")" -#: fe-protocol3.c:445 +#: fe-protocol3.c:447 #, c-format msgid "unexpected response from server; first received character was \"%c\"" msgstr "неожиданный ответ сервера; первый полученный символ: \"%c\"" -#: fe-protocol3.c:469 +#: fe-protocol3.c:471 #, c-format msgid "message contents do not agree with length in message type \"%c\"" msgstr "содержимое не соответствует длине в сообщении типа \"%c\"" -#: fe-protocol3.c:504 +#: fe-protocol3.c:506 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "" "потеряна синхронизация с сервером: получено сообщение типа \"%c\", длина %d" -#: fe-protocol3.c:551 fe-protocol3.c:591 +#: fe-protocol3.c:553 fe-protocol3.c:593 msgid "insufficient data in \"T\" message" msgstr "недостаточно данных в сообщении \"T\"" -#: fe-protocol3.c:662 fe-protocol3.c:868 +#: fe-protocol3.c:664 fe-protocol3.c:870 msgid "out of memory for query result" msgstr "недостаточно памяти для результата запроса" -#: fe-protocol3.c:731 +#: fe-protocol3.c:733 msgid "insufficient data in \"t\" message" msgstr "недостаточно данных в сообщении \"t\"" -#: fe-protocol3.c:790 fe-protocol3.c:822 fe-protocol3.c:840 +#: fe-protocol3.c:792 fe-protocol3.c:824 fe-protocol3.c:842 msgid "insufficient data in \"D\" message" msgstr "недостаточно данных в сообщении \"D\"" -#: fe-protocol3.c:796 +#: fe-protocol3.c:798 msgid "unexpected field count in \"D\" message" msgstr "неверное число полей в сообщении \"D\"" -#: fe-protocol3.c:1052 +#: fe-protocol3.c:1054 msgid "no error message available\n" msgstr "нет сообщения об ошибке\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1100 fe-protocol3.c:1119 +#: fe-protocol3.c:1102 fe-protocol3.c:1121 #, c-format msgid " at character %s" msgstr " символ %s" -#: fe-protocol3.c:1132 +#: fe-protocol3.c:1134 #, c-format msgid "DETAIL: %s\n" msgstr "ПОДРОБНОСТИ: %s\n" -#: fe-protocol3.c:1135 +#: fe-protocol3.c:1137 #, c-format msgid "HINT: %s\n" msgstr "ПОДСКАЗКА: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1140 #, c-format msgid "QUERY: %s\n" msgstr "ЗАПРОС: %s\n" -#: fe-protocol3.c:1145 +#: fe-protocol3.c:1147 #, c-format msgid "CONTEXT: %s\n" msgstr "КОНТЕКСТ: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1156 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "СХЕМА: %s\n" -#: fe-protocol3.c:1158 +#: fe-protocol3.c:1160 #, c-format msgid "TABLE NAME: %s\n" msgstr "ТАБЛИЦА: %s\n" -#: fe-protocol3.c:1162 +#: fe-protocol3.c:1164 #, c-format msgid "COLUMN NAME: %s\n" msgstr "СТОЛБЕЦ: %s\n" -#: fe-protocol3.c:1166 +#: fe-protocol3.c:1168 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "ТИП ДАННЫХ: %s\n" -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1172 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "ОГРАНИЧЕНИЕ: %s\n" -#: fe-protocol3.c:1182 +#: fe-protocol3.c:1184 msgid "LOCATION: " msgstr "ПОЛОЖЕНИЕ: " -#: fe-protocol3.c:1184 +#: fe-protocol3.c:1186 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1186 +#: fe-protocol3.c:1188 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1394 +#: fe-protocol3.c:1396 #, c-format msgid "LINE %d: " msgstr "СТРОКА %d: " -#: fe-protocol3.c:1456 +#: fe-protocol3.c:1458 #, c-format msgid "" "received invalid protocol negotiation message: server requested downgrade to " @@ -1755,7 +1761,7 @@ msgstr "" "получено некорректное сообщение согласования протокола: сервер запросил " "понижение версии на версию выше" -#: fe-protocol3.c:1462 +#: fe-protocol3.c:1464 #, c-format msgid "" "received invalid protocol negotiation message: server requested downgrade to " @@ -1764,7 +1770,7 @@ msgstr "" "получено некорректное сообщение согласования протокола: сервер запросил " "понижение на версию протокола, предшествующую 3.0" -#: fe-protocol3.c:1469 +#: fe-protocol3.c:1471 #, c-format msgid "" "received invalid protocol negotiation message: server requested downgrade to " @@ -1773,7 +1779,7 @@ msgstr "" "получено некорректное сообщение согласования протокола: сервер запросил " "понижение на несуществующую версию протокола 3.1" -#: fe-protocol3.c:1475 +#: fe-protocol3.c:1477 #, c-format msgid "" "received invalid protocol negotiation message: server reported negative " @@ -1782,7 +1788,7 @@ msgstr "" "получено некорректное сообщение согласования протокола: сервер передал " "отрицательное число неподдерживаемых параметров" -#: fe-protocol3.c:1481 +#: fe-protocol3.c:1483 #, c-format msgid "" "received invalid protocol negotiation message: server negotiated but asks " @@ -1791,7 +1797,7 @@ msgstr "" "получено некорректное сообщение согласования протокола: сервер согласовал " "версию и не требует никаких изменений" -#: fe-protocol3.c:1487 +#: fe-protocol3.c:1489 #, c-format msgid "" "server only supports protocol version %d.%d, but \"%s\" was set to %d.%d" @@ -1799,7 +1805,7 @@ msgstr "" "сервер поддерживает только версию протокола %d.%d, но параметр \"%s\" равен " "%d.%d" -#: fe-protocol3.c:1512 +#: fe-protocol3.c:1514 #, c-format msgid "" "received invalid protocol negotiation message: server reported unsupported " @@ -1808,7 +1814,7 @@ msgstr "" "получено некорректное сообщение согласования протокола: сервер выдал " "неподдерживаемое имя параметра без префикса \"%s\" (\"%s\")" -#: fe-protocol3.c:1515 +#: fe-protocol3.c:1517 #, c-format msgid "" "received invalid protocol negotiation message: server reported an " @@ -1817,14 +1823,14 @@ msgstr "" "получено некорректное сообщение согласования протокола: сервер выдал " "неподдерживаемый параметр, который не был запрошен (\"%s\")" -#: fe-protocol3.c:1522 +#: fe-protocol3.c:1524 #, c-format msgid "received invalid protocol negotiation message: message too short" msgstr "" "получено некорректное сообщение согласования протокола: сообщение слишком " "короткое" -#: fe-protocol3.c:1588 +#: fe-protocol3.c:1590 #, c-format msgid "" "received invalid BackendKeyData message: cancel key with length %d not " @@ -1833,7 +1839,7 @@ msgstr "" "получено некорректное сообщение согласования протокола: ключ отмены длиной " "%d в протоколе версии 3.0 не допускается (длина должна быть 4 байта)" -#: fe-protocol3.c:1595 +#: fe-protocol3.c:1597 #, c-format msgid "" "received invalid BackendKeyData message: cancel key with length %d is too " @@ -1842,7 +1848,7 @@ msgstr "" "получено некорректное сообщение согласования протокола: ключ отмены длиной " "%d слишком короткий (минимальная длина 4 байта)" -#: fe-protocol3.c:1602 +#: fe-protocol3.c:1604 #, c-format msgid "" "received invalid BackendKeyData message: cancel key with length %d is too " @@ -1851,17 +1857,22 @@ msgstr "" "получено некорректное сообщение согласования протокола: ключ отмены длиной " "%d слишком длинный (максимальная длина 256 байт)" -#: fe-protocol3.c:1966 +#: fe-protocol3.c:1975 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline можно вызывать только во время COPY OUT с текстом" -#: fe-protocol3.c:2341 +#: fe-protocol3.c:2306 +#, c-format +msgid "server returned too much data" +msgstr "сервер передал слишком много данных" + +#: fe-protocol3.c:2361 #, c-format msgid "protocol error: no function result" msgstr "ошибка протокола: нет результата функции" -#: fe-protocol3.c:2353 +#: fe-protocol3.c:2373 #, c-format msgid "protocol error: id=0x%x" msgstr "ошибка протокола: id=0x%x" @@ -1923,12 +1934,12 @@ msgstr "ошибка обёртывания сообщения в GSSAPI" msgid "outgoing GSSAPI message would not use confidentiality" msgstr "исходящее сообщение GSSAPI не будет защищено" -#: fe-secure-gssapi.c:215 fe-secure-gssapi.c:726 +#: fe-secure-gssapi.c:215 fe-secure-gssapi.c:733 #, c-format msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "клиент попытался передать чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:602 +#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:609 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" msgstr "сервер передал чрезмерно большой пакет GSSAPI (%zu > %zu)" @@ -1942,114 +1953,124 @@ msgstr "ошибка развёртывания сообщения в GSSAPI" msgid "incoming GSSAPI message did not use confidentiality" msgstr "входящее сообщение GSSAPI не защищено" -#: fe-secure-gssapi.c:665 +#: fe-secure-gssapi.c:672 msgid "could not initiate GSSAPI security context" msgstr "не удалось инициализировать контекст безопасности GSSAPI" -#: fe-secure-gssapi.c:715 +#: fe-secure-gssapi.c:722 msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" -#: fe-secure-openssl.c:185 fe-secure-openssl.c:291 fe-secure-openssl.c:1382 +#: fe-secure-openssl.c:186 fe-secure-openssl.c:322 fe-secure-openssl.c:1414 #, c-format msgid "SSL SYSCALL error: %s" msgstr "ошибка SSL SYSCALL: %s" -#: fe-secure-openssl.c:191 fe-secure-openssl.c:297 fe-secure-openssl.c:1385 +#: fe-secure-openssl.c:192 fe-secure-openssl.c:328 fe-secure-openssl.c:1417 #, c-format msgid "SSL SYSCALL error: EOF detected" msgstr "ошибка SSL SYSCALL: конец файла (EOF)" -#: fe-secure-openssl.c:201 fe-secure-openssl.c:307 fe-secure-openssl.c:1393 +#: fe-secure-openssl.c:202 fe-secure-openssl.c:338 fe-secure-openssl.c:1425 #, c-format msgid "SSL error: %s" msgstr "ошибка SSL: %s" -#: fe-secure-openssl.c:215 fe-secure-openssl.c:321 +#: fe-secure-openssl.c:216 fe-secure-openssl.c:352 #, c-format msgid "SSL connection has been closed unexpectedly" msgstr "SSL-соединение было неожиданно закрыто" -#: fe-secure-openssl.c:220 fe-secure-openssl.c:326 fe-secure-openssl.c:1440 +#: fe-secure-openssl.c:221 fe-secure-openssl.c:357 fe-secure-openssl.c:1472 #, c-format msgid "unrecognized SSL error code: %d" msgstr "нераспознанный код ошибки SSL: %d" -#: fe-secure-openssl.c:368 +#: fe-secure-openssl.c:251 +#, c-format +msgid "OpenSSL reports negative bytes pending" +msgstr "OpenSSL сообщил, что число ожидающих байт отрицательное" + +#: fe-secure-openssl.c:263 +#, c-format +msgid "OpenSSL reports INT_MAX bytes pending" +msgstr "OpenSSL сообщил, что число ожидающих байт равно INT_MAX" + +#: fe-secure-openssl.c:399 #, c-format msgid "could not determine server certificate signature algorithm" msgstr "не удалось определить алгоритм подписи сертификата сервера" -#: fe-secure-openssl.c:388 +#: fe-secure-openssl.c:419 #, c-format msgid "could not find digest for NID %s" msgstr "не удалось найти алгоритм хеширования по NID %s" -#: fe-secure-openssl.c:397 +#: fe-secure-openssl.c:428 #, c-format msgid "could not generate peer certificate hash" msgstr "не удалось сгенерировать хеш сертификата сервера" -#: fe-secure-openssl.c:479 +#: fe-secure-openssl.c:511 #, c-format msgid "SSL certificate's name entry is missing" msgstr "в SSL-сертификате отсутствует запись имени" -#: fe-secure-openssl.c:509 +#: fe-secure-openssl.c:541 #, c-format msgid "SSL certificate's address entry is missing" msgstr "в SSL-сертификате отсутствует запись адреса" -#: fe-secure-openssl.c:715 +#: fe-secure-openssl.c:747 #, c-format msgid "WARNING: could not open SSL key logging file \"%s\": %m\n" msgstr "" "ПРЕДУПРЕЖДЕНИЕ: не удалось открыть файл для диагностики ключа SSL \"%s\": " "%m\n" -#: fe-secure-openssl.c:723 +#: fe-secure-openssl.c:755 #, c-format msgid "WARNING: could not write to SSL key logging file \"%s\": %m\n" msgstr "" "ПРЕДУПРЕЖДЕНИЕ: не удалось записать в файл для диагностики ключа SSL \"%s\": " "%m\n" -#: fe-secure-openssl.c:776 +#: fe-secure-openssl.c:808 #, c-format msgid "could not create SSL context: %s" msgstr "не удалось создать контекст SSL: %s" -#: fe-secure-openssl.c:818 +#: fe-secure-openssl.c:850 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version" msgstr "неверное значение \"%s\" для минимальной версии протокола SSL" -#: fe-secure-openssl.c:828 +#: fe-secure-openssl.c:860 #, c-format msgid "could not set minimum SSL protocol version: %s" msgstr "не удалось задать минимальную версию протокола SSL: %s" -#: fe-secure-openssl.c:844 +#: fe-secure-openssl.c:876 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version" msgstr "неверное значение \"%s\" для максимальной версии протокола SSL" -#: fe-secure-openssl.c:854 +#: fe-secure-openssl.c:886 #, c-format msgid "could not set maximum SSL protocol version: %s" msgstr "не удалось задать максимальную версию протокола SSL: %s" -#: fe-secure-openssl.c:892 +#: fe-secure-openssl.c:924 #, c-format msgid "could not load system root certificate paths: %s" msgstr "не удалось выбрать системные пути для корневых сертификатов: %s" -#: fe-secure-openssl.c:909 +#: fe-secure-openssl.c:941 #, c-format msgid "could not read root certificate file \"%s\": %s" msgstr "не удалось прочитать файл корневых сертификатов \"%s\": %s" -#: fe-secure-openssl.c:961 +#: fe-secure-openssl.c:993 #, c-format msgid "" "could not get home directory to locate root certificate file\n" @@ -2062,7 +2083,7 @@ msgstr "" "(sslrootcert=system) или отключите проверку сертификата сервера, изменив " "sslmode." -#: fe-secure-openssl.c:964 +#: fe-secure-openssl.c:996 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -2075,78 +2096,78 @@ msgstr "" "(sslrootcert=system) или отключите проверку сертификата сервера, изменив " "sslmode." -#: fe-secure-openssl.c:999 +#: fe-secure-openssl.c:1031 #, c-format msgid "could not open certificate file \"%s\": %s" msgstr "не удалось открыть файл сертификата \"%s\": %s" -#: fe-secure-openssl.c:1017 +#: fe-secure-openssl.c:1049 #, c-format msgid "could not read certificate file \"%s\": %s" msgstr "не удалось прочитать файл сертификата \"%s\": %s" -#: fe-secure-openssl.c:1041 +#: fe-secure-openssl.c:1073 #, c-format msgid "could not establish SSL connection: %s" msgstr "не удалось установить SSL-соединение: %s" -#: fe-secure-openssl.c:1058 +#: fe-secure-openssl.c:1090 #, c-format msgid "WARNING: sslkeylogfile support requires OpenSSL\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: для поддержки sslkeylogfile требуется OpenSSL\n" -#: fe-secure-openssl.c:1060 +#: fe-secure-openssl.c:1092 #, c-format msgid "WARNING: libpq was not built with sslkeylogfile support\n" msgstr "" "ПРЕДУПРЕЖДЕНИЕ: сборка libpq была произведена без поддержки sslkeylogfile\n" -#: fe-secure-openssl.c:1090 +#: fe-secure-openssl.c:1122 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s" msgstr "не удалось задать SNI (Server Name Indication) для SSL-подключения: %s" -#: fe-secure-openssl.c:1107 +#: fe-secure-openssl.c:1139 #, c-format msgid "could not set SSL ALPN extension: %s" msgstr "не удалось установить расширение SSL ALPN: %s" -#: fe-secure-openssl.c:1150 +#: fe-secure-openssl.c:1182 #, c-format msgid "could not load SSL engine \"%s\": %s" msgstr "не удалось загрузить модуль SSL ENGINE \"%s\": %s" -#: fe-secure-openssl.c:1161 +#: fe-secure-openssl.c:1193 #, c-format msgid "could not initialize SSL engine \"%s\": %s" msgstr "не удалось инициализировать модуль SSL ENGINE \"%s\": %s" -#: fe-secure-openssl.c:1176 +#: fe-secure-openssl.c:1208 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" msgstr "не удалось прочитать закрытый ключ SSL \"%s\" из модуля \"%s\": %s" -#: fe-secure-openssl.c:1189 +#: fe-secure-openssl.c:1221 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" msgstr "не удалось загрузить закрытый ключ SSL \"%s\" из модуля \"%s\": %s" -#: fe-secure-openssl.c:1226 +#: fe-secure-openssl.c:1258 #, c-format msgid "certificate present, but not private key file \"%s\"" msgstr "при наличии сертификата отсутствует файл закрытого ключа \"%s\"" -#: fe-secure-openssl.c:1229 +#: fe-secure-openssl.c:1261 #, c-format msgid "could not stat private key file \"%s\": %m" msgstr "не удалось получить информацию о файле закрытого ключа \"%s\": %m" -#: fe-secure-openssl.c:1237 +#: fe-secure-openssl.c:1269 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "файл закрытого ключа \"%s\" - не обычный файл" -#: fe-secure-openssl.c:1270 +#: fe-secure-openssl.c:1302 #, c-format msgid "" "private key file \"%s\" has group or world access; file must have " @@ -2158,22 +2179,22 @@ msgstr "" "текущему пользователю, либо u=rw,g=r (0640) или более строгие, если он " "принадлежит root" -#: fe-secure-openssl.c:1294 +#: fe-secure-openssl.c:1326 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "не удалось загрузить файл закрытого ключа \"%s\": %s" -#: fe-secure-openssl.c:1310 +#: fe-secure-openssl.c:1342 #, c-format msgid "certificate does not match private key file \"%s\": %s" msgstr "сертификат не соответствует файлу закрытого ключа \"%s\": %s" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1411 #, c-format msgid "SSL error: certificate verify failed: %s" msgstr "ошибка SSL: не удалось проверить сертификат: %s" -#: fe-secure-openssl.c:1424 +#: fe-secure-openssl.c:1456 #, c-format msgid "" "This may indicate that the server does not support any SSL protocol version " @@ -2182,34 +2203,34 @@ msgstr "" "Это может указывать на то, что сервер не поддерживает ни одну версию " "протокола SSL между %s и %s." -#: fe-secure-openssl.c:1456 +#: fe-secure-openssl.c:1488 #, c-format msgid "" "direct SSL connection was established without ALPN protocol negotiation " "extension" msgstr "прямое SSL-соединение было установлено без расширения ALPN" -#: fe-secure-openssl.c:1468 +#: fe-secure-openssl.c:1500 #, c-format msgid "SSL connection was established with unexpected ALPN protocol" msgstr "SSL-соединение было установлено с неподдерживаемым протоколом ALPN" -#: fe-secure-openssl.c:1485 +#: fe-secure-openssl.c:1517 #, c-format msgid "certificate could not be obtained: %s" msgstr "не удалось получить сертификат: %s" -#: fe-secure-openssl.c:1564 +#: fe-secure-openssl.c:1596 #, c-format msgid "no SSL error reported" msgstr "нет сообщения об ошибке SSL" -#: fe-secure-openssl.c:1607 +#: fe-secure-openssl.c:1639 #, c-format msgid "SSL error code %lu" msgstr "код ошибки SSL: %lu" -#: fe-secure-openssl.c:1909 +#: fe-secure-openssl.c:1941 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: значение sslpassword усечено\n" @@ -2219,7 +2240,7 @@ msgstr "ПРЕДУПРЕЖДЕНИЕ: значение sslpassword усечен msgid "could not receive data from server: %s" msgstr "не удалось получить данные с сервера: %s" -#: fe-secure.c:404 +#: fe-secure.c:428 #, c-format msgid "could not send data to server: %s" msgstr "не удалось передать данные серверу: %s" diff --git a/src/pl/plperl/SPI.xs b/src/pl/plperl/SPI.xs index e81432e6341..ba1e93970a8 100644 --- a/src/pl/plperl/SPI.xs +++ b/src/pl/plperl/SPI.xs @@ -75,7 +75,7 @@ spi_spi_prepare(sv, ...) char* query = sv2cstr(sv); if (items < 1) Perl_croak(aTHX_ "Usage: spi_prepare(query, ...)"); - argv = ( SV**) palloc(( items - 1) * sizeof(SV*)); + argv = palloc_array(SV*, items - 1); for ( i = 1; i < items; i++) argv[i - 1] = ST(i); RETVAL = plperl_spi_prepare(query, items - 1, argv); @@ -103,7 +103,7 @@ spi_spi_exec_prepared(sv, ...) offset++; } argc = items - offset; - argv = ( SV**) palloc( argc * sizeof(SV*)); + argv = palloc_array(SV*, argc); for ( i = 0; offset < items; offset++, i++) argv[i] = ST(offset); ret_hash = plperl_spi_exec_prepared(query, attr, argc, argv); @@ -123,7 +123,7 @@ spi_spi_query_prepared(sv, ...) if ( items < 1) Perl_croak(aTHX_ "Usage: spi_query_prepared(query, " "[\\@bind_values])"); - argv = ( SV**) palloc(( items - 1) * sizeof(SV*)); + argv = palloc_array(SV*, items - 1); for ( i = 1; i < items; i++) argv[i - 1] = ST(i); RETVAL = plperl_spi_query_prepared(query, items - 1, argv); diff --git a/src/pl/plperl/expected/plperl_array.out b/src/pl/plperl/expected/plperl_array.out index 260a55ea7e9..f5803e10a6e 100644 --- a/src/pl/plperl/expected/plperl_array.out +++ b/src/pl/plperl/expected/plperl_array.out @@ -274,3 +274,10 @@ select perl_setof_array('{{1}, {2}, {3}}'); {3} (3 rows) +-- Test a forged PostgreSQL::InServer::ARRAY object lacking the 'array' key +CREATE OR REPLACE FUNCTION perl_forged_array() RETURNS integer[] AS $$ + return bless {}, "PostgreSQL::InServer::ARRAY"; +$$ LANGUAGE plperl; +SELECT perl_forged_array(); +ERROR: could not get array reference from PostgreSQL::InServer::ARRAY object +CONTEXT: PL/Perl function "perl_forged_array" diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 29cb4d7e47f..8252e381bc8 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -1082,8 +1082,8 @@ plperl_build_tuple_result(HV *perlhash, TupleDesc td) HE *he; HeapTuple tup; - values = palloc0(sizeof(Datum) * td->natts); - nulls = palloc(sizeof(bool) * td->natts); + values = palloc0_array(Datum, td->natts); + nulls = palloc_array(bool, td->natts); memset(nulls, true, sizeof(bool) * td->natts); hv_iterinit(perlhash); @@ -1150,7 +1150,7 @@ get_perl_array_ref(SV *sv) HV *hv = (HV *) SvRV(sv); SV **sav = hv_fetch_string(hv, "array"); - if (*sav && SvOK(*sav) && SvROK(*sav) && + if (sav && *sav && SvOK(*sav) && SvROK(*sav) && SvTYPE(SvRV(*sav)) == SVt_PVAV) return *sav; @@ -1167,6 +1167,10 @@ get_perl_array_ref(SV *sv) * if we didn't do it like that, we'd need some other convention for knowing * whether we'd already found any scalars (and thus the number of dimensions * is frozen). + * + * Caller is required to have set dims[cur_depth - 1] to the length of the + * input array, i.e., av_len(av) + 1. We make this requirement so as to + * avoid reading av_len() twice, which is hazardous for tied arrays. */ static void array_to_datum_internal(AV *av, ArrayBuildState **astatep, @@ -1176,7 +1180,7 @@ array_to_datum_internal(AV *av, ArrayBuildState **astatep, { dTHX; int i; - int len = av_len(av) + 1; + int len = dims[cur_depth - 1]; for (i = 0; i < len; i++) { @@ -1502,7 +1506,7 @@ plperl_ref_from_pg_array(Datum arg, Oid typid) * Currently we make no effort to cache any of the stuff we look up here, * which is bad. */ - info = palloc0(sizeof(plperl_array_info)); + info = palloc0_object(plperl_array_info); /* get element type information, including output conversion function */ get_type_io_data(elementtype, IOFunc_output, @@ -1538,7 +1542,7 @@ plperl_ref_from_pg_array(Datum arg, Oid typid) &nitems); /* Get total number of elements in each dimension */ - info->nelems = palloc(sizeof(int) * info->ndims); + info->nelems = palloc_array(int, info->ndims); info->nelems[0] = nitems; for (i = 1; i < info->ndims; i++) info->nelems[i] = info->nelems[i - 1] / dims[i - 1]; @@ -1788,9 +1792,9 @@ plperl_modify_tuple(HV *hvTD, TriggerData *tdata, HeapTuple otup) tupdesc = tdata->tg_relation->rd_att; natts = tupdesc->natts; - modvalues = (Datum *) palloc0(natts * sizeof(Datum)); - modnulls = (bool *) palloc0(natts * sizeof(bool)); - modrepls = (bool *) palloc0(natts * sizeof(bool)); + modvalues = palloc0_array(Datum, natts); + modnulls = palloc0_array(bool, natts); + modrepls = palloc0_array(bool, natts); hv_iterinit(hvNew); while ((he = hv_iternext(hvNew))) @@ -2797,7 +2801,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger, bool is_event_trigger) * struct prodesc and subsidiary data must all live in proc_cxt. ************************************************************/ oldcontext = MemoryContextSwitchTo(proc_cxt); - prodesc = (plperl_proc_desc *) palloc0(sizeof(plperl_proc_desc)); + prodesc = palloc0_object(plperl_proc_desc); prodesc->proname = pstrdup(NameStr(procStruct->proname)); MemoryContextSetIdentifier(proc_cxt, prodesc->proname); prodesc->fn_cxt = proc_cxt; @@ -2805,9 +2809,9 @@ compile_plperl_function(Oid fn_oid, bool is_trigger, bool is_event_trigger) prodesc->fn_xmin = HeapTupleHeaderGetRawXmin(procTup->t_data); prodesc->fn_tid = procTup->t_self; prodesc->nargs = procStruct->pronargs; - prodesc->arg_out_func = (FmgrInfo *) palloc0(prodesc->nargs * sizeof(FmgrInfo)); - prodesc->arg_is_rowtype = (bool *) palloc0(prodesc->nargs * sizeof(bool)); - prodesc->arg_arraytype = (Oid *) palloc0(prodesc->nargs * sizeof(Oid)); + prodesc->arg_out_func = palloc0_array(FmgrInfo, prodesc->nargs); + prodesc->arg_is_rowtype = palloc0_array(bool, prodesc->nargs); + prodesc->arg_arraytype = palloc0_array(Oid, prodesc->nargs); MemoryContextSwitchTo(oldcontext); /* Remember if function is STABLE/IMMUTABLE */ @@ -3596,13 +3600,13 @@ plperl_spi_prepare(char *query, int argc, SV **argv) "PL/Perl spi_prepare query", ALLOCSET_SMALL_SIZES); MemoryContextSwitchTo(plan_cxt); - qdesc = (plperl_query_desc *) palloc0(sizeof(plperl_query_desc)); + qdesc = palloc0_object(plperl_query_desc); snprintf(qdesc->qname, sizeof(qdesc->qname), "%p", qdesc); qdesc->plan_cxt = plan_cxt; qdesc->nargs = argc; - qdesc->argtypes = (Oid *) palloc(argc * sizeof(Oid)); - qdesc->arginfuncs = (FmgrInfo *) palloc(argc * sizeof(FmgrInfo)); - qdesc->argtypioparams = (Oid *) palloc(argc * sizeof(Oid)); + qdesc->argtypes = palloc_array(Oid, argc); + qdesc->arginfuncs = palloc_array(FmgrInfo, argc); + qdesc->argtypioparams = palloc_array(Oid, argc); MemoryContextSwitchTo(oldcontext); /************************************************************ @@ -3773,8 +3777,8 @@ plperl_spi_exec_prepared(char *query, HV *attr, int argc, SV **argv) ************************************************************/ if (argc > 0) { - nulls = (char *) palloc(argc); - argvalues = (Datum *) palloc(argc * sizeof(Datum)); + nulls = palloc_array(char, argc); + argvalues = palloc_array(Datum, argc); } else { @@ -3886,8 +3890,8 @@ plperl_spi_query_prepared(char *query, int argc, SV **argv) ************************************************************/ if (argc > 0) { - nulls = (char *) palloc(argc); - argvalues = (Datum *) palloc(argc * sizeof(Datum)); + nulls = palloc_array(char, argc); + argvalues = palloc_array(Datum, argc); } else { diff --git a/src/pl/plperl/sql/plperl_array.sql b/src/pl/plperl/sql/plperl_array.sql index ca63b5db625..cd1d7e34c50 100644 --- a/src/pl/plperl/sql/plperl_array.sql +++ b/src/pl/plperl/sql/plperl_array.sql @@ -206,3 +206,10 @@ create or replace function perl_setof_array(integer[]) returns setof integer[] l $$; select perl_setof_array('{{1}, {2}, {3}}'); + +-- Test a forged PostgreSQL::InServer::ARRAY object lacking the 'array' key +CREATE OR REPLACE FUNCTION perl_forged_array() RETURNS integer[] AS $$ + return bless {}, "PostgreSQL::InServer::ARRAY"; +$$ LANGUAGE plperl; + +SELECT perl_forged_array(); diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 756d5f7778d..e2fe0fd4b56 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -8044,13 +8044,21 @@ get_cast_hashentry(PLpgSQL_execstate *estate, * If there's no cast path according to the parser, fall back to using * an I/O coercion; this is semantically dubious but matches plpgsql's * historical behavior. We would need something of the sort for - * UNKNOWN literals in any case. (This is probably now only reachable - * in the case where srctype is UNKNOWN/RECORD.) + * UNKNOWN literals in any case. The only case we reject is casting + * to/from INTERNAL. (Other than that case, this is probably now only + * reachable in the case where srctype is UNKNOWN/RECORD.) */ if (cast_expr == NULL) { CoerceViaIO *iocoerce = makeNode(CoerceViaIO); + if (srctype == INTERNALOID || dsttype == INTERNALOID) + ereport(ERROR, + (errcode(ERRCODE_CANNOT_COERCE), + errmsg("cannot cast type %s to %s", + format_type_be(srctype), + format_type_be(dsttype)))); + iocoerce->arg = (Expr *) placeholder; iocoerce->resulttype = dsttype; iocoerce->resultcollid = InvalidOid; diff --git a/src/pl/plpython/expected/plpython_composite.out b/src/pl/plpython/expected/plpython_composite.out index 674af93ddcf..ffce7fc1be7 100644 --- a/src/pl/plpython/expected/plpython_composite.out +++ b/src/pl/plpython/expected/plpython_composite.out @@ -606,3 +606,19 @@ DETAIL: Missing left parenthesis. HINT: To return a composite type in an array, return the composite type as a Python tuple, e.g., "[('foo',)]". CONTEXT: while creating return value PL/Python function "composite_type_as_list_broken" +-- A custom sequence whose length matches the tuple but whose __getitem__ +-- raises should be reported as an error, not crash the backend. +CREATE FUNCTION composite_type_as_broken_sequence() RETURNS type_record AS $$ +class C: + def __len__(self): + return 2 + def __getitem__(self, i): + raise ValueError('getitem failed') +return C() +$$ LANGUAGE plpython3u; +SELECT * FROM composite_type_as_broken_sequence(); +ERROR: could not get element 0 from sequence +DETAIL: ValueError: getitem failed +CONTEXT: Traceback (most recent call last): +while creating return value +PL/Python function "composite_type_as_broken_sequence" diff --git a/src/pl/plpython/expected/plpython_spi.out b/src/pl/plpython/expected/plpython_spi.out index b572f9bf73b..0320ff01f6b 100644 --- a/src/pl/plpython/expected/plpython_spi.out +++ b/src/pl/plpython/expected/plpython_spi.out @@ -451,3 +451,54 @@ SELECT plan_composite_args(); (3,label) (1 row) +-- A custom argument sequence whose length matches the plan but whose +-- __getitem__ raises should be reported as an error, not crash the backend. +CREATE FUNCTION plan_broken_arg_sequence() RETURNS void AS $$ +plan = plpy.prepare("select $1", ["int4"]) +class C: + def __len__(self): + return 1 + def __getitem__(self, i): + raise ValueError('getitem failed') +plpy.execute(plan, C()) +$$ LANGUAGE plpython3u; +SELECT plan_broken_arg_sequence(); +ERROR: spiexceptions.ExternalRoutineException: could not get element 0 from sequence +DETAIL: ValueError: getitem failed +CONTEXT: Traceback (most recent call last): + PL/Python function "plan_broken_arg_sequence", line 8, in + plpy.execute(plan, C()) +PL/Python function "plan_broken_arg_sequence" +-- Likewise for the type-name list passed to plpy.prepare(). +CREATE FUNCTION prepare_broken_type_sequence() RETURNS void AS $$ +class C: + def __len__(self): + return 1 + def __getitem__(self, i): + raise ValueError('getitem failed') +plpy.prepare("select $1", C()) +$$ LANGUAGE plpython3u; +SELECT prepare_broken_type_sequence(); +ERROR: spiexceptions.ExternalRoutineException: could not get element 0 from sequence +DETAIL: ValueError: getitem failed +CONTEXT: Traceback (most recent call last): + PL/Python function "prepare_broken_type_sequence", line 7, in + plpy.prepare("select $1", C()) +PL/Python function "prepare_broken_type_sequence" +-- Likewise for the argument sequence passed to plpy.cursor(). +CREATE FUNCTION cursor_broken_arg_sequence() RETURNS void AS $$ +plan = plpy.prepare("select $1", ["int4"]) +class C: + def __len__(self): + return 1 + def __getitem__(self, i): + raise ValueError('getitem failed') +plpy.cursor(plan, C()) +$$ LANGUAGE plpython3u; +SELECT cursor_broken_arg_sequence(); +ERROR: spiexceptions.ExternalRoutineException: could not get element 0 from sequence +DETAIL: ValueError: getitem failed +CONTEXT: Traceback (most recent call last): + PL/Python function "cursor_broken_arg_sequence", line 8, in + plpy.cursor(plan, C()) +PL/Python function "cursor_broken_arg_sequence" diff --git a/src/pl/plpython/expected/plpython_types.out b/src/pl/plpython/expected/plpython_types.out index 8a680e15c14..0cb3d6ea8c6 100644 --- a/src/pl/plpython/expected/plpython_types.out +++ b/src/pl/plpython/expected/plpython_types.out @@ -796,6 +796,22 @@ SELECT * FROM test_type_conversion_array_error(); ERROR: return value of function with array return type is not a Python sequence CONTEXT: while creating return value PL/Python function "test_type_conversion_array_error" +-- A custom sequence whose __getitem__ raises should be reported as an error, +-- not crash the backend. +CREATE FUNCTION test_type_conversion_array_getitem_fail() RETURNS int[] AS $$ +class C: + def __len__(self): + return 2 + def __getitem__(self, i): + raise ValueError('getitem failed') +return C() +$$ LANGUAGE plpython3u; +SELECT * FROM test_type_conversion_array_getitem_fail(); +ERROR: could not get element 0 from sequence +DETAIL: ValueError: getitem failed +CONTEXT: Traceback (most recent call last): +while creating return value +PL/Python function "test_type_conversion_array_getitem_fail" -- -- Domains over arrays -- diff --git a/src/pl/plpython/plpy_cursorobject.c b/src/pl/plpython/plpy_cursorobject.c index cc74c4df6ba..0725fbc19f2 100644 --- a/src/pl/plpython/plpy_cursorobject.c +++ b/src/pl/plpython/plpy_cursorobject.c @@ -258,6 +258,11 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) PyObject *elem; elem = PySequence_GetItem(args, j); + + /* PySequence_GetItem() can return NULL, with an exception set */ + if (elem == NULL) + PLy_elog(ERROR, "could not get element %d from sequence", j); + PG_TRY(2); { bool isnull; diff --git a/src/pl/plpython/plpy_spi.c b/src/pl/plpython/plpy_spi.c index 1e386aadcca..ce9f57060cf 100644 --- a/src/pl/plpython/plpy_spi.c +++ b/src/pl/plpython/plpy_spi.c @@ -86,6 +86,11 @@ PLy_spi_prepare(PyObject *self, PyObject *args) int32 typmod; optr = PySequence_GetItem(list, i); + + /* PySequence_GetItem() can return NULL, with an exception set */ + if (optr == NULL) + PLy_elog(ERROR, "could not get element %d from sequence", i); + if (PyUnicode_Check(optr)) sptr = PLyUnicode_AsString(optr); else @@ -248,6 +253,11 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) PyObject *elem; elem = PySequence_GetItem(list, j); + + /* PySequence_GetItem() can return NULL, with an exception set */ + if (elem == NULL) + PLy_elog(ERROR, "could not get element %d from sequence", j); + PG_TRY(2); { bool isnull; diff --git a/src/pl/plpython/plpy_typeio.c b/src/pl/plpython/plpy_typeio.c index f6509a41902..462778e8afe 100644 --- a/src/pl/plpython/plpy_typeio.c +++ b/src/pl/plpython/plpy_typeio.c @@ -1209,6 +1209,10 @@ PLySequence_ToArray_recurse(PyObject *obj, ArrayBuildState **astatep, /* fetch the array element */ PyObject *subobj = PySequence_GetItem(obj, i); + /* PySequence_GetItem() can return NULL, with an exception set */ + if (subobj == NULL) + PLy_elog(ERROR, "could not get element %d from sequence", i); + /* need PG_TRY to ensure we release the subobj's refcount */ PG_TRY(); { @@ -1455,7 +1459,10 @@ PLySequence_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *sequence) PG_TRY(); { value = PySequence_GetItem(sequence, idx); - Assert(value); + + /* PySequence_GetItem() can return NULL, with an exception set */ + if (value == NULL) + PLy_elog(ERROR, "could not get element %d from sequence", idx); values[i] = att->func(att, value, &nulls[i], false); diff --git a/src/pl/plpython/po/de.po b/src/pl/plpython/po/de.po index 29962f117e2..63db386507a 100644 --- a/src/pl/plpython/po/de.po +++ b/src/pl/plpython/po/de.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 12\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-04 23:38+0000\n" -"PO-Revision-Date: 2023-05-05 07:45+0200\n" +"POT-Creation-Date: 2026-08-08 06:09+0000\n" +"PO-Revision-Date: 2026-08-08 09:40+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -19,298 +19,304 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: plpy_cursorobject.c:72 +#: plpy_cursorobject.c:91 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor hat eine Anfrage oder einen Plan erwartet" -#: plpy_cursorobject.c:155 +#: plpy_cursorobject.c:177 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor nimmt eine Sequenz als zweites Argument" -#: plpy_cursorobject.c:171 plpy_spi.c:205 +#: plpy_cursorobject.c:193 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "konnte Plan nicht ausführen" -#: plpy_cursorobject.c:174 plpy_spi.c:208 +#: plpy_cursorobject.c:196 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" msgstr[0] "Sequenz aus %d Argument erwartet, aber %d erhalten: %s" msgstr[1] "Sequenz aus %d Argumenten erwartet, aber %d erhalten: %s" -#: plpy_cursorobject.c:321 +#: plpy_cursorobject.c:264 plpy_spi.c:92 plpy_spi.c:259 plpy_typeio.c:1214 +#: plpy_typeio.c:1465 +#, c-format +msgid "could not get element %d from sequence" +msgstr "konnte Element %d aus Sequenz nicht ermitteln" + +#: plpy_cursorobject.c:354 #, c-format msgid "iterating a closed cursor" msgstr "Iteration mit einem geschlossenen Cursor" -#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 +#: plpy_cursorobject.c:362 plpy_cursorobject.c:428 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "Iteration mit einem Cursor in einer abgebrochenen Transaktionen" -#: plpy_cursorobject.c:387 +#: plpy_cursorobject.c:420 #, c-format msgid "fetch from a closed cursor" msgstr "Lesen aus einem geschlossenen Cursor" -#: plpy_cursorobject.c:430 plpy_spi.c:401 +#: plpy_cursorobject.c:463 plpy_spi.c:399 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "Anfrageergebnis hat zu viele Zeilen, um in eine Python-Liste zu passen" -#: plpy_cursorobject.c:482 +#: plpy_cursorobject.c:515 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "Schließen eines Cursors in einer abgebrochenen Subtransaktion" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 +#: plpy_elog.c:127 plpy_elog.c:128 plpy_plpymodule.c:527 #, c-format msgid "%s" msgstr "%s" -#: plpy_exec.c:139 +#: plpy_exec.c:137 #, c-format msgid "unsupported set function return mode" msgstr "nicht unterstützter Rückgabemodus für Funktion mit Mengenergebnis" -#: plpy_exec.c:140 +#: plpy_exec.c:138 #, c-format msgid "PL/Python set-returning functions only support returning one value per call." msgstr "PL/Python unterstützt für Funktionen mit Mengenergebnis nur das Zurückgeben von einem Wert pro Aufruf." -#: plpy_exec.c:153 +#: plpy_exec.c:151 #, c-format msgid "returned object cannot be iterated" msgstr "zurückgegebenes Objekt kann nicht iteriert werden" -#: plpy_exec.c:154 +#: plpy_exec.c:152 #, c-format msgid "PL/Python set-returning functions must return an iterable object." msgstr "PL/Python-Funktionen mit Mengenergebnis müssen ein iterierbares Objekt zurückgeben." -#: plpy_exec.c:168 +#: plpy_exec.c:166 #, c-format msgid "error fetching next item from iterator" msgstr "Fehler beim Auslesen des nächsten Elements vom Iterator" -#: plpy_exec.c:211 +#: plpy_exec.c:209 #, c-format msgid "PL/Python procedure did not return None" msgstr "PL/Python-Prozedur hat nicht None zurückgegeben" -#: plpy_exec.c:215 +#: plpy_exec.c:213 #, c-format msgid "PL/Python function with return type \"void\" did not return None" msgstr "PL/Python-Funktion mit Rückgabetyp »void« hat nicht None zurückgegeben" -#: plpy_exec.c:369 plpy_exec.c:393 +#: plpy_exec.c:244 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "Funktion, die einen Record zurückgibt, in einem Zusammenhang aufgerufen, der Typ record nicht verarbeiten kann" + +#: plpy_exec.c:390 plpy_exec.c:414 #, c-format msgid "unexpected return value from trigger procedure" msgstr "unerwarteter Rückgabewert von Triggerprozedur" -#: plpy_exec.c:370 +#: plpy_exec.c:391 #, c-format msgid "Expected None or a string." msgstr "Erwartete None oder eine Zeichenkette." -#: plpy_exec.c:383 +#: plpy_exec.c:404 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "PL/Python-Funktion gab in einem DELETE-Trigger \"MODIFY\" zurück -- ignoriert" -#: plpy_exec.c:394 +#: plpy_exec.c:415 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Erwartete None, \"OK\", \"SKIP\" oder \"MODIFY\"." -#: plpy_exec.c:444 +#: plpy_exec.c:466 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() fehlgeschlagen, beim Einrichten der Argumente" -#: plpy_exec.c:448 +#: plpy_exec.c:470 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() fehlgeschlagen, beim Einrichten der Argumente" -#: plpy_exec.c:460 -#, c-format -msgid "function returning record called in context that cannot accept type record" -msgstr "Funktion, die einen Record zurückgibt, in einem Zusammenhang aufgerufen, der Typ record nicht verarbeiten kann" - -#: plpy_exec.c:677 +#: plpy_exec.c:699 #, c-format msgid "while creating return value" msgstr "beim Erzeugen des Rückgabewerts" -#: plpy_exec.c:924 +#: plpy_exec.c:950 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] wurde gelöscht, kann Zeile nicht ändern" -#: plpy_exec.c:929 +#: plpy_exec.c:955 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] ist kein Dictionary" -#: plpy_exec.c:954 +#: plpy_exec.c:980 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "Dictionary-Schlüssel auf Position %d in TD[\"new\"] ist keine Zeichenkette" -#: plpy_exec.c:961 +#: plpy_exec.c:987 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "in TD[\"new\"] gefundener Schlüssel »%s« existiert nicht als Spalte in der den Trigger auslösenden Zeile" -#: plpy_exec.c:966 +#: plpy_exec.c:992 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "Systemattribut »%s« kann nicht gesetzt werden" -#: plpy_exec.c:971 +#: plpy_exec.c:997 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kann generierte Spalte »%s« nicht setzen" -#: plpy_exec.c:1029 +#: plpy_exec.c:1055 #, c-format msgid "while modifying trigger row" msgstr "beim Ändern der Triggerzeile" -#: plpy_exec.c:1087 +#: plpy_exec.c:1107 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "Abbruch einer Subtransaktion, die nicht beendet wurde, wird erzwungen" -#: plpy_main.c:109 +#: plpy_main.c:112 #, c-format msgid "multiple Python libraries are present in session" msgstr "in dieser Sitzung sind mehrere Python-Bibliotheken präsent" -#: plpy_main.c:110 +#: plpy_main.c:113 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Nur eine Python-Hauptversion kann in einer Sitzung verwendet werden." -#: plpy_main.c:122 +#: plpy_main.c:125 #, c-format msgid "untrapped error in initialization" msgstr "nicht abgefangener Fehler bei der Initialisierung" -#: plpy_main.c:145 +#: plpy_main.c:148 #, c-format msgid "could not import \"__main__\" module" msgstr "konnte Modul »__main__« nicht importieren" -#: plpy_main.c:154 +#: plpy_main.c:157 #, c-format msgid "could not initialize globals" msgstr "konnte globale Objekte nicht initialisieren" -#: plpy_main.c:352 +#: plpy_main.c:353 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "PL/Python-Prozedur »%s«" -#: plpy_main.c:355 +#: plpy_main.c:356 #, c-format msgid "PL/Python function \"%s\"" msgstr "PL/Python-Funktion »%s«" -#: plpy_main.c:363 +#: plpy_main.c:364 #, c-format msgid "PL/Python anonymous code block" msgstr "anonymer PL/Python-Codeblock" -#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 +#: plpy_plpymodule.c:165 plpy_plpymodule.c:168 #, c-format msgid "could not import \"plpy\" module" msgstr "konnte Modul »plpy« nicht importieren" -#: plpy_plpymodule.c:182 +#: plpy_plpymodule.c:179 #, c-format msgid "could not create the spiexceptions module" msgstr "konnte das Modul »spiexceptions« nicht erzeugen" -#: plpy_plpymodule.c:190 +#: plpy_plpymodule.c:187 #, c-format msgid "could not add the spiexceptions module" msgstr "konnte das Modul »spiexceptions« nicht hinzufügen" -#: plpy_plpymodule.c:257 +#: plpy_plpymodule.c:254 #, c-format msgid "could not generate SPI exceptions" msgstr "konnte SPI-Ausnahmen nicht erzeugen" -#: plpy_plpymodule.c:425 +#: plpy_plpymodule.c:422 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "konnte Argumente in plpy.elog nicht entpacken" -#: plpy_plpymodule.c:434 +#: plpy_plpymodule.c:431 msgid "could not parse error message in plpy.elog" msgstr "konnte Fehlermeldung in plpy.elog nicht parsen" -#: plpy_plpymodule.c:451 +#: plpy_plpymodule.c:448 #, c-format msgid "argument 'message' given by name and position" msgstr "Argument »message« wurde durch Namen und Position angegeben" -#: plpy_plpymodule.c:478 +#: plpy_plpymodule.c:475 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "»%s« ist ein ungültiges Schlüsselwortargument für diese Funktion" -#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 +#: plpy_plpymodule.c:486 plpy_plpymodule.c:492 #, c-format msgid "invalid SQLSTATE code" msgstr "ungültiger SQLSTATE-Code" -#: plpy_procedure.c:225 +#: plpy_procedure.c:223 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggerfunktionen können nur als Trigger aufgerufen werden" -#: plpy_procedure.c:229 +#: plpy_procedure.c:227 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "PL/Python-Funktionen können keinen Rückgabetyp %s haben" -#: plpy_procedure.c:307 +#: plpy_procedure.c:305 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "PL/Python-Funktionen können Typ %s nicht annehmen" -#: plpy_procedure.c:395 +#: plpy_procedure.c:396 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "konnte PL/Python-Funktion »%s« nicht kompilieren" -#: plpy_procedure.c:398 +#: plpy_procedure.c:399 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "konnte anonymen PL/Python-Codeblock nicht kompilieren" -#: plpy_resultobject.c:117 plpy_resultobject.c:143 plpy_resultobject.c:169 +#: plpy_resultobject.c:148 plpy_resultobject.c:174 plpy_resultobject.c:200 #, c-format msgid "command did not produce a result set" msgstr "Befehl hat keine Ergebnismenge erzeugt" -#: plpy_spi.c:56 +#: plpy_spi.c:53 #, c-format msgid "second argument of plpy.prepare must be a sequence" msgstr "zweites Argument von plpy.prepare muss eine Sequenz sein" -#: plpy_spi.c:98 +#: plpy_spi.c:99 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: Typname auf Position %d ist keine Zeichenkette" -#: plpy_spi.c:170 +#: plpy_spi.c:171 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute hat eine Anfrage oder einen Plan erwartet" @@ -320,32 +326,32 @@ msgstr "plpy.execute hat eine Anfrage oder einen Plan erwartet" msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute nimmt eine Sequenz als zweites Argument" -#: plpy_spi.c:297 +#: plpy_spi.c:295 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan fehlgeschlagen: %s" -#: plpy_spi.c:339 +#: plpy_spi.c:337 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute fehlgeschlagen: %s" -#: plpy_subxactobject.c:92 +#: plpy_subxactobject.c:102 #, c-format msgid "this subtransaction has already been entered" msgstr "diese Subtransaktion wurde bereits begonnen" -#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 +#: plpy_subxactobject.c:108 plpy_subxactobject.c:166 #, c-format msgid "this subtransaction has already been exited" msgstr "diese Subtransaktion wurde bereits beendet" -#: plpy_subxactobject.c:150 +#: plpy_subxactobject.c:160 #, c-format msgid "this subtransaction has not been entered" msgstr "diese Subtransaktion wurde nicht begonnen" -#: plpy_subxactobject.c:162 +#: plpy_subxactobject.c:172 #, c-format msgid "there is no subtransaction to exit from" msgstr "es gibt keine Subtransaktion zu beenden" @@ -365,87 +371,87 @@ msgstr "kein Attribut »Decimal« im Modul" msgid "conversion from numeric to Decimal failed" msgstr "Umwandlung von numeric in Decimal fehlgeschlagen" -#: plpy_typeio.c:912 +#: plpy_typeio.c:915 #, c-format msgid "could not create bytes representation of Python object" msgstr "konnte Bytes-Darstellung eines Python-Objektes nicht erzeugen" -#: plpy_typeio.c:1049 +#: plpy_typeio.c:1052 #, c-format msgid "could not create string representation of Python object" msgstr "konnte Zeichenkettendarstellung eines Python-Objektes nicht erzeugen" -#: plpy_typeio.c:1060 +#: plpy_typeio.c:1063 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "konnte Python-Objekt nicht in cstring umwandeln: Python-Zeichenkettendarstellung enthält anscheinend Null-Bytes" -#: plpy_typeio.c:1157 +#: plpy_typeio.c:1160 #, c-format msgid "return value of function with array return type is not a Python sequence" msgstr "Rückgabewert von Funktion mit Array-Rückgabetyp ist keine Python-Sequenz" -#: plpy_typeio.c:1202 +#: plpy_typeio.c:1205 #, c-format msgid "could not determine sequence length for function return value" msgstr "konnte Sequenzlänge für Funktionsrückgabewert nicht ermitteln" -#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 +#: plpy_typeio.c:1229 plpy_typeio.c:1244 plpy_typeio.c:1260 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dimensionen haben" -#: plpy_typeio.c:1227 +#: plpy_typeio.c:1234 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "Anzahl der Arraydimensionen überschreitet erlaubtes Maximum (%d)" -#: plpy_typeio.c:1329 +#: plpy_typeio.c:1336 #, c-format msgid "malformed record literal: \"%s\"" msgstr "fehlerhafte Record-Konstante: »%s«" -#: plpy_typeio.c:1330 +#: plpy_typeio.c:1337 #, c-format msgid "Missing left parenthesis." msgstr "Linke Klammer fehlt." -#: plpy_typeio.c:1331 plpy_typeio.c:1532 +#: plpy_typeio.c:1338 plpy_typeio.c:1542 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "Um einen zusammengesetzten Typ in einem Array zurückzugeben, geben Sie den zusammengesetzten Typ als ein Python-Tupel zurück, z.B. »[('foo',)]«." -#: plpy_typeio.c:1378 +#: plpy_typeio.c:1385 #, c-format msgid "key \"%s\" not found in mapping" msgstr "Schlüssel »%s« nicht in Mapping gefunden" -#: plpy_typeio.c:1379 +#: plpy_typeio.c:1386 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "Um einen NULL-Wert in einer Spalte zurückzugeben, muss der Wert None mit einem nach der Spalte benannten Schlüssel in das Mapping eingefügt werden." -#: plpy_typeio.c:1432 +#: plpy_typeio.c:1439 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "Länge der zurückgegebenen Sequenz hat nicht mit der Anzahl der Spalten in der Zeile übereingestimmt" -#: plpy_typeio.c:1530 +#: plpy_typeio.c:1540 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "Attribut »%s« existiert nicht in Python-Objekt" -#: plpy_typeio.c:1533 +#: plpy_typeio.c:1543 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "Um einen NULL-Wert in einer Spalte zurückzugeben, muss das zurückzugebende Objekt ein nach der Spalte benanntes Attribut mit dem Wert None haben." -#: plpy_util.c:31 +#: plpy_util.c:29 #, c-format msgid "could not convert Python Unicode object to bytes" msgstr "konnte Python-Unicode-Objekt nicht in Bytes umwandeln" -#: plpy_util.c:37 +#: plpy_util.c:35 #, c-format msgid "could not extract bytes from encoded string" msgstr "konnte kodierte Zeichenkette nicht in Bytes umwandeln" diff --git a/src/pl/plpython/po/ja.po b/src/pl/plpython/po/ja.po index 567047829a9..ba0d9c1ad4c 100644 --- a/src/pl/plpython/po/ja.po +++ b/src/pl/plpython/po/ja.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL 15)\n" +"Project-Id-Version: plpython (PostgreSQL 18)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2019-06-11 11:34+0900\n" -"PO-Revision-Date: 2021-08-25 17:42+0900\n" +"POT-Creation-Date: 2026-06-30 10:00+0900\n" +"PO-Revision-Date: 2026-06-30 10:22+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -18,364 +18,353 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: plpy_cursorobject.c:78 +#: plpy_cursorobject.c:91 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor は問い合わせもしくは実行計画を期待していました" -#: plpy_cursorobject.c:161 +#: plpy_cursorobject.c:177 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor は第二引数としてシーケンスを取ります" -#: plpy_cursorobject.c:177 plpy_spi.c:211 +#: plpy_cursorobject.c:193 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "実行計画を実行できませんでした" -#: plpy_cursorobject.c:180 plpy_spi.c:214 +#: plpy_cursorobject.c:196 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" msgstr[0] "%d 個の引数のシーケンスを期待していましたが、個数は %d でした:%s" -#: plpy_cursorobject.c:329 +#: plpy_cursorobject.c:264 plpy_spi.c:92 plpy_spi.c:259 plpy_typeio.c:1214 +#: plpy_typeio.c:1465 +#, c-format +msgid "could not get element %d from sequence" +msgstr "シーケンスから要素 %d を取得できませんでした" + +#: plpy_cursorobject.c:354 #, c-format msgid "iterating a closed cursor" msgstr "反復利用しようとしているカーソルは、すでにクローズされています" -#: plpy_cursorobject.c:337 plpy_cursorobject.c:403 +#: plpy_cursorobject.c:362 plpy_cursorobject.c:428 #, c-format msgid "iterating a cursor in an aborted subtransaction" -msgstr "" -"中断されたサブトランザクションの中でカーソルを反復利用しようとしています" +msgstr "中断されたサブトランザクションの中でカーソルを反復利用しようとしています" -#: plpy_cursorobject.c:395 +#: plpy_cursorobject.c:420 #, c-format msgid "fetch from a closed cursor" msgstr "クローズされたカーソルからのフェッチ" -#: plpy_cursorobject.c:438 plpy_spi.c:409 +#: plpy_cursorobject.c:463 plpy_spi.c:399 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "問い合わせの結果に含まれる行数が、Pythonのリストに対して多すぎます" -#: plpy_cursorobject.c:490 +#: plpy_cursorobject.c:515 #, c-format msgid "closing a cursor in an aborted subtransaction" -msgstr "" -"中断されたサブトランザクションの中でカーソルをクローズしようとしています" +msgstr "中断されたサブトランザクションの中でカーソルをクローズしようとしています" -#: plpy_elog.c:129 plpy_elog.c:130 plpy_plpymodule.c:553 +#: plpy_elog.c:127 plpy_elog.c:128 plpy_plpymodule.c:527 #, c-format msgid "%s" msgstr "%s" -#: plpy_exec.c:143 +#: plpy_exec.c:137 #, c-format msgid "unsupported set function return mode" msgstr "非サポートの集合関数リターンモードです。" -#: plpy_exec.c:144 +#: plpy_exec.c:138 #, c-format -msgid "" -"PL/Python set-returning functions only support returning one value per call." -msgstr "" -"集合を返却するPL/Python関数では、1回の呼び出しに対して1つの値を返すことのみが" -"サポートされています。" +msgid "PL/Python set-returning functions only support returning one value per call." +msgstr "集合を返却するPL/Python関数では、1回の呼び出しに対して1つの値を返すことのみがサポートされています。" -#: plpy_exec.c:157 +#: plpy_exec.c:151 #, c-format msgid "returned object cannot be iterated" msgstr "返されたオブジェクトは反復利用できません" -#: plpy_exec.c:158 +#: plpy_exec.c:152 #, c-format msgid "PL/Python set-returning functions must return an iterable object." -msgstr "" -"PL/Pythonの集合を返す関数は、反復処理可能なオブジェクトを返さなければなりませ" -"ん。" +msgstr "PL/Pythonの集合を返す関数は、反復処理可能なオブジェクトを返さなければなりません。" -#: plpy_exec.c:172 +#: plpy_exec.c:166 #, c-format msgid "error fetching next item from iterator" msgstr "反復子から次の項目を取り出せませんでした" -#: plpy_exec.c:215 +#: plpy_exec.c:209 #, c-format msgid "PL/Python procedure did not return None" msgstr "PL/Python プロシージャが None を返しませんでした" -#: plpy_exec.c:219 +#: plpy_exec.c:213 #, c-format msgid "PL/Python function with return type \"void\" did not return None" msgstr "戻り値が\"void\"型である PL/Python関数がNoneを返しませんでした" -#: plpy_exec.c:375 plpy_exec.c:401 +#: plpy_exec.c:244 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されました" + +#: plpy_exec.c:390 plpy_exec.c:414 #, c-format msgid "unexpected return value from trigger procedure" msgstr "トリガプロシージャから期待しない戻り値が返されました" -#: plpy_exec.c:376 +#: plpy_exec.c:391 #, c-format msgid "Expected None or a string." msgstr "None もしくは文字列を期待していました。" -#: plpy_exec.c:391 +#: plpy_exec.c:404 #, c-format -msgid "" -"PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" -msgstr "" -"PL/Python トリガ関数が、DELETE トリガで \"MODIFY\" を返しました-- 無視します" +msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" +msgstr "PL/Python トリガ関数が、DELETE トリガで \"MODIFY\" を返しました-- 無視します" -#: plpy_exec.c:402 +#: plpy_exec.c:415 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "None, \"OK\", \"SKIP\", \"MODIFY\" のいずれかを期待していました。" -#: plpy_exec.c:452 +#: plpy_exec.c:466 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "引数を設定する際に、PyList_SetItem() に失敗しました" -#: plpy_exec.c:456 +#: plpy_exec.c:470 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "引数を設定する際に、PyDict_SetItemString() に失敗しました" -#: plpy_exec.c:468 -#, c-format -msgid "" -"function returning record called in context that cannot accept type record" -msgstr "" -"レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されまし" -"た" - -#: plpy_exec.c:685 +#: plpy_exec.c:699 #, c-format msgid "while creating return value" msgstr "戻り値を生成する際に" -#: plpy_exec.c:919 +#: plpy_exec.c:950 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] は削除されました。行を変更できません。" -#: plpy_exec.c:924 +#: plpy_exec.c:955 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] は辞書ではありません" -#: plpy_exec.c:951 +#: plpy_exec.c:980 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "TD[\"new\"] 辞書の%d番目のキーが文字列ではありません" -#: plpy_exec.c:958 +#: plpy_exec.c:987 #, c-format -msgid "" -"key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering " -"row" -msgstr "" -"TD[\"new\"] で見つかったキー \"%s\" は、行レベルトリガにおけるカラムとしては" -"存在しません" +msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" +msgstr "TD[\"new\"] で見つかったキー \"%s\" は、行レベルトリガにおけるカラムとしては存在しません" -#: plpy_exec.c:963 +#: plpy_exec.c:992 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "システム属性\"%s\"は設定できません" -#: plpy_exec.c:968 +#: plpy_exec.c:997 #, c-format -#| msgid "cannot alter inherited column \"%s\"" msgid "cannot set generated column \"%s\"" msgstr "生成列\"%s\"は設定できません" -#: plpy_exec.c:1026 +#: plpy_exec.c:1055 #, c-format msgid "while modifying trigger row" msgstr "トリガ行を変更する際に" -#: plpy_exec.c:1087 +#: plpy_exec.c:1107 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "終了していないサブトランザクションを強制的にアボートしています" -#: plpy_main.c:125 +#: plpy_main.c:112 #, c-format msgid "multiple Python libraries are present in session" msgstr "セッションに複数の Python ライブラリが存在します" -#: plpy_main.c:126 +#: plpy_main.c:113 #, c-format msgid "Only one Python major version can be used in one session." msgstr "1個のセッション中で使えるPythonのメジャーバージョンは1種類だけです。" -#: plpy_main.c:142 +#: plpy_main.c:125 #, c-format msgid "untrapped error in initialization" msgstr "初期化中に捕捉できないエラーがありました" -#: plpy_main.c:165 +#: plpy_main.c:148 #, c-format msgid "could not import \"__main__\" module" msgstr "\"__main__\" モジュールをインポートできませんでした" -#: plpy_main.c:174 +#: plpy_main.c:157 #, c-format msgid "could not initialize globals" msgstr "グローバル変数(globals)を初期化できませんでした" -#: plpy_main.c:399 +#: plpy_main.c:353 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "PL/Pythonプロシージャ\"%s\"" -#: plpy_main.c:402 +#: plpy_main.c:356 #, c-format msgid "PL/Python function \"%s\"" msgstr "PL/Python関数\"%s\"" -#: plpy_main.c:410 +#: plpy_main.c:364 #, c-format msgid "PL/Python anonymous code block" msgstr "PL/Pythonの無名コードブロック" -#: plpy_plpymodule.c:186 plpy_plpymodule.c:189 +#: plpy_plpymodule.c:165 plpy_plpymodule.c:168 #, c-format msgid "could not import \"plpy\" module" msgstr "\"plpy\"モジュールをインポートできませんでした" -#: plpy_plpymodule.c:204 +#: plpy_plpymodule.c:179 #, c-format msgid "could not create the spiexceptions module" msgstr "spiexceptionsモジュールを生成できませんでした" -#: plpy_plpymodule.c:212 +#: plpy_plpymodule.c:187 #, c-format msgid "could not add the spiexceptions module" msgstr "spiexceptionsモジュールを追加できませんでした" -#: plpy_plpymodule.c:280 +#: plpy_plpymodule.c:254 #, c-format msgid "could not generate SPI exceptions" msgstr "SPI例外を生成できませんでした" -#: plpy_plpymodule.c:448 +#: plpy_plpymodule.c:422 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "plpy.elogで引数を展開できませんでした" -#: plpy_plpymodule.c:457 +#: plpy_plpymodule.c:431 msgid "could not parse error message in plpy.elog" msgstr "plpy.elogでエラーメッセージをパースできませんでした" -#: plpy_plpymodule.c:474 +#: plpy_plpymodule.c:448 #, c-format msgid "argument 'message' given by name and position" msgstr "名前と位置で 'message' 引数が渡されました" -#: plpy_plpymodule.c:501 +#: plpy_plpymodule.c:475 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "この関数に対して'%s'は無効なキーワード引数です" -#: plpy_plpymodule.c:512 plpy_plpymodule.c:518 +#: plpy_plpymodule.c:486 plpy_plpymodule.c:492 #, c-format msgid "invalid SQLSTATE code" msgstr "無効なSQLSTATEコードです" -#: plpy_procedure.c:230 +#: plpy_procedure.c:223 #, c-format msgid "trigger functions can only be called as triggers" msgstr "トリガー関数はトリガーとしてのみ呼び出せます" -#: plpy_procedure.c:234 +#: plpy_procedure.c:227 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "PL/Python関数は%s型を返せません" -#: plpy_procedure.c:312 +#: plpy_procedure.c:305 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "PL/Python関数は%s型を受け付けられません" -#: plpy_procedure.c:402 +#: plpy_procedure.c:396 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "PL/Python関数\"%s\"をコンパイルできませんでした" -#: plpy_procedure.c:405 +#: plpy_procedure.c:399 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "PL/Python無名コードブロックをコンパイルできませんでした" -#: plpy_resultobject.c:121 plpy_resultobject.c:147 plpy_resultobject.c:173 +#: plpy_resultobject.c:148 plpy_resultobject.c:174 plpy_resultobject.c:200 #, c-format msgid "command did not produce a result set" msgstr "コマンドは結果セットを生成しませんでした" -#: plpy_spi.c:60 +#: plpy_spi.c:53 #, c-format msgid "second argument of plpy.prepare must be a sequence" msgstr "plpy.prepareの第二引数はシーケンスでなければなりません" -#: plpy_spi.c:104 +#: plpy_spi.c:99 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: %d 番目の型名が文字列ではありません" -#: plpy_spi.c:176 +#: plpy_spi.c:171 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute は問い合わせもしくは実行計画を期待していました" -#: plpy_spi.c:195 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute は第二引数としてシーケンスを取ります" -#: plpy_spi.c:305 +#: plpy_spi.c:295 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan が失敗しました: %s" -#: plpy_spi.c:347 +#: plpy_spi.c:337 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute が失敗しました: %s" -#: plpy_subxactobject.c:97 +#: plpy_subxactobject.c:102 #, c-format msgid "this subtransaction has already been entered" msgstr "すでにこのサブトランザクションの中に入っています" -#: plpy_subxactobject.c:103 plpy_subxactobject.c:161 +#: plpy_subxactobject.c:108 plpy_subxactobject.c:166 #, c-format msgid "this subtransaction has already been exited" msgstr "このサブトランザクションからすでに抜けています" -#: plpy_subxactobject.c:155 +#: plpy_subxactobject.c:160 #, c-format msgid "this subtransaction has not been entered" msgstr "このサブトランザクションには入っていません" -#: plpy_subxactobject.c:167 +#: plpy_subxactobject.c:172 #, c-format msgid "there is no subtransaction to exit from" msgstr "抜けるべきサブトランザクションがありません" -#: plpy_typeio.c:591 +#: plpy_typeio.c:588 #, c-format msgid "could not import a module for Decimal constructor" msgstr "Decimalコンストラクタのためのモジュールをインポートできませんでした" -#: plpy_typeio.c:595 +#: plpy_typeio.c:592 #, c-format msgid "no Decimal attribute in module" msgstr "モジュールの中にDecimal属性が含まれていません" -#: plpy_typeio.c:601 +#: plpy_typeio.c:598 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "numericからDecimalへの変換に失敗しました" @@ -385,113 +374,91 @@ msgstr "numericからDecimalへの変換に失敗しました" msgid "could not create bytes representation of Python object" msgstr "Pythonオブジェクトのバイト表現を生成できませんでした" -#: plpy_typeio.c:1063 +#: plpy_typeio.c:1052 #, c-format msgid "could not create string representation of Python object" msgstr "Pythonオブジェクトの文字列表現を生成できませんでした" -#: plpy_typeio.c:1074 +#: plpy_typeio.c:1063 #, c-format -msgid "" -"could not convert Python object into cstring: Python string representation " -"appears to contain null bytes" -msgstr "" -"Pythonオブジェクトをcstringに変換できませんでした: Pythonの文字列表現にnullバ" -"イトが含まれているようです" +msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" +msgstr "Pythonオブジェクトをcstringに変換できませんでした: Pythonの文字列表現にnullバイトが含まれているようです" -#: plpy_typeio.c:1183 +#: plpy_typeio.c:1160 #, c-format -msgid "number of array dimensions exceeds the maximum allowed (%d)" -msgstr "配列の次元数が制限値(%d)を超えています" +msgid "return value of function with array return type is not a Python sequence" +msgstr "配列型を返す関数の戻り値がPythonのシーケンスではありません" -#: plpy_typeio.c:1187 +#: plpy_typeio.c:1205 #, c-format msgid "could not determine sequence length for function return value" msgstr "関数の戻り値について、シーケンスの長さを決定できませんでした" -#: plpy_typeio.c:1190 plpy_typeio.c:1194 +#: plpy_typeio.c:1229 plpy_typeio.c:1244 plpy_typeio.c:1260 #, c-format -msgid "array size exceeds the maximum allowed" -msgstr "配列のサイズが制限値を超えています" +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "多次元配列の配列式の次数があっていなければなりません" -#: plpy_typeio.c:1220 +#: plpy_typeio.c:1234 #, c-format -msgid "" -"return value of function with array return type is not a Python sequence" -msgstr "配列型を返す関数の戻り値がPythonのシーケンスではありません" - -#: plpy_typeio.c:1266 -#, c-format -msgid "wrong length of inner sequence: has length %d, but %d was expected" -msgstr "内部シーケンスで長さが異常です: 長さは%dですが、期待する値は%dでした" - -#: plpy_typeio.c:1268 -#, c-format -msgid "" -"To construct a multidimensional array, the inner sequences must all have the " -"same length." -msgstr "" -"多次元配列を生成する場合、内部シーケンスはすべて同じ長さでなければなりませ" -"ん。" +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "配列の次元数が制限値(%d)を超えています" -#: plpy_typeio.c:1347 +#: plpy_typeio.c:1336 #, c-format msgid "malformed record literal: \"%s\"" msgstr "不正な形式のレコードリテラル: \"%s\"" -#: plpy_typeio.c:1348 +#: plpy_typeio.c:1337 #, c-format msgid "Missing left parenthesis." msgstr "左括弧がありません。" -#: plpy_typeio.c:1349 plpy_typeio.c:1550 +#: plpy_typeio.c:1338 plpy_typeio.c:1542 #, c-format -msgid "" -"To return a composite type in an array, return the composite type as a " -"Python tuple, e.g., \"[('foo',)]\"." -msgstr "" -"複合型を配列に入れて返したい場合、 \"[('foo',)]\" のように複合型を Pythonのタ" -"プルとして返すようにしてください。" +msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." +msgstr "複合型を配列に入れて返したい場合、 \"[('foo',)]\" のように複合型を Pythonのタプルとして返すようにしてください。" -#: plpy_typeio.c:1396 +#: plpy_typeio.c:1385 #, c-format msgid "key \"%s\" not found in mapping" msgstr "マッピング上にキー\"%s\"が見つかりません" -#: plpy_typeio.c:1397 +#: plpy_typeio.c:1386 #, c-format -msgid "" -"To return null in a column, add the value None to the mapping with the key " -"named after the column." -msgstr "" -"カラムにnullを入れて返す場合、カラム名をキーとして値がNoneのエントリをマッピ" -"ングに追加してください。" +msgid "To return null in a column, add the value None to the mapping with the key named after the column." +msgstr "カラムにnullを入れて返す場合、カラム名をキーとして値がNoneのエントリをマッピングに追加してください。" -#: plpy_typeio.c:1450 +#: plpy_typeio.c:1439 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "返されたシーケンスの長さが行のカラム数とマッチしませんでした" -#: plpy_typeio.c:1548 +#: plpy_typeio.c:1540 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "属性\"%s\"がPythonオブジェクト中に存在しません" -#: plpy_typeio.c:1551 +#: plpy_typeio.c:1543 #, c-format -msgid "" -"To return null in a column, let the returned object have an attribute named " -"after column with value None." -msgstr "" -"カラムにnullを入れて返す場合、カラム名をキーとして値がNoneである属性を持つオ" -"ブジェクトを返すようにしてください。" +msgid "To return null in a column, let the returned object have an attribute named after column with value None." +msgstr "カラムにnullを入れて返す場合、カラム名をキーとして値がNoneである属性を持つオブジェクトを返すようにしてください。" -#: plpy_util.c:35 +#: plpy_util.c:29 #, c-format msgid "could not convert Python Unicode object to bytes" msgstr "PythonのUnicodeオブジェクトをバイト列に変換できませんでした" -#: plpy_util.c:41 +#: plpy_util.c:35 #, c-format msgid "could not extract bytes from encoded string" msgstr "エンコードされた文字列からバイト列を抽出できませんでした" + +#~ msgid "To construct a multidimensional array, the inner sequences must all have the same length." +#~ msgstr "多次元配列を生成する場合、内部シーケンスはすべて同じ長さでなければなりません。" + +#~ msgid "array size exceeds the maximum allowed" +#~ msgstr "配列のサイズが制限値を超えています" + +#~ msgid "wrong length of inner sequence: has length %d, but %d was expected" +#~ msgstr "内部シーケンスで長さが異常です: 長さは%dですが、期待する値は%dでした" diff --git a/src/pl/plpython/po/ru.po b/src/pl/plpython/po/ru.po index 066976d50ab..f9e20315717 100644 --- a/src/pl/plpython/po/ru.po +++ b/src/pl/plpython/po/ru.po @@ -1,13 +1,13 @@ # Russian message translation file for plpython # Copyright (C) 2012-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2012-2017, 2018, 2019. +# SPDX-FileCopyrightText: 2012-2017, 2018, 2019, 2026 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: plpython (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-30 15:59+0300\n" -"PO-Revision-Date: 2019-08-29 15:42+0300\n" +"POT-Creation-Date: 2026-08-08 08:46+0300\n" +"PO-Revision-Date: 2026-08-05 07:51+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -27,12 +27,12 @@ msgstr "plpy.cursor ожидает запрос или план" msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor принимает в качестве второго аргумента последовательность" -#: plpy_cursorobject.c:193 plpy_spi.c:200 +#: plpy_cursorobject.c:193 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "нельзя выполнить план" -#: plpy_cursorobject.c:196 plpy_spi.c:203 +#: plpy_cursorobject.c:196 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -40,28 +40,34 @@ msgstr[0] "Ожидалась последовательность из %d ар msgstr[1] "Ожидалась последовательность из %d аргументов, получено %d: %s" msgstr[2] "Ожидалась последовательность из %d аргументов, получено %d: %s" -#: plpy_cursorobject.c:349 +#: plpy_cursorobject.c:264 plpy_spi.c:92 plpy_spi.c:259 plpy_typeio.c:1214 +#: plpy_typeio.c:1465 +#, c-format +msgid "could not get element %d from sequence" +msgstr "не удалось получить элемент %d из последовательности" + +#: plpy_cursorobject.c:354 #, c-format msgid "iterating a closed cursor" msgstr "перемещение закрытого курсора" -#: plpy_cursorobject.c:357 plpy_cursorobject.c:423 +#: plpy_cursorobject.c:362 plpy_cursorobject.c:428 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "перемещение курсора в прерванной подтранзакции" -#: plpy_cursorobject.c:415 +#: plpy_cursorobject.c:420 #, c-format msgid "fetch from a closed cursor" msgstr "выборка из закрытого курсора" -#: plpy_cursorobject.c:458 plpy_spi.c:389 +#: plpy_cursorobject.c:463 plpy_spi.c:399 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "" "результат запроса содержит слишком много строк для передачи в списке Python" -#: plpy_cursorobject.c:510 +#: plpy_cursorobject.c:515 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "закрытие курсора в прерванной подтранзакции" @@ -319,27 +325,27 @@ msgstr "команда не выдала результирующий набор msgid "second argument of plpy.prepare must be a sequence" msgstr "вторым аргументом plpy.prepare должна быть последовательность" -#: plpy_spi.c:94 +#: plpy_spi.c:99 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: имя типа с порядковым номером %d не является строкой" -#: plpy_spi.c:166 +#: plpy_spi.c:171 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute ожидает запрос или план" -#: plpy_spi.c:184 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute принимает в качестве второго аргумента последовательность" -#: plpy_spi.c:285 +#: plpy_spi.c:295 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "ошибка в SPI_execute_plan: %s" -#: plpy_spi.c:327 +#: plpy_spi.c:337 #, c-format msgid "SPI_execute failed: %s" msgstr "ошибка в SPI_execute: %s" @@ -413,7 +419,7 @@ msgstr "" "не удалось определить длину последовательности в возвращаемом функцией " "значении" -#: plpy_typeio.c:1225 plpy_typeio.c:1240 plpy_typeio.c:1256 +#: plpy_typeio.c:1229 plpy_typeio.c:1244 plpy_typeio.c:1260 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -421,22 +427,22 @@ msgstr "" "для многомерных массивов должны задаваться выражения с соответствующими " "размерностями" -#: plpy_typeio.c:1230 +#: plpy_typeio.c:1234 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "число размерностей массива превышает предел (%d)" -#: plpy_typeio.c:1332 +#: plpy_typeio.c:1336 #, c-format msgid "malformed record literal: \"%s\"" msgstr "ошибка в литерале записи: \"%s\"" -#: plpy_typeio.c:1333 +#: plpy_typeio.c:1337 #, c-format msgid "Missing left parenthesis." msgstr "Отсутствует левая скобка." -#: plpy_typeio.c:1334 plpy_typeio.c:1535 +#: plpy_typeio.c:1338 plpy_typeio.c:1542 #, c-format msgid "" "To return a composite type in an array, return the composite type as a " @@ -445,12 +451,12 @@ msgstr "" "Чтобы возвратить составной тип в массиве, нужно возвратить составное " "значение в виде кортежа Python, например: \"[('foo',)]\"." -#: plpy_typeio.c:1381 +#: plpy_typeio.c:1385 #, c-format msgid "key \"%s\" not found in mapping" msgstr "ключ \"%s\" не найден в сопоставлении" -#: plpy_typeio.c:1382 +#: plpy_typeio.c:1386 #, c-format msgid "" "To return null in a column, add the value None to the mapping with the key " @@ -459,17 +465,17 @@ msgstr "" "Чтобы присвоить столбцу NULL, добавьте в сопоставление значение None с " "ключом-именем столбца." -#: plpy_typeio.c:1435 +#: plpy_typeio.c:1439 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "длина возвращённой последовательности не равна числу столбцов в строке" -#: plpy_typeio.c:1533 +#: plpy_typeio.c:1540 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "в объекте Python не существует атрибут \"%s\"" -#: plpy_typeio.c:1536 +#: plpy_typeio.c:1543 #, c-format msgid "" "To return null in a column, let the returned object have an attribute named " diff --git a/src/pl/plpython/sql/plpython_composite.sql b/src/pl/plpython/sql/plpython_composite.sql index 1bb9b83b719..b401b3f2f6b 100644 --- a/src/pl/plpython/sql/plpython_composite.sql +++ b/src/pl/plpython/sql/plpython_composite.sql @@ -233,3 +233,15 @@ CREATE FUNCTION composite_type_as_list_broken() RETURNS type_record[] AS $$ return [['first', 1]]; $$ LANGUAGE plpython3u; SELECT * FROM composite_type_as_list_broken(); + +-- A custom sequence whose length matches the tuple but whose __getitem__ +-- raises should be reported as an error, not crash the backend. +CREATE FUNCTION composite_type_as_broken_sequence() RETURNS type_record AS $$ +class C: + def __len__(self): + return 2 + def __getitem__(self, i): + raise ValueError('getitem failed') +return C() +$$ LANGUAGE plpython3u; +SELECT * FROM composite_type_as_broken_sequence(); diff --git a/src/pl/plpython/sql/plpython_spi.sql b/src/pl/plpython/sql/plpython_spi.sql index 00dcc8bb669..276d130431e 100644 --- a/src/pl/plpython/sql/plpython_spi.sql +++ b/src/pl/plpython/sql/plpython_spi.sql @@ -307,3 +307,42 @@ SELECT cursor_fetch_next_empty(); SELECT cursor_plan(); SELECT cursor_plan_wrong_args(); SELECT plan_composite_args(); + +-- A custom argument sequence whose length matches the plan but whose +-- __getitem__ raises should be reported as an error, not crash the backend. +CREATE FUNCTION plan_broken_arg_sequence() RETURNS void AS $$ +plan = plpy.prepare("select $1", ["int4"]) +class C: + def __len__(self): + return 1 + def __getitem__(self, i): + raise ValueError('getitem failed') +plpy.execute(plan, C()) +$$ LANGUAGE plpython3u; + +SELECT plan_broken_arg_sequence(); + +-- Likewise for the type-name list passed to plpy.prepare(). +CREATE FUNCTION prepare_broken_type_sequence() RETURNS void AS $$ +class C: + def __len__(self): + return 1 + def __getitem__(self, i): + raise ValueError('getitem failed') +plpy.prepare("select $1", C()) +$$ LANGUAGE plpython3u; + +SELECT prepare_broken_type_sequence(); + +-- Likewise for the argument sequence passed to plpy.cursor(). +CREATE FUNCTION cursor_broken_arg_sequence() RETURNS void AS $$ +plan = plpy.prepare("select $1", ["int4"]) +class C: + def __len__(self): + return 1 + def __getitem__(self, i): + raise ValueError('getitem failed') +plpy.cursor(plan, C()) +$$ LANGUAGE plpython3u; + +SELECT cursor_broken_arg_sequence(); diff --git a/src/pl/plpython/sql/plpython_types.sql b/src/pl/plpython/sql/plpython_types.sql index 0985a9cca2f..31549c7f4f1 100644 --- a/src/pl/plpython/sql/plpython_types.sql +++ b/src/pl/plpython/sql/plpython_types.sql @@ -417,6 +417,19 @@ $$ LANGUAGE plpython3u; SELECT * FROM test_type_conversion_array_error(); +-- A custom sequence whose __getitem__ raises should be reported as an error, +-- not crash the backend. +CREATE FUNCTION test_type_conversion_array_getitem_fail() RETURNS int[] AS $$ +class C: + def __len__(self): + return 2 + def __getitem__(self, i): + raise ValueError('getitem failed') +return C() +$$ LANGUAGE plpython3u; + +SELECT * FROM test_type_conversion_array_getitem_fail(); + -- -- Domains over arrays diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index 73d660e88a6..1209753a79f 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -1428,6 +1428,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, Tcl_DString proc_internal_def; Tcl_DString proc_internal_name; Tcl_DString proc_internal_body; + Tcl_DString proc_internal_args; /* We'll need the pg_proc tuple in any case... */ procTup = SearchSysCache1(PROCOID, ObjectIdGetDatum(fn_oid)); @@ -1477,6 +1478,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, Tcl_DStringInit(&proc_internal_def); Tcl_DStringInit(&proc_internal_name); Tcl_DStringInit(&proc_internal_body); + Tcl_DStringInit(&proc_internal_args); PG_TRY(); { bool is_trigger = OidIsValid(tgreloid); @@ -1486,10 +1488,9 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, bool need_underscore; HeapTuple typeTup; Form_pg_type typeStruct; - char proc_internal_args[33 * FUNC_MAX_ARGS]; Datum prosrcdatum; char *proc_source; - char buf[48]; + char buf[64]; pltcl_interp_desc *interp_desc; Tcl_Interp *interp; int i; @@ -1586,7 +1587,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, * struct prodesc and subsidiary data must all live in proc_cxt. ************************************************************/ oldcontext = MemoryContextSwitchTo(proc_cxt); - prodesc = (pltcl_proc_desc *) palloc0(sizeof(pltcl_proc_desc)); + prodesc = palloc0_object(pltcl_proc_desc); prodesc->user_proname = pstrdup(user_proname); MemoryContextSetIdentifier(proc_cxt, prodesc->user_proname); prodesc->internal_proname = pstrdup(internal_proname); @@ -1595,8 +1596,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, prodesc->fn_xmin = HeapTupleHeaderGetRawXmin(procTup->t_data); prodesc->fn_tid = procTup->t_self; prodesc->nargs = procStruct->pronargs; - prodesc->arg_out_func = (FmgrInfo *) palloc0(prodesc->nargs * sizeof(FmgrInfo)); - prodesc->arg_is_rowtype = (bool *) palloc0(prodesc->nargs * sizeof(bool)); + prodesc->arg_out_func = palloc0_array(FmgrInfo, prodesc->nargs); + prodesc->arg_is_rowtype = palloc0_array(bool, prodesc->nargs); MemoryContextSwitchTo(oldcontext); /* Remember if function is STABLE/IMMUTABLE */ @@ -1658,7 +1659,6 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, ************************************************************/ if (!is_trigger && !is_event_trigger) { - proc_internal_args[0] = '\0'; for (i = 0; i < prodesc->nargs; i++) { Oid argtype = procStruct->proargtypes.values[i]; @@ -1691,8 +1691,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, } if (i > 0) - strcat(proc_internal_args, " "); - strcat(proc_internal_args, buf); + Tcl_DStringAppend(&proc_internal_args, " ", -1); + Tcl_DStringAppend(&proc_internal_args, buf, -1); ReleaseSysCache(typeTup); } @@ -1700,13 +1700,14 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, else if (is_trigger) { /* trigger procedure has fixed args */ - strcpy(proc_internal_args, - "TG_name TG_relid TG_table_name TG_table_schema TG_relatts TG_when TG_level TG_op __PLTcl_Tup_NEW __PLTcl_Tup_OLD args"); + Tcl_DStringAppend(&proc_internal_args, + "TG_name TG_relid TG_table_name TG_table_schema TG_relatts TG_when TG_level TG_op __PLTcl_Tup_NEW __PLTcl_Tup_OLD args", + -1); } else if (is_event_trigger) { /* event trigger procedure has fixed args */ - strcpy(proc_internal_args, "TG_event TG_tag"); + Tcl_DStringAppend(&proc_internal_args, "TG_event TG_tag", -1); } /************************************************************ @@ -1719,7 +1720,8 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, ************************************************************/ Tcl_DStringAppendElement(&proc_internal_def, "proc"); Tcl_DStringAppendElement(&proc_internal_def, internal_proname); - Tcl_DStringAppendElement(&proc_internal_def, proc_internal_args); + Tcl_DStringAppendElement(&proc_internal_def, + Tcl_DStringValue(&proc_internal_args)); /************************************************************ * prefix procedure body with @@ -1800,6 +1802,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, Tcl_DStringFree(&proc_internal_def); Tcl_DStringFree(&proc_internal_name); Tcl_DStringFree(&proc_internal_body); + Tcl_DStringFree(&proc_internal_args); PG_RE_THROW(); } PG_END_TRY(); @@ -1829,6 +1832,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid, Tcl_DStringFree(&proc_internal_def); Tcl_DStringFree(&proc_internal_name); Tcl_DStringFree(&proc_internal_body); + Tcl_DStringFree(&proc_internal_args); ReleaseSysCache(procTup); @@ -2112,7 +2116,7 @@ pltcl_quote(ClientData cdata, Tcl_Interp *interp, * grow to and initialize pointers ************************************************************/ cp1 = Tcl_GetStringFromObj(objv[1], &length); - tmp = palloc(length * 2 + 1); + tmp = palloc(add_size(mul_size(length, 2), 1)); cp2 = tmp; /************************************************************ @@ -2668,12 +2672,12 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp, "PL/Tcl spi_prepare query", ALLOCSET_SMALL_SIZES); MemoryContextSwitchTo(plan_cxt); - qdesc = (pltcl_query_desc *) palloc0(sizeof(pltcl_query_desc)); + qdesc = palloc0_object(pltcl_query_desc); snprintf(qdesc->qname, sizeof(qdesc->qname), "%p", qdesc); qdesc->nargs = nargs; - qdesc->argtypes = (Oid *) palloc(nargs * sizeof(Oid)); - qdesc->arginfuncs = (FmgrInfo *) palloc(nargs * sizeof(FmgrInfo)); - qdesc->argtypioparams = (Oid *) palloc(nargs * sizeof(Oid)); + qdesc->argtypes = palloc_array(Oid, nargs); + qdesc->arginfuncs = palloc_array(FmgrInfo, nargs); + qdesc->argtypioparams = palloc_array(Oid, nargs); MemoryContextSwitchTo(oldcontext); /************************************************************ @@ -2916,7 +2920,7 @@ pltcl_SPI_execute_plan(ClientData cdata, Tcl_Interp *interp, * Setup the value array for SPI_execute_plan() using * the type specific input functions ************************************************************/ - argvalues = (Datum *) palloc(callObjc * sizeof(Datum)); + argvalues = palloc_array(Datum, callObjc); for (j = 0; j < callObjc; j++) { @@ -3290,7 +3294,7 @@ pltcl_build_tuple_result(Tcl_Interp *interp, Tcl_Obj **kvObjv, int kvObjc, attinmeta = NULL; } - values = (char **) palloc0(tupdesc->natts * sizeof(char *)); + values = palloc0_array(char *, tupdesc->natts); if (kvObjc % 2 != 0) ereport(ERROR, diff --git a/src/port/pgmkdirp.c b/src/port/pgmkdirp.c index d943559760d..3e6b06fce79 100644 --- a/src/port/pgmkdirp.c +++ b/src/port/pgmkdirp.c @@ -56,7 +56,6 @@ int pg_mkdir_p(char *path, int omode) { - struct stat sb; mode_t numask, oumask; int last, @@ -73,7 +72,7 @@ pg_mkdir_p(char *path, int omode) if (p[0] == '/' && p[1] == '/') { /* network drive */ - p = strstr(p + 2, "/"); + p = strchr(p + 2, '/'); if (p == NULL) { errno = EINVAL; @@ -119,24 +118,46 @@ pg_mkdir_p(char *path, int omode) if (last) (void) umask(oumask); - /* check for pre-existing directory */ - if (stat(path, &sb) == 0) + if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { - if (!S_ISDIR(sb.st_mode)) + /* + * If we got EEXIST because there's already a directory there, + * don't complain. + */ +#ifndef WIN32 + int save_errno = errno; + struct stat sb; + + if (save_errno != EEXIST || + stat(path, &sb) != 0 || + !S_ISDIR(sb.st_mode)) { - if (last) - errno = EEXIST; - else - errno = ENOTDIR; + /* Don't let stat replace mkdir's errno */ + errno = save_errno; retval = -1; break; } +#else /* WIN32 */ + /* + * On Windows, stat() opens a handle and can transiently fail on a + * directory another process is concurrently creating. Probe with + * a path-based attribute query instead: it requests only + * FILE_READ_ATTRIBUTES and is exempt from share-mode denial, so + * it reliably sees a concurrently-created directory. We assume + * GetFileAttributes() won't change errno. + */ + DWORD attr = GetFileAttributes(path); + + if (errno != EEXIST || + attr == INVALID_FILE_ATTRIBUTES || + !(attr & FILE_ATTRIBUTE_DIRECTORY)) + { + retval = -1; + break; + } +#endif /* WIN32 */ } - else if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) - { - retval = -1; - break; - } + if (!last) *p = '/'; } diff --git a/src/test/isolation/expected/ddl-dependency-locking.out b/src/test/isolation/expected/ddl-dependency-locking.out new file mode 100644 index 00000000000..636de281022 --- /dev/null +++ b/src/test/isolation/expected/ddl-dependency-locking.out @@ -0,0 +1,137 @@ +Parsed test spec with 2 sessions + +starting permutation: s1_begin s1_create_function_in_schema s2_drop_schema s1_commit +step s1_begin: BEGIN; +step s1_create_function_in_schema: CREATE FUNCTION testschema.foo() RETURNS int AS 'select 1' LANGUAGE sql; +step s2_drop_schema: DROP SCHEMA testschema; +step s1_commit: COMMIT; +step s2_drop_schema: <... completed> +ERROR: cannot drop schema testschema because other objects depend on it + +starting permutation: s2_begin s2_drop_schema s1_create_function_in_schema s2_commit +step s2_begin: BEGIN; +step s2_drop_schema: DROP SCHEMA testschema; +step s1_create_function_in_schema: CREATE FUNCTION testschema.foo() RETURNS int AS 'select 1' LANGUAGE sql; +step s2_commit: COMMIT; +step s1_create_function_in_schema: <... completed> +ERROR: referenced schema was concurrently dropped + +starting permutation: s1_begin s1_alter_function_schema s2_drop_alterschema s1_commit +step s1_begin: BEGIN; +step s1_alter_function_schema: ALTER FUNCTION public.falter() SET SCHEMA alterschema; +step s2_drop_alterschema: DROP SCHEMA alterschema; +step s1_commit: COMMIT; +step s2_drop_alterschema: <... completed> +ERROR: cannot drop schema alterschema because other objects depend on it + +starting permutation: s2_begin s2_drop_alterschema s1_alter_function_schema s2_commit +step s2_begin: BEGIN; +step s2_drop_alterschema: DROP SCHEMA alterschema; +step s1_alter_function_schema: ALTER FUNCTION public.falter() SET SCHEMA alterschema; +step s2_commit: COMMIT; +step s1_alter_function_schema: <... completed> +ERROR: referenced schema was concurrently dropped + +starting permutation: s1_begin s1_create_function_with_argtype s2_drop_foo_type s1_commit +step s1_begin: BEGIN; +step s1_create_function_with_argtype: CREATE FUNCTION fooargtype(num foo) RETURNS int AS 'select 1' LANGUAGE sql; +step s2_drop_foo_type: DROP TYPE public.foo; +step s1_commit: COMMIT; +step s2_drop_foo_type: <... completed> +ERROR: cannot drop type foo because other objects depend on it + +starting permutation: s2_begin s2_drop_foo_type s1_create_function_with_argtype s2_commit +step s2_begin: BEGIN; +step s2_drop_foo_type: DROP TYPE public.foo; +step s1_create_function_with_argtype: CREATE FUNCTION fooargtype(num foo) RETURNS int AS 'select 1' LANGUAGE sql; +step s2_commit: COMMIT; +step s1_create_function_with_argtype: <... completed> +ERROR: referenced type was concurrently dropped + +starting permutation: s1_begin s1_create_function_with_rettype s2_drop_foo_rettype s1_commit +step s1_begin: BEGIN; +step s1_create_function_with_rettype: CREATE FUNCTION footrettype() RETURNS id LANGUAGE sql RETURN 1; +step s2_drop_foo_rettype: DROP DOMAIN id; +step s1_commit: COMMIT; +step s2_drop_foo_rettype: <... completed> +ERROR: cannot drop type id because other objects depend on it + +starting permutation: s2_begin s2_drop_foo_rettype s1_create_function_with_rettype s2_commit +step s2_begin: BEGIN; +step s2_drop_foo_rettype: DROP DOMAIN id; +step s1_create_function_with_rettype: CREATE FUNCTION footrettype() RETURNS id LANGUAGE sql RETURN 1; +step s2_commit: COMMIT; +step s1_create_function_with_rettype: <... completed> +ERROR: referenced type was concurrently dropped + +starting permutation: s1_begin s1_create_function_with_function s2_drop_function_f s1_commit +step s1_begin: BEGIN; +step s1_create_function_with_function: CREATE FUNCTION foofunc() RETURNS int LANGUAGE SQL RETURN f() + 1; +step s2_drop_function_f: DROP FUNCTION f(); +step s1_commit: COMMIT; +step s2_drop_function_f: <... completed> +ERROR: cannot drop function f() because other objects depend on it + +starting permutation: s2_begin s2_drop_function_f s1_create_function_with_function s2_commit +step s2_begin: BEGIN; +step s2_drop_function_f: DROP FUNCTION f(); +step s1_create_function_with_function: CREATE FUNCTION foofunc() RETURNS int LANGUAGE SQL RETURN f() + 1; +step s2_commit: COMMIT; +step s1_create_function_with_function: <... completed> +ERROR: referenced function was concurrently dropped + +starting permutation: s1_begin s1_create_domain_with_domain s2_drop_domain_id s1_commit +step s1_begin: BEGIN; +step s1_create_domain_with_domain: CREATE DOMAIN idid as id; +step s2_drop_domain_id: DROP DOMAIN id; +step s1_commit: COMMIT; +step s2_drop_domain_id: <... completed> +ERROR: cannot drop type id because other objects depend on it + +starting permutation: s2_begin s2_drop_domain_id s1_create_domain_with_domain s2_commit +step s2_begin: BEGIN; +step s2_drop_domain_id: DROP DOMAIN id; +step s1_create_domain_with_domain: CREATE DOMAIN idid as id; +step s2_commit: COMMIT; +step s1_create_domain_with_domain: <... completed> +ERROR: referenced type was concurrently dropped + +starting permutation: s1_begin s1_create_table_with_type s2_drop_footab_type s1_commit +step s1_begin: BEGIN; +step s1_create_table_with_type: CREATE TABLE tabtype(a footab); +step s2_drop_footab_type: DROP TYPE public.footab; +step s1_commit: COMMIT; +step s2_drop_footab_type: <... completed> +ERROR: cannot drop type footab because other objects depend on it + +starting permutation: s2_begin s2_drop_footab_type s1_create_table_with_type s2_commit +step s2_begin: BEGIN; +step s2_drop_footab_type: DROP TYPE public.footab; +step s1_create_table_with_type: CREATE TABLE tabtype(a footab); +step s2_commit: COMMIT; +step s1_create_table_with_type: <... completed> +ERROR: referenced type was concurrently dropped + +starting permutation: s1_begin s1_create_server_with_fdw_wrapper s2_drop_fdw_wrapper s1_commit +step s1_begin: BEGIN; +step s1_create_server_with_fdw_wrapper: CREATE SERVER srv_fdw_wrapper FOREIGN DATA WRAPPER fdw_wrapper; +step s2_drop_fdw_wrapper: DROP FOREIGN DATA WRAPPER fdw_wrapper RESTRICT; +step s1_commit: COMMIT; +step s2_drop_fdw_wrapper: <... completed> +ERROR: cannot drop foreign-data wrapper fdw_wrapper because other objects depend on it + +starting permutation: s2_begin s2_drop_fdw_wrapper s1_create_server_with_fdw_wrapper s2_commit +step s2_begin: BEGIN; +step s2_drop_fdw_wrapper: DROP FOREIGN DATA WRAPPER fdw_wrapper RESTRICT; +step s1_create_server_with_fdw_wrapper: CREATE SERVER srv_fdw_wrapper FOREIGN DATA WRAPPER fdw_wrapper; +step s2_commit: COMMIT; +step s1_create_server_with_fdw_wrapper: <... completed> +ERROR: referenced foreign-data wrapper was concurrently dropped + +starting permutation: s1_begin s1_alter_function_owner s2_drop_role s1_commit +step s1_begin: BEGIN; +step s1_alter_function_owner: ALTER FUNCTION public.falter() OWNER TO regress_dependency; +step s2_drop_role: DROP ROLE regress_dependency; +step s1_commit: COMMIT; +step s2_drop_role: <... completed> +ERROR: role "regress_dependency" cannot be dropped because some objects depend on it diff --git a/src/test/isolation/expected/drop-owned-grant.out b/src/test/isolation/expected/drop-owned-grant.out new file mode 100644 index 00000000000..ea6cca277b6 --- /dev/null +++ b/src/test/isolation/expected/drop-owned-grant.out @@ -0,0 +1,8 @@ +Parsed test spec with 2 sessions + +starting permutation: s1b s1d s2d s1c +step s1b: BEGIN; +step s1d: DROP OWNED BY regress_dropowned_grantor; +step s2d: DROP OWNED BY regress_dropowned_grantor; +step s1c: COMMIT; +step s2d: <... completed> diff --git a/src/test/isolation/expected/eval-plan-qual-trigger.out b/src/test/isolation/expected/eval-plan-qual-trigger.out index f6714c2e599..eca8606f60f 100644 --- a/src/test/isolation/expected/eval-plan-qual-trigger.out +++ b/src/test/isolation/expected/eval-plan-qual-trigger.out @@ -61,11 +61,11 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; -key |data ------+------------------ -key-a|val-a-s1-ups1-ups2 +key |data |check_old_and_new +-----+------------------+----------------- +key-a|val-a-s1-ups1-ups2|t (1 row) step s2_c: COMMIT; @@ -132,11 +132,11 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; @@ -205,11 +205,11 @@ step s2_del_a: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING * + RETURNING *, data = old.data AS check_old; -key |data ------+------------- -key-a|val-a-s1-ups1 +key |data |check_old +-----+-------------+--------- +key-a|val-a-s1-ups1|t (1 row) step s2_c: COMMIT; @@ -277,11 +277,11 @@ step s2_del_a: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING * + RETURNING *, data = old.data AS check_old; -key |data ------+-------- -key-a|val-a-s1 +key |data |check_old +-----+--------+--------- +key-a|val-a-s1|t (1 row) step s2_c: COMMIT; @@ -343,7 +343,7 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-a = text key-a: t @@ -352,9 +352,9 @@ s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (k s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1-ups1) new: (key-a,val-a-s1-ups1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------------ -key-a|val-a-s1-ups1-ups2 +key |data |check_old_and_new +-----+------------------+----------------- +key-a|val-a-s1-ups1-ups2|t (1 row) step s2_c: COMMIT; @@ -417,16 +417,16 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; @@ -491,7 +491,7 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-a = text key-a: t @@ -500,9 +500,9 @@ s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (k s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1-ups1) new: (key-a,val-a-s1-ups1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------------ -key-a|val-a-s1-ups1-ups2 +key |data |check_old_and_new +-----+------------------+----------------- +key-a|val-a-s1-ups1-ups2|t (1 row) step s2_c: COMMIT; @@ -567,16 +567,16 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; @@ -641,13 +641,13 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-b = text key-a: f step s2_upd_a_data: <... completed> -key|data ----+---- +key|data|check_old_and_new +---+----+----------------- (0 rows) step s2_c: COMMIT; @@ -711,16 +711,16 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; @@ -873,7 +873,7 @@ step s2_upsert_a_data: WHERE noisy_oper('upd', trigtest.key, '=', 'key-a') AND noisy_oper('upk', trigtest.data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-upserts2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-a = text key-a: t @@ -881,9 +881,9 @@ s2: NOTICE: upk: text val-a-s1-ups1 <> text mismatch: t s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1-ups1) new: (key-a,val-a-s1-ups1-upserts2) s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1-ups1) new: (key-a,val-a-s1-ups1-upserts2) step s2_upsert_a_data: <... completed> -key |data ------+---------------------- -key-a|val-a-s1-ups1-upserts2 +key |data |check_old_and_new +-----+----------------------+----------------- +key-a|val-a-s1-ups1-upserts2|t (1 row) step s2_c: COMMIT; @@ -955,7 +955,7 @@ step s2_upsert_a_data: WHERE noisy_oper('upd', trigtest.key, '=', 'key-a') AND noisy_oper('upk', trigtest.data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-upserts2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-a = text key-a: t @@ -963,9 +963,9 @@ s2: NOTICE: upk: text val-a-s1-ups1 <> text mismatch: t s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1-ups1) new: (key-a,val-a-s1-ups1-upserts2) s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1-ups1) new: (key-a,val-a-s1-ups1-upserts2) step s2_upsert_a_data: <... completed> -key |data ------+---------------------- -key-a|val-a-s1-ups1-upserts2 +key |data |check_old_and_new +-----+----------------------+----------------- +key-a|val-a-s1-ups1-upserts2|t (1 row) step s2_c: COMMIT; @@ -1012,7 +1012,7 @@ step s2_upsert_a_data: WHERE noisy_oper('upd', trigtest.key, '=', 'key-a') AND noisy_oper('upk', trigtest.data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-upserts2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-a = text key-a: t @@ -1020,9 +1020,9 @@ s2: NOTICE: upk: text val-a-s1 <> text mismatch: t s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-upserts2) s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-upserts2) step s2_upsert_a_data: <... completed> -key |data ------+----------------- -key-a|val-a-s1-upserts2 +key |data |check_old_and_new +-----+-----------------+----------------- +key-a|val-a-s1-upserts2|t (1 row) step s2_c: COMMIT; @@ -1068,14 +1068,14 @@ step s2_upsert_a_data: WHERE noisy_oper('upd', trigtest.key, '=', 'key-a') AND noisy_oper('upk', trigtest.data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-upserts2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_a_i; when: AFTER; lev: ROWs; op: INSERT; old: new: (key-a,val-a-upss2) step s2_upsert_a_data: <... completed> -key |data ------+----------- -key-a|val-a-upss2 +key |data |check_old_and_new +-----+-----------+----------------- +key-a|val-a-upss2| (1 row) step s2_c: COMMIT; @@ -1137,7 +1137,7 @@ step s2_upsert_a_data: WHERE noisy_oper('upd', trigtest.key, '=', 'key-a') AND noisy_oper('upk', trigtest.data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-upserts2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-a = text key-a: t @@ -1145,9 +1145,9 @@ s2: NOTICE: upk: text val-a-s1-ups1 <> text mismatch: t s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1-ups1) new: (key-a,val-a-s1-ups1-upserts2) s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1-ups1) new: (key-a,val-a-s1-ups1-upserts2) step s2_upsert_a_data: <... completed> -key |data ------+---------------------- -key-a|val-a-s1-ups1-upserts2 +key |data |check_old_and_new +-----+----------------------+----------------- +key-a|val-a-s1-ups1-upserts2|t (1 row) step s2_c: COMMIT; @@ -1209,14 +1209,14 @@ step s2_upsert_a_data: WHERE noisy_oper('upd', trigtest.key, '=', 'key-a') AND noisy_oper('upk', trigtest.data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-upserts2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_a_i; when: AFTER; lev: ROWs; op: INSERT; old: new: (key-a,val-a-upss2) step s2_upsert_a_data: <... completed> -key |data ------+----------- -key-a|val-a-upss2 +key |data |check_old_and_new +-----+-----------+----------------- +key-a|val-a-upss2| (1 row) step s2_c: COMMIT; @@ -1276,7 +1276,7 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-a = text key-a: t @@ -1284,9 +1284,9 @@ s2: NOTICE: upk: text val-a-s1-ups1 <> text mismatch: t s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1-ups1) new: (key-a,val-a-s1-ups1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------------ -key-a|val-a-s1-ups1-ups2 +key |data |check_old_and_new +-----+------------------+----------------- +key-a|val-a-s1-ups1-ups2|t (1 row) step s2_c: COMMIT; @@ -1347,15 +1347,15 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; @@ -1417,7 +1417,7 @@ step s2_del_a: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING * + RETURNING *, data = old.data AS check_old; step s1_c: COMMIT; s2: NOTICE: upd: text key-a = text key-a: t @@ -1425,9 +1425,9 @@ s2: NOTICE: upk: text val-a-s1-ups1 <> text mismatch: t s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_d; when: AFTER; lev: ROWs; op: DELETE; old: (key-a,val-a-s1-ups1) new: step s2_del_a: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups1 +key |data |check_old +-----+-------------+--------- +key-a|val-a-s1-ups1|t (1 row) step s2_c: COMMIT; @@ -1488,15 +1488,15 @@ step s2_del_a: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING * + RETURNING *, data = old.data AS check_old; step s1_r: ROLLBACK; s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_d; when: AFTER; lev: ROWs; op: DELETE; old: (key-a,val-a-s1) new: step s2_del_a: <... completed> -key |data ------+-------- -key-a|val-a-s1 +key |data |check_old +-----+--------+--------- +key-a|val-a-s1|t (1 row) step s2_c: COMMIT; @@ -1557,13 +1557,13 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-b = text key-a: f step s2_upd_a_data: <... completed> -key|data ----+---- +key|data|check_old_and_new +---+----+----------------- (0 rows) step s2_c: COMMIT; @@ -1624,15 +1624,15 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; @@ -1693,13 +1693,13 @@ step s2_del_a: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING * + RETURNING *, data = old.data AS check_old; step s1_c: COMMIT; s2: NOTICE: upd: text key-b = text key-a: f step s2_del_a: <... completed> -key|data ----+---- +key|data|check_old +---+----+--------- (0 rows) step s2_c: COMMIT; @@ -1759,15 +1759,15 @@ step s2_del_a: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING * + RETURNING *, data = old.data AS check_old; step s1_r: ROLLBACK; s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_d; when: AFTER; lev: ROWs; op: DELETE; old: (key-a,val-a-s1) new: step s2_del_a: <... completed> -key |data ------+-------- -key-a|val-a-s1 +key |data |check_old +-----+--------+--------- +key-a|val-a-s1|t (1 row) step s2_c: COMMIT; @@ -1829,14 +1829,14 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: upd: text key-c = text key-a: f step s2_upd_a_data: <... completed> -key|data ----+---- +key|data|check_old_and_new +---+----+----------------- (0 rows) step s2_c: COMMIT; @@ -1899,16 +1899,16 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) s2: NOTICE: upd: text key-c = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; @@ -2038,7 +2038,7 @@ step s2_upd_all_data: WHERE noisy_oper('upd', key, '<>', 'mismatch') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-b <> text mismatch: t @@ -2050,10 +2050,10 @@ s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (k s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-b,val-a-s1-tobs1) new: (key-b,val-a-s1-tobs1-ups2) s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-c,val-c-s1) new: (key-c,val-c-s1-ups2) step s2_upd_all_data: <... completed> -key |data ------+------------------- -key-b|val-a-s1-tobs1-ups2 -key-c|val-c-s1-ups2 +key |data |check_old_and_new +-----+-------------------+----------------- +key-b|val-a-s1-tobs1-ups2|t +key-c|val-c-s1-ups2 |t (2 rows) step s2_c: COMMIT; @@ -2118,13 +2118,13 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; s2: NOTICE: upd: text key-c = text key-a: f step s2_upd_a_data: <... completed> -key|data ----+---- +key|data|check_old_and_new +---+----+----------------- (0 rows) step s2_c: COMMIT; @@ -2188,16 +2188,16 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) s2: NOTICE: upd: text key-c = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; @@ -2260,13 +2260,13 @@ step s2_del_a: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING * + RETURNING *, data = old.data AS check_old; step s1_c: COMMIT; s2: NOTICE: upd: text key-c = text key-a: f step s2_del_a: <... completed> -key|data ----+---- +key|data|check_old +---+----+--------- (0 rows) step s2_c: COMMIT; @@ -2328,16 +2328,16 @@ step s2_del_a: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING * + RETURNING *, data = old.data AS check_old; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_b_d; when: BEFORE; lev: ROWs; op: DELETE; old: (key-a,val-a-s1) new: s2: NOTICE: upd: text key-c = text key-a: f s2: NOTICE: trigger: name rep_a_d; when: AFTER; lev: ROWs; op: DELETE; old: (key-a,val-a-s1) new: step s2_del_a: <... completed> -key |data ------+-------- -key-a|val-a-s1 +key |data |check_old +-----+--------+--------- +key-a|val-a-s1|t (1 row) step s2_c: COMMIT; @@ -2507,7 +2507,7 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; step s2_upd_a_data: <... completed> @@ -2572,16 +2572,16 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; @@ -2646,7 +2646,7 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_c: COMMIT; step s2_upd_a_data: <... completed> @@ -2712,16 +2712,16 @@ step s2_upd_a_data: WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; step s1_r: ROLLBACK; s2: NOTICE: trigger: name rep_b_u; when: BEFORE; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) s2: NOTICE: upd: text key-b = text key-a: f s2: NOTICE: trigger: name rep_a_u; when: AFTER; lev: ROWs; op: UPDATE; old: (key-a,val-a-s1) new: (key-a,val-a-s1-ups2) step s2_upd_a_data: <... completed> -key |data ------+------------- -key-a|val-a-s1-ups2 +key |data |check_old_and_new +-----+-------------+----------------- +key-a|val-a-s1-ups2|t (1 row) step s2_c: COMMIT; diff --git a/src/test/isolation/expected/merge-match-recheck.out b/src/test/isolation/expected/merge-match-recheck.out index 4250b85af2d..10ef2ad2fcd 100644 --- a/src/test/isolation/expected/merge-match-recheck.out +++ b/src/test/isolation/expected/merge-match-recheck.out @@ -197,15 +197,23 @@ step merge_bal: MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; step c2: COMMIT; step merge_bal: <... completed> +key|old_balance|new_balance|status|val +---+-----------+-----------+------+---------------------------------- + 1| 50| 100|s1 |setup updated by update_bal1 when1 +(1 row) + step select1: SELECT * FROM target; key|balance|status|val ---+-------+------+---------------------------------- @@ -220,15 +228,23 @@ step merge_bal_pa: MERGE INTO target_pa t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; step c2: COMMIT; step merge_bal_pa: <... completed> +key|old_balance|new_balance|status|val +---+-----------+-----------+------+------------------------------------- + 1| 50| 100|s1 |setup updated by update_bal1_pa when1 +(1 row) + step select1_pa: SELECT * FROM target_pa; key|balance|status|val ---+-------+------+------------------------------------- @@ -245,22 +261,24 @@ step merge_bal_tg: MERGE INTO target_tg t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN UPDATE SET balance = balance * 8, val = t.val || ' when3' - RETURNING t.* + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val ) SELECT * FROM t; step c2: COMMIT; s1: NOTICE: Update: (1,50,s1,"setup updated by update_bal1_tg") -> (1,100,s1,"setup updated by update_bal1_tg when1") step merge_bal_tg: <... completed> -key|balance|status|val ----+-------+------+------------------------------------- - 1| 100|s1 |setup updated by update_bal1_tg when1 +key|old_balance|new_balance|status|val +---+-----------+-----------+------+------------------------------------- + 1| 50| 100|s1 |setup updated by update_bal1_tg when1 (1 row) step select1_tg: SELECT * FROM target_tg; @@ -278,15 +296,23 @@ step merge_bal: MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; step c2: COMMIT; step merge_bal: <... completed> +key|old_balance|new_balance|status|val +---+-----------+-----------+------+------------------------------------------------- + 1| 70| 140|s1 |setup updated by update1 updated by update6 when1 +(1 row) + step select1: SELECT * FROM target; key|balance|status|val ---+-------+------+------------------------------------------------- @@ -302,15 +328,23 @@ step merge_bal_pa: MERGE INTO target_pa t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; step c2: COMMIT; step merge_bal_pa: <... completed> +key|old_balance|new_balance|status|val +---+-----------+-----------+------+------------------------------------------------------- + 1| 70| 140|s1 |setup updated by update1_pa updated by update6_pa when1 +(1 row) + step select1_pa: SELECT * FROM target_pa; key|balance|status|val ---+-------+------+------------------------------------------------------- @@ -329,22 +363,24 @@ step merge_bal_tg: MERGE INTO target_tg t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN UPDATE SET balance = balance * 8, val = t.val || ' when3' - RETURNING t.* + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val ) SELECT * FROM t; step c2: COMMIT; s1: NOTICE: Update: (1,70,s1,"setup updated by update1_tg updated by update6_tg") -> (1,140,s1,"setup updated by update1_tg updated by update6_tg when1") step merge_bal_tg: <... completed> -key|balance|status|val ----+-------+------+------------------------------------------------------- - 1| 140|s1 |setup updated by update1_tg updated by update6_tg when1 +key|old_balance|new_balance|status|val +---+-----------+-----------+------+------------------------------------------------------- + 1| 70| 140|s1 |setup updated by update1_tg updated by update6_tg when1 (1 row) step select1_tg: SELECT * FROM target_tg; @@ -355,6 +391,105 @@ key|balance|status|val step c1: COMMIT; +starting permutation: update6 update6 merge_bal c2 select1 c1 +step update6: UPDATE target t SET balance = balance - 100, val = t.val || ' updated by update6' WHERE t.key = 1; +step update6: UPDATE target t SET balance = balance - 100, val = t.val || ' updated by update6' WHERE t.key = 1; +step merge_bal: + MERGE INTO target t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE + WHEN MATCHED AND balance < 100 THEN + UPDATE SET balance = balance * 2, val = t.val || ' when1' + WHEN MATCHED AND balance < 200 THEN + UPDATE SET balance = balance * 4, val = t.val || ' when2' + WHEN MATCHED AND balance < 300 THEN + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; + +step c2: COMMIT; +step merge_bal: <... completed> +key|old_balance|new_balance|status|val +---+-----------+-----------+------+------------------------------------------- + 1| -40| |s1 |setup updated by update6 updated by update6 +(1 row) + +step select1: SELECT * FROM target; +key|balance|status|val +---+-------+------+--- +(0 rows) + +step c1: COMMIT; + +starting permutation: update6_pa update6_pa merge_bal_pa c2 select1_pa c1 +step update6_pa: UPDATE target_pa t SET balance = balance - 100, val = t.val || ' updated by update6_pa' WHERE t.key = 1; +step update6_pa: UPDATE target_pa t SET balance = balance - 100, val = t.val || ' updated by update6_pa' WHERE t.key = 1; +step merge_bal_pa: + MERGE INTO target_pa t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE + WHEN MATCHED AND balance < 100 THEN + UPDATE SET balance = balance * 2, val = t.val || ' when1' + WHEN MATCHED AND balance < 200 THEN + UPDATE SET balance = balance * 4, val = t.val || ' when2' + WHEN MATCHED AND balance < 300 THEN + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; + +step c2: COMMIT; +step merge_bal_pa: <... completed> +key|old_balance|new_balance|status|val +---+-----------+-----------+------+------------------------------------------------- + 1| -40| |s1 |setup updated by update6_pa updated by update6_pa +(1 row) + +step select1_pa: SELECT * FROM target_pa; +key|balance|status|val +---+-------+------+--- +(0 rows) + +step c1: COMMIT; + +starting permutation: update6_tg update6_tg merge_bal_tg c2 select1_tg c1 +s2: NOTICE: Update: (1,160,s1,setup) -> (1,60,s1,"setup updated by update6_tg") +step update6_tg: UPDATE target_tg t SET balance = balance - 100, val = t.val || ' updated by update6_tg' WHERE t.key = 1; +s2: NOTICE: Update: (1,60,s1,"setup updated by update6_tg") -> (1,-40,s1,"setup updated by update6_tg updated by update6_tg") +step update6_tg: UPDATE target_tg t SET balance = balance - 100, val = t.val || ' updated by update6_tg' WHERE t.key = 1; +step merge_bal_tg: + WITH t AS ( + MERGE INTO target_tg t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE + WHEN MATCHED AND balance < 100 THEN + UPDATE SET balance = balance * 2, val = t.val || ' when1' + WHEN MATCHED AND balance < 200 THEN + UPDATE SET balance = balance * 4, val = t.val || ' when2' + WHEN MATCHED AND balance < 300 THEN + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val + ) + SELECT * FROM t; + +step c2: COMMIT; +s1: NOTICE: Delete: (1,-40,s1,"setup updated by update6_tg updated by update6_tg") +step merge_bal_tg: <... completed> +key|old_balance|new_balance|status|val +---+-----------+-----------+------+------------------------------------------------- + 1| -40| |s1 |setup updated by update6_tg updated by update6_tg +(1 row) + +step select1_tg: SELECT * FROM target_tg; +key|balance|status|val +---+-------+------+--- +(0 rows) + +step c1: COMMIT; + starting permutation: update7 update6 merge_bal c2 select1 c1 step update7: UPDATE target t SET balance = 350, val = t.val || ' updated by update7' WHERE t.key = 1; step update6: UPDATE target t SET balance = balance - 100, val = t.val || ' updated by update6' WHERE t.key = 1; @@ -362,15 +497,23 @@ step merge_bal: MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; step c2: COMMIT; step merge_bal: <... completed> +key|old_balance|new_balance|status|val +---+-----------+-----------+------+------------------------------------------------- + 1| 250| 2000|s1 |setup updated by update7 updated by update6 when3 +(1 row) + step select1: SELECT * FROM target; key|balance|status|val ---+-------+------+------------------------------------------------- @@ -385,12 +528,15 @@ step merge_bal_pa: MERGE INTO target_pa t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; step c2: COMMIT; step merge_bal_pa: <... completed> @@ -404,12 +550,15 @@ step merge_bal_pa: MERGE INTO target_pa t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; step c2: COMMIT; step merge_bal_pa: <... completed> diff --git a/src/test/isolation/expected/pub-concurrent-drop.out b/src/test/isolation/expected/pub-concurrent-drop.out new file mode 100644 index 00000000000..8360af0ec9c --- /dev/null +++ b/src/test/isolation/expected/pub-concurrent-drop.out @@ -0,0 +1,16 @@ +Parsed test spec with 2 sessions + +starting permutation: lock list_pub_tables drop_and_commit +step lock: BEGIN; LOCK pubdrop.dropme IN ACCESS EXCLUSIVE MODE; +step list_pub_tables: + SELECT relid::regclass AS tablename + FROM pg_get_publication_tables('pub_schema') + ORDER BY tablename; + +step drop_and_commit: DROP TABLE pubdrop.dropme; COMMIT; +step list_pub_tables: <... completed> +tablename +-------------- +pubdrop.keepme +(1 row) + diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index abac824ec9e..91d3bebcd1a 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -117,3 +117,6 @@ test: serializable-parallel-2 test: serializable-parallel-3 test: matview-write-skew test: lock-nowait +test: ddl-dependency-locking +test: pub-concurrent-drop +test: drop-owned-grant diff --git a/src/test/isolation/specs/ddl-dependency-locking.spec b/src/test/isolation/specs/ddl-dependency-locking.spec new file mode 100644 index 00000000000..de5bd88d35e --- /dev/null +++ b/src/test/isolation/specs/ddl-dependency-locking.spec @@ -0,0 +1,104 @@ +# Test that concurrent DROP and CREATE commands do not leave behind +# references to non-existent objects. + +setup +{ + CREATE SCHEMA testschema; + CREATE SCHEMA alterschema; + CREATE TYPE public.foo as enum ('one', 'two'); + CREATE TYPE public.footab as enum ('three', 'four'); + CREATE DOMAIN id AS int; + CREATE FUNCTION f() RETURNS int LANGUAGE SQL RETURN 1; + CREATE FUNCTION public.falter() RETURNS int LANGUAGE SQL RETURN 1; + CREATE FOREIGN DATA WRAPPER fdw_wrapper; + CREATE ROLE regress_dependency; +} + +teardown +{ + DROP FUNCTION IF EXISTS testschema.foo(); + DROP FUNCTION IF EXISTS fooargtype(num foo); + DROP FUNCTION IF EXISTS footrettype(); + DROP FUNCTION IF EXISTS foofunc(); + DROP FUNCTION IF EXISTS public.falter(); + DROP FUNCTION IF EXISTS alterschema.falter(); + DROP DOMAIN IF EXISTS idid; + DROP SERVER IF EXISTS srv_fdw_wrapper; + DROP TABLE IF EXISTS tabtype; + DROP SCHEMA IF EXISTS testschema; + DROP SCHEMA IF EXISTS alterschema; + DROP TYPE IF EXISTS public.foo; + DROP TYPE IF EXISTS public.footab; + DROP DOMAIN IF EXISTS id; + DROP FUNCTION IF EXISTS f(); + DROP FOREIGN DATA WRAPPER IF EXISTS fdw_wrapper; + DROP ROLE regress_dependency; +} + +session "s1" + +step "s1_begin" { BEGIN; } +step "s1_create_function_in_schema" { CREATE FUNCTION testschema.foo() RETURNS int AS 'select 1' LANGUAGE sql; } +step "s1_create_function_with_argtype" { CREATE FUNCTION fooargtype(num foo) RETURNS int AS 'select 1' LANGUAGE sql; } +step "s1_create_function_with_rettype" { CREATE FUNCTION footrettype() RETURNS id LANGUAGE sql RETURN 1; } +step "s1_create_function_with_function" { CREATE FUNCTION foofunc() RETURNS int LANGUAGE SQL RETURN f() + 1; } +step "s1_alter_function_owner" { ALTER FUNCTION public.falter() OWNER TO regress_dependency; } +step "s1_alter_function_schema" { ALTER FUNCTION public.falter() SET SCHEMA alterschema; } +step "s1_create_domain_with_domain" { CREATE DOMAIN idid as id; } +step "s1_create_table_with_type" { CREATE TABLE tabtype(a footab); } +step "s1_create_server_with_fdw_wrapper" { CREATE SERVER srv_fdw_wrapper FOREIGN DATA WRAPPER fdw_wrapper; } +step "s1_commit" { COMMIT; } + +session "s2" + +step "s2_begin" { BEGIN; } +step "s2_drop_schema" { DROP SCHEMA testschema; } +step "s2_drop_alterschema" { DROP SCHEMA alterschema; } +step "s2_drop_foo_type" { DROP TYPE public.foo; } +step "s2_drop_foo_rettype" { DROP DOMAIN id; } +step "s2_drop_footab_type" { DROP TYPE public.footab; } +step "s2_drop_function_f" { DROP FUNCTION f(); } +step "s2_drop_domain_id" { DROP DOMAIN id; } +step "s2_drop_fdw_wrapper" { DROP FOREIGN DATA WRAPPER fdw_wrapper RESTRICT; } +step "s2_drop_role" { DROP ROLE regress_dependency; } +step "s2_commit" { COMMIT; } + +# create function - drop schema +permutation "s1_begin" "s1_create_function_in_schema" "s2_drop_schema" "s1_commit" +permutation "s2_begin" "s2_drop_schema" "s1_create_function_in_schema" "s2_commit" + +# alter function - drop schema +permutation "s1_begin" "s1_alter_function_schema" "s2_drop_alterschema" "s1_commit" +permutation "s2_begin" "s2_drop_alterschema" "s1_alter_function_schema" "s2_commit" + +# create function - drop argtype +permutation "s1_begin" "s1_create_function_with_argtype" "s2_drop_foo_type" "s1_commit" +permutation "s2_begin" "s2_drop_foo_type" "s1_create_function_with_argtype" "s2_commit" + +# create function - drop rettype +permutation "s1_begin" "s1_create_function_with_rettype" "s2_drop_foo_rettype" "s1_commit" +permutation "s2_begin" "s2_drop_foo_rettype" "s1_create_function_with_rettype" "s2_commit" + +# create function - drop function used in its body +permutation "s1_begin" "s1_create_function_with_function" "s2_drop_function_f" "s1_commit" +permutation "s2_begin" "s2_drop_function_f" "s1_create_function_with_function" "s2_commit" + +# create domain over domain - drop the base domain +permutation "s1_begin" "s1_create_domain_with_domain" "s2_drop_domain_id" "s1_commit" +permutation "s2_begin" "s2_drop_domain_id" "s1_create_domain_with_domain" "s2_commit" + +# create table - drop type used in column +permutation "s1_begin" "s1_create_table_with_type" "s2_drop_footab_type" "s1_commit" +permutation "s2_begin" "s2_drop_footab_type" "s1_create_table_with_type" "s2_commit" + +# create server - drop foreign data wrapper +permutation "s1_begin" "s1_create_server_with_fdw_wrapper" "s2_drop_fdw_wrapper" "s1_commit" +permutation "s2_begin" "s2_drop_fdw_wrapper" "s1_create_server_with_fdw_wrapper" "s2_commit" + +# create function - drop owner role +permutation "s1_begin" "s1_alter_function_owner" "s2_drop_role" "s1_commit" + +# XXX: This permutation is disabled because the error message, "role +# was concurrently dropped", contains an OID that is not stable. +# +# permutation "s2_begin" "s2_drop_role" "s1_alter_function_owner" "s2_commit" diff --git a/src/test/isolation/specs/drop-owned-grant.spec b/src/test/isolation/specs/drop-owned-grant.spec new file mode 100644 index 00000000000..636cc213a6b --- /dev/null +++ b/src/test/isolation/specs/drop-owned-grant.spec @@ -0,0 +1,30 @@ +# Test locking of role membership grants during concurrent DROP OWNED BY. + +setup +{ + CREATE ROLE regress_dropowned_role; + CREATE ROLE regress_dropowned_member; + CREATE ROLE regress_dropowned_grantor; + GRANT regress_dropowned_role TO regress_dropowned_grantor + WITH ADMIN OPTION; + SET ROLE regress_dropowned_grantor; + GRANT regress_dropowned_role TO regress_dropowned_member; + RESET ROLE; +} + +teardown +{ + DROP ROLE regress_dropowned_member; + DROP ROLE regress_dropowned_grantor; + DROP ROLE regress_dropowned_role; +} + +session s1 +step s1b { BEGIN; } +step s1d { DROP OWNED BY regress_dropowned_grantor; } +step s1c { COMMIT; } + +session s2 +step s2d { DROP OWNED BY regress_dropowned_grantor; } + +permutation s1b s1d s2d s1c diff --git a/src/test/isolation/specs/eval-plan-qual-trigger.spec b/src/test/isolation/specs/eval-plan-qual-trigger.spec index b512edd2879..e7a1d16ae89 100644 --- a/src/test/isolation/specs/eval-plan-qual-trigger.spec +++ b/src/test/isolation/specs/eval-plan-qual-trigger.spec @@ -120,14 +120,14 @@ step s2_del_a { WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING * + RETURNING *, data = old.data AS check_old; } step s2_upd_a_data { UPDATE trigtest SET data = data || '-ups2' WHERE noisy_oper('upd', key, '=', 'key-a') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; } step s2_upd_b_data { UPDATE trigtest SET data = data || '-ups2' @@ -141,7 +141,7 @@ step s2_upd_all_data { WHERE noisy_oper('upd', key, '<>', 'mismatch') AND noisy_oper('upk', data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-ups2' AS check_old_and_new; } step s2_upsert_a_data { INSERT INTO trigtest VALUES ('key-a', 'val-a-upss2') @@ -150,7 +150,7 @@ step s2_upsert_a_data { WHERE noisy_oper('upd', trigtest.key, '=', 'key-a') AND noisy_oper('upk', trigtest.data, '<>', 'mismatch') - RETURNING *; + RETURNING *, new.data = old.data || '-upserts2' AS check_old_and_new; } session s3 diff --git a/src/test/isolation/specs/merge-match-recheck.spec b/src/test/isolation/specs/merge-match-recheck.spec index 6e7a776d17e..6054fcade26 100644 --- a/src/test/isolation/specs/merge-match-recheck.spec +++ b/src/test/isolation/specs/merge-match-recheck.spec @@ -10,7 +10,7 @@ setup INSERT INTO target VALUES (1, 160, 's1', 'setup'); CREATE TABLE target_pa (key int, balance integer, status text, val text) PARTITION BY RANGE (balance); - CREATE TABLE target_pa1 PARTITION OF target_pa FOR VALUES FROM (0) TO (200); + CREATE TABLE target_pa1 PARTITION OF target_pa FOR VALUES FROM (-100) TO (200); CREATE TABLE target_pa2 PARTITION OF target_pa FOR VALUES FROM (200) TO (1000); INSERT INTO target_pa VALUES (1, 160, 's1', 'setup'); @@ -78,24 +78,30 @@ step "merge_bal" MERGE INTO target t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; } step "merge_bal_pa" { MERGE INTO target_pa t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val; } step "merge_bal_tg" { @@ -103,13 +109,15 @@ step "merge_bal_tg" MERGE INTO target_tg t USING (SELECT 1 as key) s ON s.key = t.key + WHEN MATCHED AND balance < 0 THEN + DELETE WHEN MATCHED AND balance < 100 THEN UPDATE SET balance = balance * 2, val = t.val || ' when1' WHEN MATCHED AND balance < 200 THEN UPDATE SET balance = balance * 4, val = t.val || ' when2' WHEN MATCHED AND balance < 300 THEN UPDATE SET balance = balance * 8, val = t.val || ' when3' - RETURNING t.* + RETURNING t.key, old.balance AS old_balance, new.balance AS new_balance, t.status, t.val ) SELECT * FROM t; } @@ -190,6 +198,11 @@ permutation "update1" "update6" "merge_bal" "c2" "select1" "c1" permutation "update1_pa" "update6_pa" "merge_bal_pa" "c2" "select1_pa" "c1" permutation "update1_tg" "update6_tg" "merge_bal_tg" "c2" "select1_tg" "c1" +# merge_bal sees row concurrently updated twice and rechecks WHEN conditions, different check passes, and row is deleted +permutation "update6" "update6" "merge_bal" "c2" "select1" "c1" +permutation "update6_pa" "update6_pa" "merge_bal_pa" "c2" "select1_pa" "c1" +permutation "update6_tg" "update6_tg" "merge_bal_tg" "c2" "select1_tg" "c1" + # merge_bal sees row concurrently updated twice, first update would cause all checks to fail, second update causes different check to pass, so final balance = 2000 permutation "update7" "update6" "merge_bal" "c2" "select1" "c1" diff --git a/src/test/isolation/specs/pub-concurrent-drop.spec b/src/test/isolation/specs/pub-concurrent-drop.spec new file mode 100644 index 00000000000..4f7d701d60c --- /dev/null +++ b/src/test/isolation/specs/pub-concurrent-drop.spec @@ -0,0 +1,36 @@ +# Tests for concurrently dropping a relation while a publication's tables are +# being listed. + +setup +{ + CREATE SCHEMA pubdrop; + CREATE PUBLICATION pub_schema FOR TABLES IN SCHEMA pubdrop; + CREATE TABLE pubdrop.dropme (id int); + CREATE TABLE pubdrop.keepme (id int); +} + +teardown +{ + DROP SCHEMA pubdrop CASCADE; + DROP PUBLICATION pub_schema; +} + +session s1 +step lock { BEGIN; LOCK pubdrop.dropme IN ACCESS EXCLUSIVE MODE; } +step drop_and_commit { DROP TABLE pubdrop.dropme; COMMIT; } + +session s2 +step list_pub_tables +{ + SELECT relid::regclass AS tablename + FROM pg_get_publication_tables('pub_schema') + ORDER BY tablename; +} + +# Hold an ACCESS EXCLUSIVE lock on the table in one session, so that the query +# listing a publication's tables in another session blocks when it tries to +# open the locked table. Then drop the table in the same lock-holding session +# and commit, releasing the lock, so the query in another session resumes and +# skips the now-dropped table instead of erroring with "could not open relation +# with OID". +permutation lock list_pub_tables drop_and_commit diff --git a/src/test/modules/injection_points/Makefile b/src/test/modules/injection_points/Makefile index 2e49d30f942..f2ab4cde214 100644 --- a/src/test/modules/injection_points/Makefile +++ b/src/test/modules/injection_points/Makefile @@ -16,7 +16,9 @@ REGRESS_OPTS = --dlpath=$(top_builddir)/src/test/regress ISOLATION = basic \ inplace \ + reindex_concurrently_deferred \ syscache-update-pruned \ + wait_cleanup \ heap_lock_update TAP_TESTS = 1 diff --git a/src/test/modules/injection_points/expected/reindex_concurrently_deferred.out b/src/test/modules/injection_points/expected/reindex_concurrently_deferred.out new file mode 100644 index 00000000000..39924fa24fe --- /dev/null +++ b/src/test/modules/injection_points/expected/reindex_concurrently_deferred.out @@ -0,0 +1,41 @@ +Parsed test spec with 2 sessions + +starting permutation: reindex check_catalog begin2 write2 write_dup resolve_dup commit2 wakeup noop1 +injection_points_attach +----------------------- + +(1 row) + +step reindex: REINDEX TABLE CONCURRENTLY reind_deferred; +step check_catalog: + SELECT c.relname, i.indisunique, i.indimmediate, i.indisready, i.indisvalid + FROM pg_class c + JOIN pg_index i ON i.indexrelid = c.oid + WHERE c.relname = 'uq_val_ccnew'; + +relname |indisunique|indimmediate|indisready|indisvalid +------------+-----------+------------+----------+---------- +uq_val_ccnew|t |f |t |f +(1 row) + +step begin2: BEGIN; +step write2: INSERT INTO reind_deferred VALUES (3, 9); +step write_dup: INSERT INTO reind_deferred VALUES (4, 9); +step resolve_dup: UPDATE reind_deferred SET val = 10 WHERE id = 4; +step commit2: COMMIT; +step wakeup: + SELECT injection_points_detach('reindex-conc-index-built'); + SELECT injection_points_wakeup('reindex-conc-index-built'); + +injection_points_detach +----------------------- + +(1 row) + +injection_points_wakeup +----------------------- + +(1 row) + +step reindex: <... completed> +step noop1: diff --git a/src/test/modules/injection_points/expected/wait_cleanup.out b/src/test/modules/injection_points/expected/wait_cleanup.out new file mode 100644 index 00000000000..c5be17428fc --- /dev/null +++ b/src/test/modules/injection_points/expected/wait_cleanup.out @@ -0,0 +1,87 @@ +Parsed test spec with 3 sessions + +starting permutation: wait1 cancel3 noop3 wait2 wakeup3 noop2 detach3 +injection_points_attach +----------------------- + +(1 row) + +step wait1: SELECT injection_points_run('injection-points-wait'); +step cancel3: + SELECT pg_cancel_backend(pid) FROM pg_stat_activity + WHERE wait_event = 'injection-points-wait'; + +step wait1: <... completed> +ERROR: canceling statement due to user request +step cancel3: <... completed> +pg_cancel_backend +----------------- +t +(1 row) + +step noop3: +step wait2: SELECT injection_points_run('injection-points-wait'); +step wakeup3: SELECT injection_points_wakeup('injection-points-wait'); +injection_points_wakeup +----------------------- + +(1 row) + +step wait2: <... completed> +injection_points_run +-------------------- + +(1 row) + +step noop2: +step detach3: SELECT injection_points_detach('injection-points-wait'); +injection_points_detach +----------------------- + +(1 row) + + +starting permutation: wait1 terminate3 noop3 wait2 wakeup3 noop2 detach3 +injection_points_attach +----------------------- + +(1 row) + +step wait1: SELECT injection_points_run('injection-points-wait'); +step terminate3: + SELECT pg_terminate_backend(pid) FROM pg_stat_activity + WHERE wait_event = 'injection-points-wait'; + +step wait1: <... completed> +FATAL: terminating connection due to administrator command +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. + +step terminate3: <... completed> +pg_terminate_backend +-------------------- +t +(1 row) + +step noop3: +step wait2: SELECT injection_points_run('injection-points-wait'); +step wakeup3: SELECT injection_points_wakeup('injection-points-wait'); +injection_points_wakeup +----------------------- + +(1 row) + +step wait2: <... completed> +injection_points_run +-------------------- + +(1 row) + +step noop2: +step detach3: SELECT injection_points_detach('injection-points-wait'); +injection_points_detach +----------------------- + +(1 row) + diff --git a/src/test/modules/injection_points/injection_points.c b/src/test/modules/injection_points/injection_points.c index 3da0cbc10e0..c493cfda9cc 100644 --- a/src/test/modules/injection_points/injection_points.c +++ b/src/test/modules/injection_points/injection_points.c @@ -18,6 +18,7 @@ #include "postgres.h" #include "fmgr.h" +#include "injection_points.h" #include "injection_stats.h" #include "miscadmin.h" #include "nodes/pg_list.h" @@ -39,30 +40,6 @@ PG_MODULE_MAGIC; #define INJ_MAX_WAIT 8 #define INJ_NAME_MAXLEN 64 -/* - * Conditions related to injection points. This tracks in shared memory the - * runtime conditions under which an injection point is allowed to run, - * stored as private_data when an injection point is attached, and passed as - * argument to the callback. - * - * If more types of runtime conditions need to be tracked, this structure - * should be expanded. - */ -typedef enum InjectionPointConditionType -{ - INJ_CONDITION_ALWAYS = 0, /* always run */ - INJ_CONDITION_PID, /* PID restriction */ -} InjectionPointConditionType; - -typedef struct InjectionPointCondition -{ - /* Type of the condition */ - InjectionPointConditionType type; - - /* ID of the process where the injection point is allowed to run */ - int pid; -} InjectionPointCondition; - /* * List of injection points stored in TopMemoryContext attached * locally to this process. @@ -277,6 +254,19 @@ injection_notice(const char *name, const void *private_data, void *arg) elog(NOTICE, "notice triggered for injection point %s", name); } +/* + * Error cleanup callback for injection point waits. + */ +static void +injection_wait_cleanup(int code, Datum arg) +{ + int index = DatumGetInt32(arg); + + SpinLockAcquire(&inj_state->lock); + inj_state->name[index][0] = '\0'; + SpinLockRelease(&inj_state->lock); +} + /* Wait on a condition variable, awaken by injection_points_wakeup() */ void injection_wait(const char *name, const void *private_data, void *arg) @@ -323,24 +313,26 @@ injection_wait(const char *name, const void *private_data, void *arg) /* And sleep.. */ ConditionVariablePrepareToSleep(&inj_state->wait_point); - for (;;) + PG_ENSURE_ERROR_CLEANUP(injection_wait_cleanup, Int32GetDatum(index)); { - uint32 new_wait_counts; + for (;;) + { + uint32 new_wait_counts; - SpinLockAcquire(&inj_state->lock); - new_wait_counts = inj_state->wait_counts[index]; - SpinLockRelease(&inj_state->lock); + SpinLockAcquire(&inj_state->lock); + new_wait_counts = inj_state->wait_counts[index]; + SpinLockRelease(&inj_state->lock); - if (old_wait_counts != new_wait_counts) - break; - ConditionVariableSleep(&inj_state->wait_point, injection_wait_event); + if (old_wait_counts != new_wait_counts) + break; + ConditionVariableSleep(&inj_state->wait_point, injection_wait_event); + } + ConditionVariableCancelSleep(); } - ConditionVariableCancelSleep(); + PG_END_ENSURE_ERROR_CLEANUP(injection_wait_cleanup, Int32GetDatum(index)); /* Remove this injection point from the waiters. */ - SpinLockAcquire(&inj_state->lock); - inj_state->name[index][0] = '\0'; - SpinLockRelease(&inj_state->lock); + injection_wait_cleanup(0, Int32GetDatum(index)); } /* diff --git a/src/test/modules/injection_points/injection_points.h b/src/test/modules/injection_points/injection_points.h new file mode 100644 index 00000000000..caabc4ffb32 --- /dev/null +++ b/src/test/modules/injection_points/injection_points.h @@ -0,0 +1,33 @@ +/*------------------------------------------------------------------------- + * + * injection_points.h + * Definitions for the injection points module + * + * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/test/modules/injection_points/injection_points.h + * + *------------------------------------------------------------------------- + */ + +#ifndef INJECTION_POINTS_H +#define INJECTION_POINTS_H + +typedef enum InjectionPointConditionType +{ + INJ_CONDITION_ALWAYS = 0, /* always run */ + INJ_CONDITION_PID, /* PID restriction */ +} InjectionPointConditionType; + +typedef struct InjectionPointCondition +{ + /* Type of the condition */ + InjectionPointConditionType type; + + /* ID of the process where the injection point is allowed to run */ + int pid; +} InjectionPointCondition; + +#endif /* INJECTION_POINTS_H */ diff --git a/src/test/modules/injection_points/injection_stats.c b/src/test/modules/injection_points/injection_stats.c index ca8df4ad217..c659b2660d4 100644 --- a/src/test/modules/injection_points/injection_stats.c +++ b/src/test/modules/injection_points/injection_stats.c @@ -149,8 +149,8 @@ pgstat_drop_inj(const char *name) if (!inj_stats_loaded || !inj_stats_enabled) return; - if (!pgstat_drop_entry(PGSTAT_KIND_INJECTION, InvalidOid, - PGSTAT_INJ_IDX(name))) + if (!pgstat_drop_entry_ext(PGSTAT_KIND_INJECTION, InvalidOid, + PGSTAT_INJ_IDX(name), false)) pgstat_request_entry_refs_gc(); } diff --git a/src/test/modules/injection_points/meson.build b/src/test/modules/injection_points/meson.build index a73e1fe6c34..2eec3d0935d 100644 --- a/src/test/modules/injection_points/meson.build +++ b/src/test/modules/injection_points/meson.build @@ -47,7 +47,9 @@ tests += { 'specs': [ 'basic', 'inplace', + 'reindex_concurrently_deferred', 'syscache-update-pruned', + 'wait_cleanup', 'heap_lock_update', ], 'runningcheck': false, # see syscache-update-pruned diff --git a/src/test/modules/injection_points/specs/reindex_concurrently_deferred.spec b/src/test/modules/injection_points/specs/reindex_concurrently_deferred.spec new file mode 100644 index 00000000000..4b95e1da2a7 --- /dev/null +++ b/src/test/modules/injection_points/specs/reindex_concurrently_deferred.spec @@ -0,0 +1,50 @@ +# REINDEX CONCURRENTLY with DEFERRED constraints +# +# Verify that concurrent writes that temporarily violate a deferred unique +# constraint do not fail while REINDEX CONCURRENTLY is running. +# +# The injection point "reindex-conc-index-built" fires after the phase 2 +# of REINDEX CONCURRENTLY, when the new index has indisready = true (inserts +# are checked against it) but indisvalid = false. + +setup +{ + CREATE EXTENSION injection_points; + CREATE TABLE reind_deferred (id int, val int, + CONSTRAINT uq_val UNIQUE(val) DEFERRABLE INITIALLY DEFERRED); + INSERT INTO reind_deferred VALUES (1, 1), (2, 2); +} + +teardown +{ + DROP TABLE reind_deferred; + DROP EXTENSION injection_points; +} + +session s1 +setup +{ + SELECT injection_points_set_local(); + SELECT injection_points_attach('reindex-conc-index-built', 'wait'); +} +step reindex { REINDEX TABLE CONCURRENTLY reind_deferred; } +step noop1 { } + +session s2 +step check_catalog { + SELECT c.relname, i.indisunique, i.indimmediate, i.indisready, i.indisvalid + FROM pg_class c + JOIN pg_index i ON i.indexrelid = c.oid + WHERE c.relname = 'uq_val_ccnew'; +} +step begin2 { BEGIN; } +step write2 { INSERT INTO reind_deferred VALUES (3, 9); } +step write_dup { INSERT INTO reind_deferred VALUES (4, 9); } +step resolve_dup { UPDATE reind_deferred SET val = 10 WHERE id = 4; } +step commit2 { COMMIT; } +step wakeup { + SELECT injection_points_detach('reindex-conc-index-built'); + SELECT injection_points_wakeup('reindex-conc-index-built'); +} + +permutation reindex check_catalog begin2 write2 write_dup resolve_dup commit2 wakeup noop1 diff --git a/src/test/modules/injection_points/specs/wait_cleanup.spec b/src/test/modules/injection_points/specs/wait_cleanup.spec new file mode 100644 index 00000000000..ed7d21c4de4 --- /dev/null +++ b/src/test/modules/injection_points/specs/wait_cleanup.spec @@ -0,0 +1,50 @@ +# Check that a canceled or terminated waiter does not leave a stale slot +# behind in the waiter array. A leaked slot would make later wakeups of +# the same injection point bump the leaked slot's counter instead of the +# real waiter's, leaving the real waiter stuck. + +setup +{ + CREATE EXTENSION injection_points; +} +teardown +{ + DROP EXTENSION injection_points; +} + +# The first waiter, that gets canceled or terminated. This does not +# use injection_points_set_local() on purpose: the injection point +# must survive s1's termination so that s3 can still detach it. +session s1 +setup { + SELECT injection_points_attach('injection-points-wait', 'wait'); +} +step wait1 { SELECT injection_points_run('injection-points-wait'); } + +# The second waiter, that receives a wakeup. +session s2 +step wait2 { SELECT injection_points_run('injection-points-wait'); } +step noop2 { } + +# Control session. The blocker annotations on cancel3/terminate3, +# together with noop3, make the tester wait until wait1 has fully +# completed before starting wait2. Otherwise, wait2 could register a +# new waiter slot while s1 still owns the previous one. +session s3 +step cancel3 { + SELECT pg_cancel_backend(pid) FROM pg_stat_activity + WHERE wait_event = 'injection-points-wait'; +} +step terminate3 { + SELECT pg_terminate_backend(pid) FROM pg_stat_activity + WHERE wait_event = 'injection-points-wait'; +} +step wakeup3 { SELECT injection_points_wakeup('injection-points-wait'); } +step detach3 { SELECT injection_points_detach('injection-points-wait'); } +step noop3 { } + +permutation wait1 cancel3(wait1) noop3 wait2 wakeup3 noop2 detach3 + +# The terminate permutation has to stay last: s1's connection is dead +# afterwards, and the tester never reconnects a session. +permutation wait1 terminate3(wait1) noop3 wait2 wakeup3 noop2 detach3 diff --git a/src/test/modules/oauth_validator/t/001_server.pl b/src/test/modules/oauth_validator/t/001_server.pl index c0dafb8be76..295342abc69 100644 --- a/src/test/modules/oauth_validator/t/001_server.pl +++ b/src/test/modules/oauth_validator/t/001_server.pl @@ -436,15 +436,28 @@ sub connstr qr@Visit https://example\.com/ and enter the code: postgresuser@, "call count: stderr matches"); -my $count_pattern = qr/\[libpq\] total number of polls: (\d+)/; -if (like($stderr, $count_pattern, "call count: count is printed")) +SKIP: { - # For reference, a typical flow with two retries might take between 5-15 - # calls to the client implementation. And while this will probably continue - # to change across OSes and Curl updates, we're likely in trouble if we see - # hundreds or thousands of calls. - $stderr =~ $count_pattern; - cmp_ok($1, '<', 100, "call count is reasonably small"); + # Curl 8.20.0 regressed this test case: + # + # https://github.com/curl/curl/issues/21547 + # + skip 'call-count test is known to fail with libcurl 8.20.0', 2 + if $stderr =~ m/\Qinitialized libcurl 8.20.0\E/; + + my $count_pattern = qr/\[libpq\] total number of polls: (\d+)/; + if (like($stderr, $count_pattern, "call count: count is printed")) + { + # For reference, a typical flow with two retries might take between 5-15 + # calls to the client implementation. And while this will probably + # continue to change across OSes and Curl updates, we're likely in + # trouble if we see hundreds or thousands of calls. + $stderr =~ $count_pattern; + unless (cmp_ok($1, '<', 100, "call count is reasonably small")) + { + diag "full stderr:\n$stderr"; + } + } } # Stress test: make sure our builtin flow operates correctly even if the client diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build index 6b1e730bf46..216c38016ae 100644 --- a/src/test/modules/test_misc/meson.build +++ b/src/test/modules/test_misc/meson.build @@ -17,6 +17,7 @@ tests += { 't/006_signal_autovacuum.pl', 't/007_catcache_inval.pl', 't/008_replslot_single_user.pl', + 't/013_temp_obj_multisession.pl', ], }, } diff --git a/src/test/modules/test_misc/t/013_temp_obj_multisession.pl b/src/test/modules/test_misc/t/013_temp_obj_multisession.pl new file mode 100644 index 00000000000..0e28ed59d05 --- /dev/null +++ b/src/test/modules/test_misc/t/013_temp_obj_multisession.pl @@ -0,0 +1,271 @@ +# Copyright (c) 2026, PostgreSQL Global Development Group + +# Tests that one session cannot read or modify data in another session's +# temporary table. Each session keeps its temp data in its own local +# buffer pool, and a different backend has no visibility into those +# buffers, so any command that needs to look at the data must be +# rejected. +# +# DROP TABLE is intentionally allowed: it does not touch the table's +# contents, and autovacuum relies on this to clean up orphaned temp +# relations left behind by a crashed backend. +# +# A regression caught here typically means a new buffer-access entry +# point bypasses the RELATION_IS_OTHER_TEMP() check. See +# ReadBuffer_common(), StartReadBuffersImpl(), and read_stream_begin_impl() +# for the existing checks. When adding a new command or buffer-access +# path, also add a corresponding case below. + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use PostgreSQL::Test::BackgroundPsql; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('temp_lock'); +$node->init; +$node->append_conf('postgresql.conf', 'log_lock_waits=on'); +$node->start; + +# Owner session. Created via background_psql so it stays alive while +# the second session probes its temp objects. +my $psql1 = $node->background_psql('postgres'); + +# Initially create the table without an index, so read paths go straight +# through the read-stream / buffer-manager entry points without being +# masked by an index scan that would hit ReadBuffer_common from nbtree. +$psql1->query_safe(q(CREATE TEMP TABLE foo AS SELECT 42 AS val;)); + +# Also create an empty table, so read path go straight through the +# extend-relation entry point. +$psql1->query_safe(q(CREATE TEMP TABLE empty_foo (val INT);)); + +# Resolve the owner's temp schema so the probing session can refer to +# the table by a fully-qualified name. +my $tempschema = $node->safe_psql( + 'postgres', + q{ + SELECT n.nspname + FROM pg_class c + JOIN pg_namespace n ON n.oid = c.relnamespace + WHERE relname = 'foo' AND relpersistence = 't'; + } +); +chomp $tempschema; +ok($tempschema =~ /^pg_temp_\d+$/, "got temp schema: $tempschema"); + +my ($stdout, $stderr); + +# DML and SELECT have to read the table's data and therefore go through +# the buffer manager. With no index on the table, the planner cannot +# use index access, so SELECT/UPDATE/DELETE/MERGE/COPY all run through +# the read-stream path and are caught by read_stream_begin_impl(). + +$node->psql( + 'postgres', + "SELECT val FROM $tempschema.foo;", + stderr => \$stderr); +like( + $stderr, + qr/cannot access temporary tables of other sessions/, + 'SELECT (seqscan via read_stream)'); + +# INSERT into empty table goes through hio.c which calls RelationAddBlocks() to +# extend the table; that hits the check before new pages are created for the +# table. +$node->psql( + 'postgres', + "INSERT INTO $tempschema.empty_foo VALUES (42);", + stderr => \$stderr); +like( + $stderr, + qr/cannot access temporary tables of other sessions/, + 'INSERT (caught via hio.c)'); + +# INSERT goes through hio.c which calls ReadBufferExtended() to find a +# page with free space; that hits the existing check before any data +# is written. +$node->psql( + 'postgres', + "INSERT INTO $tempschema.foo VALUES (73);", + stderr => \$stderr); +like( + $stderr, + qr/cannot access temporary tables of other sessions/, + 'INSERT (caught via hio.c)'); + +$node->psql( + 'postgres', + "UPDATE $tempschema.foo SET val = NULL;", + stderr => \$stderr); +like($stderr, qr/cannot access temporary tables of other sessions/, 'UPDATE'); + +$node->psql('postgres', "DELETE FROM $tempschema.foo;", stderr => \$stderr); +like($stderr, qr/cannot access temporary tables of other sessions/, 'DELETE'); + +$node->psql( + 'postgres', + "MERGE INTO $tempschema.foo USING (VALUES (42)) AS s(val) " + . "ON foo.val = s.val WHEN MATCHED THEN DELETE;", + stderr => \$stderr); +like($stderr, qr/cannot access temporary tables of other sessions/, 'MERGE'); + +$node->psql('postgres', "COPY $tempschema.foo TO STDOUT;", + stderr => \$stderr); +like($stderr, qr/cannot access temporary tables of other sessions/, 'COPY'); + +# DDL and maintenance commands have their own command-specific checks +# (older than the buffer-manager check above), so they fail with +# command-specific error messages. Verifying them here documents the +# expected behaviour and guards against accidental removal of those +# checks. + +$node->psql('postgres', "TRUNCATE TABLE $tempschema.foo;", + stderr => \$stderr); +like($stderr, qr/cannot truncate temporary tables of other sessions/, + 'TRUNCATE'); + +$node->psql( + 'postgres', + "ALTER TABLE $tempschema.foo ALTER COLUMN val TYPE bigint;", + stderr => \$stderr); +like($stderr, qr/cannot alter temporary tables of other sessions/, + 'ALTER TABLE'); + +# VACUUM silently skips other sessions' temp tables (vacuum_rel() returns +# without warning to avoid noise during database-wide VACUUM). Verify +# that no error is reported, and that no buffer-access path is hit. +$node->psql('postgres', "VACUUM $tempschema.foo;", stderr => \$stderr); +is($stderr, '', 'VACUUM is silently skipped'); + +$node->psql('postgres', "CLUSTER $tempschema.foo;", stderr => \$stderr); +like($stderr, qr/cannot cluster temporary tables of other sessions/, + 'CLUSTER'); + +# Now create an index to exercise the index-scan path. nbtree calls +# ReadBuffer (which is ReadBufferExtended -> ReadBuffer_common), so +# this exercises a different chain of buffer-manager entry points. +$psql1->query_safe(q(CREATE INDEX ON foo(val);)); + +$node->psql( + 'postgres', + "SET enable_seqscan = off; SELECT val FROM $tempschema.foo WHERE val = 42;", + stderr => \$stderr); +like( + $stderr, + qr/cannot access temporary tables of other sessions/, + 'index scan (ReadBuffer_common via nbtree)'); + +# ALTER INDEX goes through the same CheckAlterTableIsSafe() path as +# ALTER TABLE, so it produces the same error. +$node->psql( + 'postgres', + "ALTER INDEX $tempschema.foo_val_idx SET (fillfactor = 50);", + stderr => \$stderr); +like($stderr, qr/cannot alter temporary tables of other sessions/, + 'ALTER INDEX'); + +# A function created by the owner in its own pg_temp using its own +# row type can be observed via the catalog by a separate session. +# ALTER FUNCTION and DROP FUNCTION on it must work as catalog +# operations -- they don't read the underlying table -- which +# documents the boundary between catalog and data access for temp +# objects. +$psql1->query_safe( + q[CREATE FUNCTION pg_temp.foo_id(r foo) RETURNS int LANGUAGE SQL ] + . q[AS 'SELECT r.val';]); + +$node->psql( + 'postgres', + "ALTER FUNCTION $tempschema.foo_id($tempschema.foo) " + . "SET search_path = pg_catalog;", + stderr => \$stderr); +is($stderr, '', 'ALTER FUNCTION on function over other session\'s row type'); + +$node->psql( + 'postgres', + "DROP FUNCTION $tempschema.foo_id($tempschema.foo);", + stderr => \$stderr); +is($stderr, '', 'DROP FUNCTION on function over other session\'s row type'); + +# DROP TABLE on another session's temp table is intentionally permitted. +# DROP doesn't touch the table's contents, and autovacuum relies on this +# to remove temp relations orphaned by a crashed backend. Verify that +# the bare DROP succeeds without error. +$node->psql('postgres', "DROP TABLE $tempschema.foo;", stderr => \$stderr); +is($stderr, '', 'DROP TABLE is allowed'); + +# Cross-session CREATE FUNCTION scenario. The owner creates a fresh +# temp table foo2 in its pg_temp namespace, and a separate session +# then creates a function whose argument type is that row type. +# PostgreSQL allows this and emits a NOTICE: the function is moved +# into the creator's pg_temp namespace with an auto-dependency on +# the borrowed type, so it disappears together with the session that +# created it. +$psql1->query_safe(q(CREATE TEMP TABLE foo2 AS SELECT 42 AS val;)); + +$node->safe_psql('postgres', + "CREATE FUNCTION public.cross_session_func(r $tempschema.foo2) " + . "RETURNS int LANGUAGE SQL AS 'SELECT 1';"); + +# A bare DROP TABLE on foo2 now fails because cross_session_func +# depends on its row type. This is normal SQL dependency behaviour +# and documents that DROP itself is not blocked by buffer-manager +# checks -- we get a catalog-level error instead. +$node->psql('postgres', "DROP TABLE $tempschema.foo2;", stderr => \$stderr); +like( + $stderr, + qr/cannot drop table .*\.foo2 because other objects depend on it/, + 'DROP TABLE blocked by cross-session dependency'); + +my $foo2_oid = $node->safe_psql('postgres', + "SELECT oid FROM pg_class WHERE relname='foo2';"); + +# Cross-session LOCK TABLE scenario. Ensure that LockRelationOid is working +# properly for other temp tables since this mechanism is also used by +# autovacuum during orphaned tables cleanup. +my $psql2 = $node->background_psql('postgres'); +$psql2->query_safe( + qq{ + BEGIN; + LOCK TABLE $tempschema.foo2 IN ACCESS SHARE MODE; +}); + +# When the owner session ends, its temp objects are dropped via the +# normal session-exit cleanup, which cascades through +# DEPENDENCY_NORMAL and also removes the cross-session function that +# depended on the temp row type. This is the same mechanism +# autovacuum relies on to clean up temp relations left behind by a +# crashed backend. +# Access share lock on the foo2 will block session-exit cleanup, because an +# owner will try to acquire deletion lock all its temp objects via +# findDependentObjects. +my $log_offset = -s $node->logfile; +$psql1->quit; + +# Check whether session-exit cleanup is blocked. +$node->wait_for_log(qr/waiting for AccessExclusiveLock on relation $foo2_oid/, + $log_offset); + +# Release lock on foo2 and allow session-exit cleanup to finish. +$psql2->query_safe(q(COMMIT;)); +$psql2->quit; + +# After releasing the lock, the owner can finally acquire +# AccessExclusiveLock on foo2 and finish session-exit cleanup. Verify +# directly that both foo2 (the locked temp table) and cross_session_func +# (which depended on its row type) have been dropped. Both being gone +# confirms the owner's cleanup got past the blocked findDependentObjects() +# call and completed normally. +$node->poll_query_until('postgres', + "SELECT NOT EXISTS (SELECT 1 FROM pg_class WHERE oid = $foo2_oid)") + or die "foo2 was not cleaned up after owner session exit"; + +is( $node->safe_psql( + 'postgres', + "SELECT count(*) FROM pg_proc WHERE proname = 'cross_session_func'"), + '0', + 'cross_session_func cleaned up by cascade from foo2'); + +done_testing(); diff --git a/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm b/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm index 1725fe2f948..ffba1558ff2 100644 --- a/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm +++ b/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm @@ -167,6 +167,14 @@ sub adjust_database_contents 'drop function if exists public.putenv(text)', 'drop function if exists public.wait_pid(integer)'); } + + # delete seg row that pre-14 was printed incorrectly but would now + # be printed correctly + if ($dbnames{contrib_regression_seg}) + { + _add_st($result, 'contrib_regression_seg', + "delete from test_seg where s = '4.6 .. ~7.0'"); + } } # user table OIDs are gone from release 12 on diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build index 52993c32dbb..3c7d0492bba 100644 --- a/src/test/recovery/meson.build +++ b/src/test/recovery/meson.build @@ -56,7 +56,10 @@ tests += { 't/045_archive_restartpoint.pl', 't/046_checkpoint_logical_slot.pl', 't/047_checkpoint_physical_slot.pl', - 't/048_vacuum_horizon_floor.pl' + 't/048_vacuum_horizon_floor.pl', + 't/053_standby_login_event_trigger.pl', + 't/054_unlogged_sequence_promotion.pl', + 't/055_cascade_reconnect.pl', ], }, } diff --git a/src/test/recovery/t/004_timeline_switch.pl b/src/test/recovery/t/004_timeline_switch.pl index 5c2f8665330..d962b3adb1f 100644 --- a/src/test/recovery/t/004_timeline_switch.pl +++ b/src/test/recovery/t/004_timeline_switch.pl @@ -30,6 +30,10 @@ has_streaming => 1); $node_standby_2->start; +# Wait for standby_1 and standby_2 connection to the primary. +$node_primary->poll_query_until('postgres', + "SELECT count(1) = 2 FROM pg_stat_replication"); + # Create some content on primary $node_primary->safe_psql('postgres', "CREATE TABLE tab_int AS SELECT generate_series(1,1000) AS a"); @@ -47,11 +51,15 @@ stdout => \$psql_out); is($psql_out, 't', "promotion of standby with pg_promote"); -# Switch standby 2 to replay from standby 1 +# Switch standby 2 to replay from standby 1. During the timeline switch, +# the WAL receiver process on standby 2 should not be stopped, and the +# new primary connection string should not be visible +# in pg_stat_wal_receiver. +my $secret = 'dont_show_me'; my $connstr_1 = $node_standby_1->connstr; $node_standby_2->append_conf( 'postgresql.conf', qq( -primary_conninfo='$connstr_1' +primary_conninfo='$connstr_1 password=$secret' )); # Rotate logfile before restarting, for the log checks done below. @@ -93,6 +101,13 @@ is($wr_pid_before_switch, $wr_pid_after_switch, 'WAL receiver PID matches across timeline jumps'); +my $raw_conninfo_count = $node_standby_2->safe_psql('postgres', + "SELECT count(*) FROM pg_stat_wal_receiver WHERE conninfo LIKE '%$secret%'" +); + +is($raw_conninfo_count, '0', + 'pg_stat_wal_receiver.conninfo not updated across timeline jumps'); + # Ensure that a standby is able to follow a primary on a newer timeline # when WAL archiving is enabled. diff --git a/src/test/recovery/t/035_standby_logical_decoding.pl b/src/test/recovery/t/035_standby_logical_decoding.pl index c9c182892cf..bbc33afde3d 100644 --- a/src/test/recovery/t/035_standby_logical_decoding.pl +++ b/src/test/recovery/t/035_standby_logical_decoding.pl @@ -1054,4 +1054,86 @@ BEGIN 'got same expected output from pg_recvlogical decoding session on cascading standby' ); +################################################## +# Test that logical decoding on standby correctly handles a timeline +# change during promotion. This relies on an injection point that +# waits between the moment the segments of the old timeline are removed +# and the moment RecoveryInProgress() would set, catching that a WAL +# sender is still able to decode changes across a promotion. +################################################## + +# Create a logical slot on the cascading standby for this test. +$node_cascading_standby->create_logical_slot_on_standby($node_standby, + 'race_slot', 'testdb'); +$node_cascading_standby->create_logical_slot_on_standby($node_standby, + 'race_slot_sql', 'testdb'); + +$node_standby->safe_psql('testdb', + qq[INSERT INTO decoding_test(x,y) SELECT s, s::text FROM generate_series(10,13) s;] +); +$node_standby->wait_for_replay_catchup($node_cascading_standby); + +$expected = q{BEGIN +table public.decoding_test: INSERT: x[integer]:10 y[text]:'10' +table public.decoding_test: INSERT: x[integer]:11 y[text]:'11' +table public.decoding_test: INSERT: x[integer]:12 y[text]:'12' +table public.decoding_test: INSERT: x[integer]:13 y[text]:'13' +COMMIT}; + +$node_standby->safe_psql('testdb', 'CREATE EXTENSION injection_points;'); +$node_standby->wait_for_replay_catchup($node_cascading_standby); + +# Open a background psql session BEFORE promotion for the SQL decoding +# test. +my $decode_session = $node_cascading_standby->background_psql('testdb'); + +# Attach injection point to pause startup after WAL segment cleanup +# but before RecoveryInProgress() flips to false. +$node_cascading_standby->safe_psql('testdb', + "SELECT injection_points_attach('promotion-after-wal-segment-cleanup', 'wait');" +); + +# Promote, wait for the removal of the segments on the old timeline. +$node_cascading_standby->safe_psql('testdb', "SELECT pg_promote(false)"); +$node_cascading_standby->wait_for_event('startup', + 'promotion-after-wal-segment-cleanup'); + +# Start pg_recvlogical. +my ($stdout2, $stderr2); +my $handle2 = IPC::Run::start( + [ + 'pg_recvlogical', + '--dbname' => $node_cascading_standby->connstr('testdb'), + '--slot' => 'race_slot', + '--option' => 'include-xids=0', + '--option' => 'skip-empty-xacts=1', + '--file' => '-', + '--no-loop', + '--start', + ], + '>' => \$stdout2, + '2>' => \$stderr2, + IPC::Run::timeout($default_timeout)); + +# Verify that pg_recvlogical successfully decodes the data while startup +# is still paused in the injection point. +$pump_timeout = IPC::Run::timer($default_timeout); +ok( pump_until($handle2, $pump_timeout, \$stdout2, qr/COMMIT/s), + 'pg_recvlogical works during promotion timeline switch'); +chomp($stdout2); +is($stdout2, $expected, + 'got expected output from pg_recvlogical during promotion timeline switch' +); + +# Verify SQL decoding. +my $sql_out = $decode_session->query_safe( + "SELECT data FROM pg_logical_slot_peek_changes('race_slot_sql', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1')" +); +is($sql_out, $expected, + 'pg_logical_slot_peek_changes works during promotion timeline switch'); + +# Resume promotion. +$node_cascading_standby->safe_psql('testdb', + "SELECT injection_points_wakeup('promotion-after-wal-segment-cleanup');"); + done_testing(); diff --git a/src/test/recovery/t/053_standby_login_event_trigger.pl b/src/test/recovery/t/053_standby_login_event_trigger.pl new file mode 100644 index 00000000000..81903379092 --- /dev/null +++ b/src/test/recovery/t/053_standby_login_event_trigger.pl @@ -0,0 +1,125 @@ +# Copyright (c) 2026, PostgreSQL Global Development Group +# +# Verify that connecting to a standby still works after a login event +# trigger has been created and dropped on the primary. +# +# CREATE EVENT TRIGGER ... ON login sets pg_database.dathasloginevt to +# true on the primary, but DROP EVENT TRIGGER does not clear it -- the +# next login event trigger pass clears the flag lazily on the primary. +# That dangling flag replicates to the standby. Before the +# RecoveryInProgress() guard in EventTriggerOnLogin(), the standby +# tried to clear the flag itself, which requires AccessExclusiveLock +# on the database object; that lock mode is forbidden during recovery, +# so the new connection died with FATAL. +# +# To keep the test robust the event trigger is set up in a dedicated +# database (regress_login_evt). All synchronisation helpers below -- +# wait_for_replay_catchup() and friends -- connect to "postgres" on +# the primary; if the trigger were created in "postgres" itself, that +# probe connection would enter the cleanup branch on the primary and +# silently clear the flag before the test even runs, making the +# scenario unreproducible. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Set up primary and a streaming standby. +my $primary = PostgreSQL::Test::Cluster->new('primary'); +$primary->init(allows_streaming => 1); +$primary->start; + +my $backup_name = 'login_evt_backup'; +$primary->backup($backup_name); + +my $standby = PostgreSQL::Test::Cluster->new('standby'); +$standby->init_from_backup($primary, $backup_name, has_streaming => 1); +$standby->start; + +# A dedicated database isolates the dangling dathasloginevt flag from +# any helper that connects to the default "postgres" database. +$primary->safe_psql('postgres', 'CREATE DATABASE regress_login_evt'); +$primary->wait_for_replay_catchup($standby); + +# Sanity check: the standby can connect to the new database before +# the trigger machinery has touched it. +$standby->safe_psql('regress_login_evt', 'SELECT 1'); + +# Create and drop a login event trigger inside the dedicated database +# in a single session. CREATE EVENT TRIGGER sets +# pg_database.dathasloginevt = true for regress_login_evt; mark it +# ENABLE ALWAYS so the scenario matches the original bug report. +# After DROP the flag remains set on disk until a subsequent login on +# the primary clears it; since later helpers only touch the +# "postgres" database, regress_login_evt's flag stays set and +# replicates that way to the standby. +$primary->safe_psql( + 'regress_login_evt', q{ +CREATE FUNCTION init_session() RETURNS event_trigger +LANGUAGE plpgsql AS $$ BEGIN RAISE NOTICE 'init_session'; END $$; +CREATE EVENT TRIGGER init_session ON login + EXECUTE FUNCTION init_session(); +ALTER EVENT TRIGGER init_session ENABLE ALWAYS; +DROP EVENT TRIGGER init_session; +DROP FUNCTION init_session(); +}); + +# Wait for the standby to replay the CREATE/DROP catalog state. This +# probes "postgres", not regress_login_evt, so it does not disturb +# the dangling flag. +$primary->wait_for_replay_catchup($standby); + +# The flag remains set in regress_login_evt on both sides. +is( $primary->safe_psql( + 'postgres', + "SELECT dathasloginevt FROM pg_database WHERE datname = 'regress_login_evt'" + ), + 't', + 'dathasloginevt remains set on primary after DROP EVENT TRIGGER'); +is( $standby->safe_psql( + 'postgres', + "SELECT dathasloginevt FROM pg_database WHERE datname = 'regress_login_evt'" + ), + 't', + 'dathasloginevt replicated to standby'); + +# A new connection to regress_login_evt on the standby exercises +# EventTriggerOnLogin()'s cleanup branch. With the +# RecoveryInProgress() guard it succeeds; without it the session +# aborts with a FATAL about AccessExclusiveLock. +my ($ret, $stdout, $stderr) = $standby->psql('regress_login_evt', 'SELECT 1'); +is($ret, 0, + 'standby accepts connection to database with dangling dathasloginevt'); +unlike( + $stderr, + qr/cannot acquire lock mode AccessExclusiveLock/, + 'no AccessExclusiveLock FATAL on standby login'); + +# Finally exercise the primary-side cleanup that the standby is meant +# to defer to. Opening a fresh session against regress_login_evt on +# the primary enters EventTriggerOnLogin()'s cleanup branch with the +# trigger list empty; AccessExclusiveLock is allowed outside recovery, +# so the flag is cleared in place. The in-place update emits a +# XLOG_HEAP_INPLACE record but does not assign an xid or write a +# commit record, so the WAL is not auto-flushed -- force a flush via +# pg_switch_wal() so the record reaches the standby. +$primary->safe_psql('regress_login_evt', 'SELECT 1'); +is( $primary->safe_psql( + 'postgres', + "SELECT dathasloginevt FROM pg_database WHERE datname = 'regress_login_evt'" + ), + 'f', + 'primary clears dathasloginevt on next login after DROP'); + +$primary->safe_psql('postgres', 'SELECT pg_switch_wal()'); +$primary->wait_for_replay_catchup($standby); +is( $standby->safe_psql( + 'postgres', + "SELECT dathasloginevt FROM pg_database WHERE datname = 'regress_login_evt'" + ), + 'f', + 'cleared dathasloginevt replicates to standby'); + +done_testing(); diff --git a/src/test/recovery/t/054_unlogged_sequence_promotion.pl b/src/test/recovery/t/054_unlogged_sequence_promotion.pl new file mode 100644 index 00000000000..96d1e4bf18b --- /dev/null +++ b/src/test/recovery/t/054_unlogged_sequence_promotion.pl @@ -0,0 +1,34 @@ +# Copyright (c) 2026, PostgreSQL Global Development Group + +# Test that unlogged sequences created on a primary can be read after +# promotion of a standby that replayed their init fork. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); +$node_primary->init(allows_streaming => 1); +$node_primary->start; + +my $backup_name = 'my_backup'; +$node_primary->backup($backup_name); + +my $node_standby = PostgreSQL::Test::Cluster->new('standby'); +$node_standby->init_from_backup($node_primary, $backup_name, + has_streaming => 1); +$node_standby->start; + +# Create the unlogged sequence after the standby has started, so its init fork +# is generated by WAL replay on the standby. +$node_primary->safe_psql('postgres', "CREATE UNLOGGED SEQUENCE ulseq"); +$node_primary->wait_for_replay_catchup($node_standby); + +$node_standby->promote; + +is($node_standby->safe_psql('postgres', "SELECT nextval('ulseq')"), + 1, 'unlogged sequence can be read after standby promotion'); + +done_testing(); diff --git a/src/test/recovery/t/055_cascade_reconnect.pl b/src/test/recovery/t/055_cascade_reconnect.pl new file mode 100644 index 00000000000..051a3292533 --- /dev/null +++ b/src/test/recovery/t/055_cascade_reconnect.pl @@ -0,0 +1,148 @@ +# Copyright (c) 2026, PostgreSQL Global Development Group + +# Test that a cascading standby can reconnect to its upstream standby after +# advancing past the upstream's WAL flush position via archive recovery. +# +# Setup: praline -> samurai -> stubble +# stubble has both streaming (from samurai) and restore_command +# (from praline's archive). +# +# When samurai's walreceiver is stopped and stubble falls back to +# archive recovery, stubble may advance its recovery position past +# samurai's replay position. Previously, stubble's walreceiver +# would fail with "requested starting point is ahead of the WAL flush +# position" when reconnecting to samurai. + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Initialize praline with archiving +my $praline = PostgreSQL::Test::Cluster->new('praline'); +$praline->init(allows_streaming => 1, has_archiving => 1); +$praline->append_conf( + 'postgresql.conf', qq( +wal_keep_size = 128MB +checkpoint_timeout = 1h +)); +$praline->start; + +# Take backup and create samurai (streaming from praline, no archive) +my $backup_name = 'my_backup'; +$praline->backup($backup_name); + +my $samurai = PostgreSQL::Test::Cluster->new('samurai'); +$samurai->init_from_backup($praline, $backup_name, has_streaming => 1); +$samurai->start; + +# Wait for samurai to start streaming +$praline->wait_for_catchup($samurai); + +# Take backup from samurai and create stubble +# stubble streams from samurai AND restores from praline's archive +$samurai->backup($backup_name); + +my $stubble = PostgreSQL::Test::Cluster->new('stubble'); +$stubble->init_from_backup($samurai, $backup_name, has_streaming => 1); +$stubble->enable_restoring($praline); +$stubble->start; + +# Generate initial data and wait for full cascade replication +$praline->safe_psql('postgres', + "CREATE TABLE test_tab AS SELECT generate_series(1, 1000) AS id"); +$praline->wait_for_replay_catchup($samurai); +$samurai->wait_for_replay_catchup($stubble, $praline); + +my $result = $stubble->safe_psql('postgres', "SELECT count(*) FROM test_tab"); +is($result, '1000', 'initial data replicated to stubble'); + +# Disconnect samurai from praline by clearing primary_conninfo. +# This stops samurai's walreceiver, so samurai can no longer receive +# new WAL. Its GetStandbyFlushRecPtr() will return only replayPtr. +$samurai->append_conf('postgresql.conf', "primary_conninfo = ''"); +$samurai->reload; + +# Wait for samurai's walreceiver to stop +$samurai->poll_query_until('postgres', + "SELECT NOT EXISTS (SELECT 1 FROM pg_stat_wal_receiver)") + or die "Timed out waiting for samurai walreceiver to stop"; + +# Stop stubble cleanly. We'll restart it after generating new WAL +# so it enters the recovery state machine fresh and tries archive first. +$stubble->stop; + +# Force a checkpoint now so that no background checkpoint can generate +# extra WAL during the INSERT below and push it across a segment boundary. +# Combined with checkpoint_timeout = 1h this ensures the new WAL fits +# within a single segment, keeping the gap within wal_segment_size. +$praline->safe_psql('postgres', "CHECKPOINT"); + +# Generate more WAL on praline +$praline->safe_psql('postgres', + "INSERT INTO test_tab SELECT generate_series(1001, 2000)"); + +# Force WAL switch and wait for archiving to complete, so that +# stubble can find the new WAL in the archive when it starts. +my $walfile = $praline->safe_psql('postgres', + "SELECT pg_walfile_name(pg_current_wal_lsn())"); +$praline->safe_psql('postgres', "SELECT pg_switch_wal()"); +$praline->poll_query_until('postgres', + "SELECT '$walfile' <= last_archived_wal FROM pg_stat_archiver") + or die "Timed out waiting for WAL archiving"; + +# Rotate stubble's log so we can check just the new log output +$stubble->rotate_logfile; +my $stubble_log_offset = -s $stubble->logfile; + +# Start stubble. It will: +# 1. Read new WAL from praline's archive (XLOG_FROM_ARCHIVE) +# 2. Advance RecPtr past samurai's replay position +# 3. Try streaming from samurai (XLOG_FROM_STREAM) +# 4. detect that upstream is behind via +# IDENTIFY_SYSTEM and wait instead of failing +$stubble->start; + +# Wait for stubble to replay the new data from archive +$stubble->poll_query_until('postgres', + "SELECT count(*) >= 2000 FROM test_tab") + or die "Timed out waiting for stubble to replay archived WAL"; + +$result = $stubble->safe_psql('postgres', "SELECT count(*) FROM test_tab"); +is($result, '2000', 'stubble replayed new data from archive'); + +# Wait for walreceiver to hit the upstream-catchup wait event, proving we +# exercised the START_REPLICATION-ahead-of-upstream path. +$stubble->wait_for_event('walreceiver', 'WalReceiverUpstreamCatchup'); + +# Verify no errors occurred in stubble. +my $stubble_loglines = + PostgreSQL::Test::Utils::slurp_file($stubble->logfile, $stubble_log_offset); +ok( $stubble_loglines !~ m/ERROR/, 'no errors in stubble log'); + +# Now restore samurai's streaming from praline so it can catch up +$samurai->enable_streaming($praline); +$samurai->reload; + +# Wait for samurai to catch up with praline +$praline->wait_for_replay_catchup($samurai); + +# stubble's walreceiver should eventually connect to samurai and +# resume streaming (once samurai has caught up past stubble's position) +$samurai->poll_query_until('postgres', + "SELECT EXISTS (SELECT 1 FROM pg_stat_replication)") + or die "Timed out waiting for stubble to reconnect to samurai"; + +# Verify end-to-end cascade streaming works with new data +$praline->safe_psql('postgres', + "INSERT INTO test_tab SELECT generate_series(2001, 3000)"); +$praline->wait_for_replay_catchup($samurai); +$samurai->wait_for_replay_catchup($stubble, $praline); + +$result = $stubble->safe_psql('postgres', "SELECT count(*) FROM test_tab"); +is($result, '3000', + 'cascade streaming resumes normally after upstream catches up'); + +done_testing(); diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index cdb4ecf288f..e2a8e19f7b6 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -1515,17 +1515,26 @@ explain (costs off) select y,z from t2 group by y,z; -> Seq Scan on t2 (3 rows) +drop table t1 cascade; +NOTICE: drop cascades to table t1c +drop table t2; +drop table t3; +drop table p_t1; +-- A composite type used by the tests below to exercise the asymmetry +-- between record_ops (per-field equality, the default) and record_image_ops +-- (bytewise equality): values like row(1.0) and row(1.00) are field-equal +-- but byte-distinct. +create type avg_rec as (x numeric); -- A unique index proves uniqueness only under its own opfamily. When the -- GROUP BY's eqop comes from a different opfamily with looser equality, -- rows the index regards as distinct can collapse into one GROUP BY group, -- so the index is not usable for removing redundant columns. -create type t_rec as (x numeric); -create temp table t_opf (a t_rec not null, b text); +create temp table t_opf (a avg_rec not null, b text); create unique index on t_opf (a record_image_ops); -- (1.0) and (1.00) are bytewise distinct but logically equal as records; -- the index admits both, but GROUP BY a (default record_ops) would merge -- them, so b must be retained as a grouping key. -insert into t_opf values (row(1.0)::t_rec, 'X'), (row(1.00)::t_rec, 'Y'); +insert into t_opf values (row(1.0)::avg_rec, 'X'), (row(1.00)::avg_rec, 'Y'); explain (costs off) select a, b from t_opf group by a, b order by b; QUERY PLAN @@ -1545,12 +1554,65 @@ select a, b from t_opf group by a, b order by b; (2 rows) drop table t_opf; -drop type t_rec; -drop table t1 cascade; -NOTICE: drop cascades to table t1c -drop table t2; -drop table t3; -drop table p_t1; +-- A HAVING clause that uses an equality operator from a different opfamily +-- than the GROUP BY's eqop must NOT be pushed down to WHERE. +create temp table t_having (id int, a avg_rec); +insert into t_having values + (1, row(1.0)::avg_rec), + (2, row(1.00)::avg_rec), + (3, row(2)::avg_rec); +-- the clause must stay in HAVING +explain (costs off) +select a, count(*) from t_having group by a having a *= row(1.0)::avg_rec; + QUERY PLAN +----------------------------------- + HashAggregate + Group Key: a + Filter: (a *= '(1.0)'::avg_rec) + -> Seq Scan on t_having +(4 rows) + +select a, count(*) from t_having group by a having a *= row(1.0)::avg_rec; + a | count +-------+------- + (1.0) | 2 +(1 row) + +-- the clause must stay in HAVING +explain (costs off) +select a, count(*) from t_having group by a having a *= any (array[row(1.0)::avg_rec]); + QUERY PLAN +--------------------------------------------- + HashAggregate + Group Key: a + Filter: (a *= ANY ('{(1.0)}'::avg_rec[])) + -> Seq Scan on t_having +(4 rows) + +select a, count(*) from t_having group by a having a *= any (array[row(1.0)::avg_rec]); + a | count +-------+------- + (1.0) | 2 +(1 row) + +-- the clause can be pushed down to WHERE +explain (costs off) +select a, count(*) from t_having group by a having a = row(1.0)::avg_rec; + QUERY PLAN +---------------------------------------- + GroupAggregate + -> Seq Scan on t_having + Filter: (a = '(1.0)'::avg_rec) +(3 rows) + +select a, count(*) from t_having group by a having a = row(1.0)::avg_rec; + a | count +-------+------- + (1.0) | 2 +(1 row) + +drop table t_having; +drop type avg_rec; -- -- Test GROUP BY matching of join columns that are type-coerced due to USING -- diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 65a18ca1d9b..09ec96af340 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -2933,11 +2933,12 @@ begin; alter table alterlock2 add constraint alterlock2nv foreign key (f1) references alterlock (f1) NOT VALID; select * from my_locks order by 1; - relname | max_lockmode -------------+----------------------- - alterlock | ShareRowExclusiveLock - alterlock2 | ShareRowExclusiveLock -(2 rows) + relname | max_lockmode +----------------+----------------------- + alterlock | ShareRowExclusiveLock + alterlock2 | ShareRowExclusiveLock + alterlock_pkey | AccessShareLock +(3 rows) commit; begin; diff --git a/src/test/regress/expected/collate.icu.utf8.out b/src/test/regress/expected/collate.icu.utf8.out index 66093040965..e700a5e1122 100644 --- a/src/test/regress/expected/collate.icu.utf8.out +++ b/src/test/regress/expected/collate.icu.utf8.out @@ -1471,6 +1471,36 @@ SELECT 'abc' <= 'ABC' COLLATE case_insensitive, 'abc' >= 'ABC' COLLATE case_inse t | t (1 row) +SELECT 'AB' LIKE 'ab' COLLATE case_insensitive AS t; + t +--- + t +(1 row) + +SELECT 'AB' LIKE 'a\b' COLLATE case_insensitive AS t; + t +--- + t +(1 row) + +SELECT 'AB' LIKE '\ab' COLLATE case_insensitive AS t; + t +--- + t +(1 row) + +SELECT 'AB' LIKE '\a%' COLLATE case_insensitive AS t; + t +--- + t +(1 row) + +SELECT 'AB' LIKE '\a\%' COLLATE case_insensitive AS f; + f +--- + f +(1 row) + -- tests with array_sort SELECT array_sort('{a,B}'::text[] COLLATE case_insensitive); array_sort @@ -2074,6 +2104,29 @@ SELECT string_to_array('ABCDEFGHI' COLLATE case_insensitive, NULL, 'b'); {A,NULL,C,D,E,F,G,H,I} (1 row) +-- These queries should be able to use the index on test1ci.x: +SET enable_seqscan = off; +SET enable_indexonlyscan = off; +EXPLAIN (COSTS OFF) +SELECT * FROM test1ci WHERE x ~ '^abc$' COLLATE "C"; + QUERY PLAN +------------------------------------------- + Index Scan using test1ci_x_idx on test1ci + Index Cond: (x = 'abc'::text) + Filter: (x ~ '^abc$'::text COLLATE "C") +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM test1ci WHERE x LIKE 'abc' COLLATE case_insensitive; + QUERY PLAN +------------------------------------------------------- + Index Scan using test1ci_x_idx on test1ci + Index Cond: (x = 'abc'::text) + Filter: (x ~~ 'abc'::text COLLATE case_insensitive) +(3 rows) + +RESET enable_seqscan; +RESET enable_indexonlyscan; -- Test HAVING-to-WHERE pushdown with nondeterministic collations. -- When a HAVING clause uses a different collation than the GROUP BY's -- nondeterministic collation, it must not be pushed to WHERE, otherwise @@ -2112,7 +2165,7 @@ SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensi abc | 2 (1 row) --- Negative: function applied to grouped column with conflicting collation +-- Negative: function over the grouping column, conflicting collation EXPLAIN (COSTS OFF) SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x) = 'ABC' COLLATE case_sensitive; QUERY PLAN @@ -2129,18 +2182,36 @@ SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x) = 'ABC' COLLATE case_ abc | 2 (1 row) --- Positive: function with same collation as GROUP BY +-- Negative: function over the grouping column whose result is compared as an +-- integer, under no collation +EXPLAIN (COSTS OFF) +SELECT x, count(*) FROM test3ci GROUP BY x HAVING ascii(x) = 97; + QUERY PLAN +--------------------------- + HashAggregate + Group Key: x + Filter: (ascii(x) = 97) + -> Seq Scan on test3ci +(4 rows) + +SELECT x, count(*) FROM test3ci GROUP BY x HAVING ascii(x) = 97; + x | count +-----+------- + abc | 2 +(1 row) + +-- Negative: a function wrapping the grouping column is not provably safe even +-- when compared under the matching collation, since the function need not +-- preserve the collation's equality EXPLAIN (COSTS OFF) SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x) = 'ABC' COLLATE case_insensitive; - QUERY PLAN -------------------------------------------------------------------------- - GroupAggregate + QUERY PLAN +------------------------------------------------------------- + HashAggregate Group Key: x - -> Sort - Sort Key: x COLLATE case_insensitive - -> Seq Scan on test3ci - Filter: (upper(x) = 'ABC'::text COLLATE case_insensitive) -(6 rows) + Filter: (upper(x) = 'ABC'::text COLLATE case_insensitive) + -> Seq Scan on test3ci +(4 rows) SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x) = 'ABC' COLLATE case_insensitive; x | count @@ -2148,8 +2219,8 @@ SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x) = 'ABC' COLLATE case_ abc | 2 (1 row) --- Negative: inner function has conflicting collation, even though outer --- operator's collation matches GROUP BY due to a COLLATE override +-- Negative: same, with the grouping column wrapped in a function whose input +-- collation is overridden; still not a direct operand, so it stays in HAVING EXPLAIN (COSTS OFF) SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x COLLATE case_sensitive) COLLATE case_insensitive = 'ABC'; QUERY PLAN @@ -2168,17 +2239,17 @@ SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x COLLATE case_sensitive -- Mixed AND: conflicting clause stays in HAVING, safe clause pushed to WHERE EXPLAIN (COSTS OFF) -SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_sensitive AND length(x) > 1; - QUERY PLAN ----------------------------------------------------- +SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_sensitive AND x >= 'a' COLLATE case_insensitive; + QUERY PLAN +----------------------------------------------------------- HashAggregate Group Key: x Filter: (x = 'abc'::text COLLATE case_sensitive) -> Seq Scan on test3ci - Filter: (length(x) > 1) + Filter: (x >= 'a'::text COLLATE case_insensitive) (5 rows) -SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_sensitive AND length(x) > 1; +SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_sensitive AND x >= 'a' COLLATE case_insensitive; x | count -----+------- abc | 2 @@ -2186,15 +2257,15 @@ SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_sensiti -- Positive: AND of two safe clauses, both can be pushed EXPLAIN (COSTS OFF) -SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive AND length(x) > 1; - QUERY PLAN ----------------------------------------------------------------------------------- +SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive AND x >= 'a' COLLATE case_insensitive; + QUERY PLAN +------------------------------------------------------------------------------------------------------------ GroupAggregate -> Seq Scan on test3ci - Filter: ((x = 'abc'::text COLLATE case_insensitive) AND (length(x) > 1)) + Filter: ((x >= 'a'::text COLLATE case_insensitive) AND (x = 'abc'::text COLLATE case_insensitive)) (3 rows) -SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive AND length(x) > 1; +SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive AND x >= 'a' COLLATE case_insensitive; x | count -----+------- abc | 2 @@ -2338,6 +2409,230 @@ SELECT x, count(*) FROM test3cs GROUP BY x HAVING x = 'abc' COLLATE case_insensi ABC | 1 (2 rows) +-- Test WHERE-pushdown past a grouping layer (DISTINCT, DISTINCT ON, window +-- PARTITION BY) when the qual applies a different collation than the +-- grouping column's nondeterministic collation. The qual would distinguish +-- rows the grouping considers equal, so it must NOT be pushed inside the +-- subquery. +CREATE TABLE pushdown_ci (id int, x text COLLATE case_insensitive); +INSERT INTO pushdown_ci VALUES (1, 'ABC'), (2, 'abc'), (3, 'def'); +-- DISTINCT ON: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT ON (x) id, x FROM pushdown_ci ORDER BY x, id) s +WHERE x = 'abc' COLLATE case_sensitive; + QUERY PLAN +-------------------------------------------------------------------------------- + Subquery Scan on s + Filter: (s.x = 'abc'::text COLLATE case_sensitive) + -> Unique + -> Sort + Sort Key: pushdown_ci.x COLLATE case_insensitive, pushdown_ci.id + -> Seq Scan on pushdown_ci +(6 rows) + +SELECT * FROM (SELECT DISTINCT ON (x) id, x FROM pushdown_ci ORDER BY x, id) s +WHERE x = 'abc' COLLATE case_sensitive; + id | x +----+--- +(0 rows) + +-- Window function PARTITION BY: conflict, qual stays outside the WindowAgg +EXPLAIN (COSTS OFF) +SELECT * FROM ( + SELECT id, x, count(*) OVER (PARTITION BY x) AS cnt FROM pushdown_ci +) s +WHERE x = 'abc' COLLATE case_sensitive; + QUERY PLAN +---------------------------------------------------------------- + Subquery Scan on s + Filter: (s.x = 'abc'::text COLLATE case_sensitive) + -> WindowAgg + Window: w1 AS (PARTITION BY pushdown_ci.x) + -> Sort + Sort Key: pushdown_ci.x COLLATE case_insensitive + -> Seq Scan on pushdown_ci +(7 rows) + +SELECT * FROM ( + SELECT id, x, count(*) OVER (PARTITION BY x) AS cnt FROM pushdown_ci +) s +WHERE x = 'abc' COLLATE case_sensitive; + id | x | cnt +----+-----+----- + 2 | abc | 2 +(1 row) + +-- Plain DISTINCT: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT x FROM pushdown_ci) s +WHERE x = 'abc' COLLATE case_sensitive; + QUERY PLAN +------------------------------------------------------ + Subquery Scan on s + Filter: (s.x = 'abc'::text COLLATE case_sensitive) + -> HashAggregate + Group Key: pushdown_ci.x + -> Seq Scan on pushdown_ci +(5 rows) + +SELECT * FROM (SELECT DISTINCT x FROM pushdown_ci) s +WHERE x = 'abc' COLLATE case_sensitive; + x +--- +(0 rows) + +-- Positive: matching collation, safe to push past the grouping +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT ON (x) id, x FROM pushdown_ci ORDER BY x, id) s +WHERE x = 'abc' COLLATE case_insensitive; + QUERY PLAN +------------------------------------------------------------------ + Limit + -> Sort + Sort Key: pushdown_ci.id + -> Seq Scan on pushdown_ci + Filter: (x = 'abc'::text COLLATE case_insensitive) +(5 rows) + +SELECT * FROM (SELECT DISTINCT ON (x) id, x FROM pushdown_ci ORDER BY x, id) s +WHERE x = 'abc' COLLATE case_insensitive; + id | x +----+----- + 1 | ABC +(1 row) + +-- Set operations: any operation other than UNION ALL groups rows by equality, +-- so the same collation-mismatch rules apply. +CREATE TABLE pushdown_ci2 (x text COLLATE case_insensitive); +INSERT INTO pushdown_ci2 VALUES ('abc'); +-- UNION: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT x FROM pushdown_ci UNION SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + QUERY PLAN +------------------------------------------------------ + Subquery Scan on s + Filter: (s.x = 'abc'::text COLLATE case_sensitive) + -> HashAggregate + Group Key: pushdown_ci.x + -> Append + -> Seq Scan on pushdown_ci + -> Seq Scan on pushdown_ci2 +(7 rows) + +SELECT * FROM (SELECT x FROM pushdown_ci UNION SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + x +--- +(0 rows) + +-- INTERSECT: same +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT x FROM pushdown_ci INTERSECT SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + QUERY PLAN +------------------------------------------------------ + Subquery Scan on s + Filter: (s.x = 'abc'::text COLLATE case_sensitive) + -> HashSetOp Intersect + -> Seq Scan on pushdown_ci + -> Seq Scan on pushdown_ci2 +(5 rows) + +SELECT * FROM (SELECT x FROM pushdown_ci INTERSECT SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + x +--- +(0 rows) + +-- INTERSECT ALL: still groups +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT x FROM pushdown_ci INTERSECT ALL SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + QUERY PLAN +------------------------------------------------------ + Subquery Scan on s + Filter: (s.x = 'abc'::text COLLATE case_sensitive) + -> HashSetOp Intersect All + -> Seq Scan on pushdown_ci + -> Seq Scan on pushdown_ci2 +(5 rows) + +SELECT * FROM (SELECT x FROM pushdown_ci INTERSECT ALL SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + x +--- +(0 rows) + +-- Negative: a function over a grouping column with a nondeterministic +-- collation, whose result is compared under no collation (an integer +-- comparison), can distinguish values the grouping considers equal. +-- PARTITION BY +EXPLAIN (COSTS OFF) +SELECT * FROM ( + SELECT id, x, count(*) OVER (PARTITION BY x) AS cnt FROM pushdown_ci +) s +WHERE ascii(x) = 97; + QUERY PLAN +---------------------------------------------------------------- + Subquery Scan on s + Filter: (ascii(s.x) = 97) + -> WindowAgg + Window: w1 AS (PARTITION BY pushdown_ci.x) + -> Sort + Sort Key: pushdown_ci.x COLLATE case_insensitive + -> Seq Scan on pushdown_ci +(7 rows) + +SELECT * FROM ( + SELECT id, x, count(*) OVER (PARTITION BY x) AS cnt FROM pushdown_ci +) s +WHERE ascii(x) = 97; + id | x | cnt +----+-----+----- + 2 | abc | 2 +(1 row) + +-- Same with DISTINCT +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT x FROM pushdown_ci) s WHERE ascii(x) = 97; + QUERY PLAN +------------------------------------- + Subquery Scan on s + Filter: (ascii(s.x) = 97) + -> HashAggregate + Group Key: pushdown_ci.x + -> Seq Scan on pushdown_ci +(5 rows) + +SELECT * FROM (SELECT DISTINCT x FROM pushdown_ci) s WHERE ascii(x) = 97; + x +--- +(0 rows) + +-- Same with Set operations +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT x FROM pushdown_ci UNION SELECT x FROM pushdown_ci2) s +WHERE ascii(x) = 97; + QUERY PLAN +-------------------------------------------- + Subquery Scan on s + Filter: (ascii(s.x) = 97) + -> HashAggregate + Group Key: pushdown_ci.x + -> Append + -> Seq Scan on pushdown_ci + -> Seq Scan on pushdown_ci2 +(7 rows) + +SELECT * FROM (SELECT x FROM pushdown_ci UNION SELECT x FROM pushdown_ci2) s +WHERE ascii(x) = 97; + x +--- +(0 rows) + +DROP TABLE pushdown_ci2; +DROP TABLE pushdown_ci; -- bpchar CREATE TABLE test1bpci (x char(3) COLLATE case_insensitive); CREATE TABLE test2bpci (x char(3) COLLATE case_insensitive); @@ -2731,6 +3026,37 @@ SELECT U&'\0061\0308bc' LIKE U&'_\00e4bc' COLLATE ignore_accents; -- escape character at end of pattern SELECT 'foox' LIKE 'foo\' COLLATE ignore_accents; ERROR: LIKE pattern must not end with escape character +-- literal backslash with nondeterministic collation (bug #19474) +SELECT 'back\slash' COLLATE ignore_accents LIKE 'back\slash%' ESCAPE '#'; + ?column? +---------- + t +(1 row) + +SELECT 'aäb' COLLATE ignore_accents LIKE 'a#äb' ESCAPE '#' AS multibyte_escape; + multibyte_escape +------------------ + t +(1 row) + +SELECT 'a\äb' COLLATE ignore_accents LIKE 'a\äb%' ESCAPE '#' AS backslash_multibyte; + backslash_multibyte +--------------------- + t +(1 row) + +SELECT 'a\b%c' COLLATE ignore_accents LIKE 'a#\b#%%c' ESCAPE '#' AS mixed_escapes; + mixed_escapes +--------------- + t +(1 row) + +SELECT 'backslash' COLLATE ignore_accents LIKE 'back\\slash%'; + ?column? +---------- + f +(1 row) + -- foreign keys (mixing different nondeterministic collations not allowed) CREATE TABLE test10pk (x text COLLATE case_sensitive PRIMARY KEY); CREATE TABLE test10fk (x text COLLATE case_insensitive REFERENCES test10pk (x) ON UPDATE CASCADE ON DELETE CASCADE); -- error diff --git a/src/test/regress/expected/collate.linux.utf8.out b/src/test/regress/expected/collate.linux.utf8.out index fbaab7cdf83..9dee1dced71 100644 --- a/src/test/regress/expected/collate.linux.utf8.out +++ b/src/test/regress/expected/collate.linux.utf8.out @@ -479,6 +479,24 @@ SELECT to_date('01 Şub 2010', 'DD TMMON YYYY'); SELECT to_date('1234567890ab 2010', 'TMMONTH YYYY'); -- fail ERROR: invalid value "1234567890ab" for "MONTH" DETAIL: The given value did not match any of the allowed values for this field. +SELECT to_date('01 Aralık 2010', 'DD TMMONTH YYYY'); + to_date +------------ + 12-01-2010 +(1 row) + +SELECT to_date('01 aralık 2010', 'DD TMMONTH YYYY'); + to_date +------------ + 12-01-2010 +(1 row) + +SELECT to_date('2010 01 araLık', 'YYYY DD TMMONTH'); + to_date +------------ + 12-01-2010 +(1 row) + -- backwards parsing CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; diff --git a/src/test/regress/expected/collate.out b/src/test/regress/expected/collate.out index bf72908fbd3..a57c865bb0f 100644 --- a/src/test/regress/expected/collate.out +++ b/src/test/regress/expected/collate.out @@ -766,6 +766,29 @@ DETAIL: LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE. CREATE COLLATION coll_dup_chk (FROM = "C", VERSION = "1"); ERROR: conflicting or redundant options DETAIL: FROM cannot be specified together with any other options. +-- Regex exact-match optimization should use an index even when the expression +-- and index have different collations, so long as the expression's collation +-- is deterministic. This example tests what we want because the optimizer +-- does not perceive "C" collation (used by the system catalogs) as identical +-- to "POSIX" collation. +EXPLAIN (COSTS OFF) +SELECT * FROM pg_class WHERE relname ~ '^pg_class$' COLLATE "POSIX"; + QUERY PLAN +---------------------------------------------------------- + Index Scan using pg_class_relname_nsp_index on pg_class + Index Cond: (relname = 'pg_class'::text) + Filter: (relname ~ '^pg_class$'::text COLLATE "POSIX") +(3 rows) + +EXPLAIN (COSTS OFF) +SELECT * FROM pg_class WHERE relname LIKE 'pg\_class' COLLATE "POSIX"; + QUERY PLAN +---------------------------------------------------------- + Index Scan using pg_class_relname_nsp_index on pg_class + Index Cond: (relname = 'pg_class'::text) + Filter: (relname ~~ 'pg\_class'::text COLLATE "POSIX") +(3 rows) + -- -- Clean up. Many of these table names will be re-used if the user is -- trying to run any platform-specific collation tests later, so we diff --git a/src/test/regress/expected/collate.utf8.out b/src/test/regress/expected/collate.utf8.out index 0c3ab5c89b2..99fdc111fa4 100644 --- a/src/test/regress/expected/collate.utf8.out +++ b/src/test/regress/expected/collate.utf8.out @@ -263,6 +263,12 @@ SELECT lower('ᾼΣͅΑ' COLLATE PG_UNICODE_FAST); -- 0391 0345 03A3 0345 0391 ᾳσͅα (1 row) +SELECT lower(U&'\0300\03A3' COLLATE PG_UNICODE_FAST); + lower +------- + ̀σ +(1 row) + -- properties SELECT 'xyz' ~ '[[:alnum:]]' COLLATE PG_UNICODE_FAST; ?column? diff --git a/src/test/regress/expected/compression_pglz.out b/src/test/regress/expected/compression_pglz.out index 0ef49d42506..066a3317c65 100644 --- a/src/test/regress/expected/compression_pglz.out +++ b/src/test/regress/expected/compression_pglz.out @@ -60,6 +60,18 @@ SELECT test_pglz_decompress('\x010f01'::bytea, 1024, false); ERROR: pglz_decompress failed SELECT test_pglz_decompress('\x010f01'::bytea, 1024, true); ERROR: pglz_decompress failed +-- Corrupted compressed data. Set control bit with a valid 2-byte match +-- tag where offset exceeds output written. +SELECT test_pglz_decompress('\x011001'::bytea, 1024, false); +ERROR: pglz_decompress failed +SELECT test_pglz_decompress('\x011001'::bytea, 1024, true); +ERROR: pglz_decompress failed +-- Corrupted compressed data. Set control bit with a valid 2-byte match +-- tag where offset is 0. +SELECT test_pglz_decompress('\x010300'::bytea, 1024, false); +ERROR: pglz_decompress failed +SELECT test_pglz_decompress('\x010300'::bytea, 1024, true); +ERROR: pglz_decompress failed -- Clean up DROP FUNCTION test_pglz_compress; DROP FUNCTION test_pglz_decompress; diff --git a/src/test/regress/expected/constraints.out b/src/test/regress/expected/constraints.out index ebc892a2a42..e619459647c 100644 --- a/src/test/regress/expected/constraints.out +++ b/src/test/regress/expected/constraints.out @@ -1042,6 +1042,10 @@ CREATE TABLE ATACC1 (a int NOT NULL NO INHERIT) PARTITION BY LIST (a); ERROR: not-null constraints on partitioned tables cannot be NO INHERIT CREATE TABLE ATACC1 (a int, NOT NULL a NO INHERIT) PARTITION BY LIST (a); ERROR: not-null constraints on partitioned tables cannot be NO INHERIT +CREATE TABLE ATACC1 (a int, CONSTRAINT a_is_not_null NOT NULL a) PARTITION BY LIST (a); +ALTER TABLE ATACC1 ALTER CONSTRAINT a_is_not_null NO INHERIT; +ERROR: not-null constraint "a_is_not_null" on partitioned table "atacc1" cannot be NO INHERIT +DROP TABLE ATACC1; -- it's not possible to override a no-inherit constraint with an inheritable one CREATE TABLE ATACC2 (a int, CONSTRAINT a_is_not_null NOT NULL a NO INHERIT); CREATE TABLE ATACC1 (a int); diff --git a/src/test/regress/expected/copy.out b/src/test/regress/expected/copy.out index 8d5a06563c4..47aa31244e9 100644 --- a/src/test/regress/expected/copy.out +++ b/src/test/regress/expected/copy.out @@ -285,13 +285,9 @@ copy oversized_column_default from stdin; -- error if the column is excluded copy oversized_column_default (col2) from stdin; ERROR: value too long for type character varying(5) -\. -invalid command \. -- error if the DEFAULT option is given copy oversized_column_default from stdin (default ''); ERROR: value too long for type character varying(5) -\. -invalid command \. drop table oversized_column_default; -- -- Create partitioned table that does not allow bulk insertions, to test bugs diff --git a/src/test/regress/expected/encoding.out b/src/test/regress/expected/encoding.out index b3655527b0a..7e00c25b96a 100644 --- a/src/test/regress/expected/encoding.out +++ b/src/test/regress/expected/encoding.out @@ -416,6 +416,25 @@ SELECT SUBSTRING(c FROM 3000 FOR 1) FROM toast_4b_utf8; 🚀 (1 row) +-- ascii() and multibyte characters +SELECT ascii(test_bytea_to_text('\xc3')); +ERROR: invalid byte sequence for encoding "UTF8" +SELECT ascii(test_bytea_to_text('\xe2')); +ERROR: invalid byte sequence for encoding "UTF8" +SELECT ascii(test_bytea_to_text('\xe282')); +ERROR: invalid byte sequence for encoding "UTF8" +SELECT ascii(test_bytea_to_text('\xf0')); +ERROR: invalid byte sequence for encoding "UTF8" +SELECT ascii(test_bytea_to_text('\xf09f')); +ERROR: invalid byte sequence for encoding "UTF8" +SELECT ascii(test_bytea_to_text('\xf09f98')); +ERROR: invalid byte sequence for encoding "UTF8" +-- invalid continuation byte +SELECT ascii(test_bytea_to_text('\xc3ff')); +ERROR: invalid byte sequence for encoding "UTF8" +-- invalid leading byte +SELECT ascii(test_bytea_to_text('\x80')); +ERROR: invalid byte sequence for encoding "UTF8" DROP TABLE encoding_tests; DROP TABLE toast_4b_utf8; DROP FUNCTION test_encoding; diff --git a/src/test/regress/expected/generated_stored.out b/src/test/regress/expected/generated_stored.out index 86a04548a02..77fcd9002c6 100644 --- a/src/test/regress/expected/generated_stored.out +++ b/src/test/regress/expected/generated_stored.out @@ -1329,6 +1329,56 @@ Inherits: gtest30 ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error ERROR: cannot drop generation expression from inherited column +BEGIN; +CREATE TABLE gtest30_1_1 () INHERITS (gtest30_1); +ALTER TABLE gtest30 ALTER COLUMN b DROP EXPRESSION; +\d gtest30_1_1 + Table "generated_stored_tests.gtest30_1_1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | +Inherits: gtest30_1 + +ROLLBACK; +-- test drop expression with subpartitions +CREATE TABLE gtest_root (a int, b int, c int GENERATED ALWAYS AS (a + b) STORED) PARTITION BY LIST (a); +CREATE TABLE gtest_node PARTITION OF gtest_root FOR VALUES IN (1) PARTITION BY LIST (b); +CREATE TABLE gtest_leaf PARTITION OF gtest_node FOR VALUES IN (1); +ALTER TABLE gtest_node ALTER COLUMN c DROP EXPRESSION; -- fails +ERROR: cannot drop generation expression from inherited column +ALTER TABLE ONLY gtest_root ALTER COLUMN c DROP EXPRESSION; -- fails +ERROR: ALTER TABLE / DROP EXPRESSION must be applied to child tables too +ALTER TABLE gtest_root ALTER COLUMN c DROP EXPRESSION; +\d gtest_(root|node|leaf) + Table "generated_stored_tests.gtest_leaf" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | +Partition of: gtest_node FOR VALUES IN (1) + +Partitioned table "generated_stored_tests.gtest_node" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | +Partition of: gtest_root FOR VALUES IN (1) +Partition key: LIST (b) +Number of partitions: 1 (Use \d+ to list them.) + +Partitioned table "generated_stored_tests.gtest_root" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | +Partition key: LIST (a) +Number of partitions: 1 (Use \d+ to list them.) + +DROP TABLE gtest_root; -- composite type dependencies CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text); CREATE TABLE gtest31_2 (x int, y gtest31_1); diff --git a/src/test/regress/expected/generated_virtual.out b/src/test/regress/expected/generated_virtual.out index 171d68ba2e2..03698488907 100644 --- a/src/test/regress/expected/generated_virtual.out +++ b/src/test/regress/expected/generated_virtual.out @@ -700,6 +700,48 @@ ERROR: null value in column "b" of relation "gtest21b" violates not-null constr DETAIL: Failing row contains (null, virtual). ALTER TABLE gtest21b ALTER COLUMN b DROP NOT NULL; INSERT INTO gtest21b (a) VALUES (0); -- ok now +-- virtual generated columns are not physically stored, even when not null +CREATE TABLE gtest21c (a int NOT NULL, b int GENERATED ALWAYS AS (a * 2) VIRTUAL NOT NULL, c int NOT NULL); +INSERT INTO gtest21c (a, c) VALUES (10, 42); +SELECT a, b, c FROM gtest21c; + a | b | c +----+----+---- + 10 | 20 | 42 +(1 row) + +DROP TABLE gtest21c; +-- try adding a virtual generated column to an existing table with tuples, +-- then try adding an atthasmissing column before adding a normal nullable +-- column. +CREATE TABLE gtest21d (a int NOT NULL); +INSERT INTO gtest21d (a) VALUES(10); +ALTER TABLE gtest21d ADD COLUMN b INT GENERATED ALWAYS AS (a * 10) VIRTUAL NOT NULL; +SELECT * FROM gtest21d ORDER BY a; + a | b +----+----- + 10 | 100 +(1 row) + +INSERT INTO gtest21d (a) VALUES(20); +ALTER TABLE gtest21d ADD COLUMN c INT NOT NULL DEFAULT 1234; +SELECT * FROM gtest21d ORDER BY a; + a | b | c +----+-----+------ + 10 | 100 | 1234 + 20 | 200 | 1234 +(2 rows) + +ALTER TABLE gtest21d ADD COLUMN d INT; +INSERT INTO gtest21d (a, c, d) VALUES(30, 12345, 100); +SELECT * FROM gtest21d ORDER BY a; + a | b | c | d +----+-----+-------+----- + 10 | 100 | 1234 | + 20 | 200 | 1234 | + 30 | 300 | 12345 | 100 +(3 rows) + +DROP TABLE gtest21d; -- not-null constraint with partitioned table CREATE TABLE gtestnn_parent ( f1 int, diff --git a/src/test/regress/expected/gist.out b/src/test/regress/expected/gist.out index c75bbb23b6e..ae5b522b3c6 100644 --- a/src/test/regress/expected/gist.out +++ b/src/test/regress/expected/gist.out @@ -387,6 +387,42 @@ select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; ERROR: lossy distance functions are not supported in index-only scans +-- Test that an index-only scan deforms the tuple it reconstructs with the +-- descriptor the AM formed it with, not the scan slot's descriptor. +create temp table gist_ios_tupdesc (a inet, r numrange); +-- range_ops forms its tuples using the opclass input type, the polymorphic +-- anyrange (alignment 'd'), while the scan slot uses the actual range type +-- numrange (alignment 'i'). A buggy implementation will incorrectly access +-- the r/numrange column at the wrong offset. +-- +-- The range bounds are made long so the value needs a four-byte varlena +-- header; shorter values get a one-byte header and are stored without +-- alignment padding, which would mask the problem. +insert into gist_ios_tupdesc +values ( + '::1', -- shifts "r" datum value to differing offset + numrange(repeat('7', 200)::numeric, repeat('8', 200)::numeric)); +create index on gist_ios_tupdesc using gist (a inet_ops, r); +vacuum analyze gist_ios_tupdesc; +explain (costs off) +select lower(r) = repeat('7', 200)::numeric as lower_ok, + upper(r) = repeat('8', 200)::numeric as upper_ok + from gist_ios_tupdesc where r && numrange(null, null); + QUERY PLAN +-------------------------------------------------------------------- + Index Only Scan using gist_ios_tupdesc_a_r_idx on gist_ios_tupdesc + Index Cond: (r && '(,)'::numrange) +(2 rows) + +select lower(r) = repeat('7', 200)::numeric as lower_ok, + upper(r) = repeat('8', 200)::numeric as upper_ok + from gist_ios_tupdesc where r && numrange(null, null); + lower_ok | upper_ok +----------+---------- + t | t +(1 row) + +drop table gist_ios_tupdesc; -- Force an index build using buffering. create index gist_tbl_box_index_forcing_buffering on gist_tbl using gist (p) with (buffering=on, fillfactor=50); diff --git a/src/test/regress/expected/hash_part.out b/src/test/regress/expected/hash_part.out index cb39161f867..44b6e461ffe 100644 --- a/src/test/regress/expected/hash_part.out +++ b/src/test/regress/expected/hash_part.out @@ -40,6 +40,13 @@ SELECT satisfies_hash_partition('mchash'::regclass, 4, NULL, NULL); f (1 row) +-- variadic null +SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, VARIADIC NULL::int[]); + satisfies_hash_partition +-------------------------- + f +(1 row) + -- too many arguments SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, NULL::int, NULL::text, NULL::json); ERROR: number of partitioning columns (2) does not match number of partition keys provided (3) diff --git a/src/test/regress/expected/indexing.out b/src/test/regress/expected/indexing.out index b8d7d3047be..3e1bbfb74af 100644 --- a/src/test/regress/expected/indexing.out +++ b/src/test/regress/expected/indexing.out @@ -1774,3 +1774,18 @@ reindex index test_pg_index_toast_index; drop index test_pg_index_toast_index; drop function test_pg_index_toast_func; drop table test_pg_index_toast_table; +-- Test of a partitioned index attach, when there are exclusion constraints. +create table idx_excl_part (a int4range, b int4range) partition by list (a); +create table idx_excl_part_1 (a int4range, b int4range); +alter table only idx_excl_part attach partition idx_excl_part_1 for values in ('[0,1)'::int4range); +alter table only idx_excl_part add constraint idxpart_id_data_excl exclude using gist (a with =, b with &&); +alter table idx_excl_part_1 add constraint idxpart_1_id_data_excl exclude using gist (a with &&, b with &&); +-- This should be disallowed, because the constraints don't match. +alter index idxpart_id_data_excl attach partition idxpart_1_id_data_excl; +ERROR: cannot attach index "idxpart_1_id_data_excl" as a partition of index "idxpart_id_data_excl" +DETAIL: The index definitions do not match. +-- but if we recreate the constraint differently, it's allowed: +alter table idx_excl_part_1 drop constraint idxpart_1_id_data_excl; +alter table idx_excl_part_1 add constraint idxpart_1_id_data_excl exclude using gist (a with =, b with &&); +alter index idxpart_id_data_excl attach partition idxpart_1_id_data_excl; +-- leave these tables around, for pg_upgrade testing diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index 02935b0af6d..9fc12fb0cb0 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -4133,6 +4133,33 @@ select * from 1 | 2 | 2 (1 row) +-- Also, we mustn't remove an RTE_RESULT that is the only baserel where a PHV +-- can be evaluated, even when the PHV's phrels also mention an outer join. +explain (verbose, costs off) +select * from (values (1),(2)) v(x) + left join (select q from (select 7 as q from (select where false) ss1) ss2 + left join (select 8 as z) ss3 on true) ss4 on true; + QUERY PLAN +------------------------------------ + Nested Loop Left Join + Output: "*VALUES*".column1, (7) + Join Filter: false + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 + -> Result + Output: 7 + One-Time Filter: false +(8 rows) + +select * from (values (1),(2)) v(x) + left join (select q from (select 7 as q from (select where false) ss1) ss2 + left join (select 8 as z) ss3 on true) ss4 on true; + x | q +---+--- + 1 | + 2 | +(2 rows) + -- This example demonstrates the folly of our old "have_dangerous_phv" logic begin; set local from_collapse_limit to 2; @@ -6374,6 +6401,37 @@ select a.* from a left join parted_b pb on a.b_id = pb.id; Seq Scan on a (1 row) +-- test that clauses that still embed PHVs are not referencing the removed +-- relation when rebuilt for a partition of the kept relation +explain (costs off) +select 1 from (select t1.id from parted_b t1 left join parted_b t2 on t1.id = t2.id) s +where s.id = 1 group by (); + QUERY PLAN +------------ + Result +(1 row) + +explain (costs off) +select 1 from parted_b t1 + join (select t2.id from parted_b t2 left join parted_b t3 on t2.id = t3.id) s + on t1.id = s.id +group by (); + QUERY PLAN +------------ + Result +(1 row) + +-- likewise for a PHV embedded in an OR join clause +explain (costs off) +select 1 from parted_b t1 + join (select t2.id from parted_b t2 left join parted_b t3 on t2.id = t3.id) s + on (t1.id = 1 and s.id = 2) or (t1.id = 3 and s.id = 4) +group by (); + QUERY PLAN +------------ + Result +(1 row) + rollback; create temp table parent (k int primary key, pd int); create temp table child (k int unique, cd int); diff --git a/src/test/regress/expected/jsonb_jsonpath.out b/src/test/regress/expected/jsonb_jsonpath.out index 4bcd4e91a29..f3b605d5926 100644 --- a/src/test/regress/expected/jsonb_jsonpath.out +++ b/src/test/regress/expected/jsonb_jsonpath.out @@ -2336,6 +2336,38 @@ select jsonb_path_query('12.3', '$.decimal(12345678901,1)'); ERROR: precision of jsonpath item method .decimal() is out of range for type integer select jsonb_path_query('12.3', '$.decimal(1,12345678901)'); ERROR: scale of jsonpath item method .decimal() is out of range for type integer +-- An out-of-range precision or scale does not fail in silent mode. +select jsonb_path_query('12345.678', '$.decimal(0, 6)', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('12345.678', '$.decimal(1001, 6)', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1234.5678', '$.decimal(-6, +2)', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1234.5678', '$.decimal(6, -1001)', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1234.5678', '$.decimal(6, 1001)', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select '1234.5678'::jsonb @? '$.decimal(0)'; + ?column? +---------- + +(1 row) + -- Test .integer() select jsonb_path_query('null', '$.integer()'); ERROR: jsonpath item method .integer() can only be applied to a string or numeric value diff --git a/src/test/regress/expected/money.out b/src/test/regress/expected/money.out index cc2ff4d96e8..e7fdb9b7d0d 100644 --- a/src/test/regress/expected/money.out +++ b/src/test/regress/expected/money.out @@ -539,6 +539,14 @@ SELECT '-1'::money / 1.175494e-38::float4; ERROR: money out of range SELECT '92233720368547758.07'::money * 2::int4; ERROR: money out of range +SELECT '-92233720368547758.08'::money * -1::int8; +ERROR: money out of range +SELECT '-92233720368547758.08'::money / -1::int8; +ERROR: money out of range +SELECT '-92233720368547758.08'::money / -1::int4; +ERROR: money out of range +SELECT '-92233720368547758.08'::money / -1::int2; +ERROR: money out of range SELECT '1'::money / 0::int2; ERROR: division by zero SELECT '42'::money * 'inf'::float8; diff --git a/src/test/regress/expected/object_address.out b/src/test/regress/expected/object_address.out index fc42d418bf1..1863183dab1 100644 --- a/src/test/regress/expected/object_address.out +++ b/src/test/regress/expected/object_address.out @@ -43,6 +43,10 @@ ALTER DEFAULT PRIVILEGES FOR ROLE regress_addr_user REVOKE DELETE ON TABLES FROM CREATE TRANSFORM FOR int LANGUAGE SQL ( FROM SQL WITH FUNCTION prsd_lextype(internal), TO SQL WITH FUNCTION int4recv(internal)); +-- make a function that uses it too, mainly to exercise pg_dump +CREATE FUNCTION public.sql_func_with_transform(int) RETURNS int LANGUAGE sql +AS 'select $1 + 1' +TRANSFORM FOR TYPE int; -- suppress warning that depends on wal_level SET client_min_messages = 'ERROR'; CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out index 7aa3e5cbaf9..a107281daf7 100644 --- a/src/test/regress/expected/partition_prune.out +++ b/src/test/regress/expected/partition_prune.out @@ -689,6 +689,52 @@ explain (costs off) select * from rlp where (a = 1 and a = 3) or (a > 1 and a = Filter: (((a = 1) AND (a = 3)) OR ((a > 1) AND (a = 15))) (11 rows) +-- Test cases for range partitioned tables with IN clauses. +create table rangepart (a int) partition by range (a); +create table rangepart1 partition of rangepart for values from (0) to (10); +create table rangepart2 partition of rangepart for values from (10) to (20); +create table rangepart_def partition of rangepart default; +-- Ensure we scan all apart from the default partition +explain (costs off) select * from rangepart where a in(5,15); + QUERY PLAN +------------------------------------------------- + Append + -> Seq Scan on rangepart1 rangepart_1 + Filter: (a = ANY ('{5,15}'::integer[])) + -> Seq Scan on rangepart2 rangepart_2 + Filter: (a = ANY ('{5,15}'::integer[])) +(5 rows) + +-- Ensure we scan only the default +explain (costs off) select * from rangepart where a in(20,21); + QUERY PLAN +-------------------------------------------- + Seq Scan on rangepart_def rangepart + Filter: (a = ANY ('{20,21}'::integer[])) +(2 rows) + +-- Ensure we scan only the default +explain (costs off) select * from rangepart where a in(-1,20); + QUERY PLAN +-------------------------------------------- + Seq Scan on rangepart_def rangepart + Filter: (a = ANY ('{-1,20}'::integer[])) +(2 rows) + +-- Ensure we scan all partitions +explain (costs off) select * from rangepart where a is not null and a in(-1,5,15,20); + QUERY PLAN +----------------------------------------------------------------------------- + Append + -> Seq Scan on rangepart1 rangepart_1 + Filter: ((a IS NOT NULL) AND (a = ANY ('{-1,5,15,20}'::integer[]))) + -> Seq Scan on rangepart2 rangepart_2 + Filter: ((a IS NOT NULL) AND (a = ANY ('{-1,5,15,20}'::integer[]))) + -> Seq Scan on rangepart_def rangepart_3 + Filter: ((a IS NOT NULL) AND (a = ANY ('{-1,5,15,20}'::integer[]))) +(7 rows) + +drop table rangepart; -- multi-column keys create table mc3p (a int, b int, c int) partition by range (a, abs(b), c); create table mc3p_default partition of mc3p default; diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 823b824c203..b85cb2acdd6 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -1374,16 +1374,23 @@ CREATE CAST (priv_testdomain1 AS priv_testdomain3a) WITH FUNCTION castfunc(int); ERROR: permission denied for type priv_testdomain1 DROP FUNCTION castfunc(int) CASCADE; DROP DOMAIN priv_testdomain3a; +CREATE DOMAIN priv_testdomain4a AS int CHECK (VALUE > ('(0,1)'::priv_testtype1).a); +ERROR: permission denied for type priv_testtype1 CREATE FUNCTION priv_testfunc5a(a priv_testdomain1) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; ERROR: permission denied for type priv_testdomain1 CREATE FUNCTION priv_testfunc6a(b int) RETURNS priv_testdomain1 LANGUAGE SQL AS $$ SELECT $1::priv_testdomain1 $$; ERROR: permission denied for type priv_testdomain1 +CREATE FUNCTION priv_testfunc7a(a int DEFAULT ('(0,1)'::priv_testtype1).a) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; +ERROR: permission denied for type priv_testtype1 CREATE OPERATOR !+! (PROCEDURE = int4pl, LEFTARG = priv_testdomain1, RIGHTARG = priv_testdomain1); ERROR: permission denied for type priv_testdomain1 CREATE TABLE test5a (a int, b priv_testdomain1); ERROR: permission denied for type priv_testdomain1 CREATE TABLE test6a OF priv_testtype1; ERROR: permission denied for type priv_testtype1 +CREATE TABLE test6a2 (a int, b text); +ALTER TABLE test6a2 OF priv_testtype1; +ERROR: permission denied for type priv_testtype1 CREATE TABLE test10a (a int[], b priv_testtype1[]); ERROR: permission denied for type priv_testtype1 CREATE TABLE test9a (a int, b int); @@ -1391,6 +1398,8 @@ ALTER TABLE test9a ADD COLUMN c priv_testdomain1; ERROR: permission denied for type priv_testdomain1 ALTER TABLE test9a ALTER COLUMN b TYPE priv_testdomain1; ERROR: permission denied for type priv_testdomain1 +CREATE INDEX ON test9a ((a::priv_testdomain1)); +ERROR: permission denied for type public.priv_testdomain1 CREATE TYPE test7a AS (a int, b priv_testdomain1); ERROR: permission denied for type priv_testdomain1 CREATE TYPE test8a AS (a int, b int); @@ -1398,10 +1407,22 @@ ALTER TYPE test8a ADD ATTRIBUTE c priv_testdomain1; ERROR: permission denied for type priv_testdomain1 ALTER TYPE test8a ALTER ATTRIBUTE b TYPE priv_testdomain1; ERROR: permission denied for type priv_testdomain1 +CREATE DOMAIN priv_testdomain5a AS test8a CHECK ((VALUE).a > 0 AND ('(0,1)'::priv_testtype1).a >= 0); +ERROR: permission denied for type priv_testtype1 CREATE TABLE test11a AS (SELECT 1::priv_testdomain1 AS a); ERROR: permission denied for type priv_testdomain1 +CREATE VIEW test16a AS SELECT ('(0,1)'::priv_testtype1).a; +ERROR: permission denied for type priv_testtype1 +CREATE TABLE test17a (a int) PARTITION BY RANGE ((a + ('(0,1)'::priv_testtype1).a)); +ERROR: permission denied for type priv_testtype1 +CREATE POLICY priv_testpolicy1a ON test9a USING (('(0,1)'::priv_testtype1).a > 0); +ERROR: permission denied for type priv_testtype1 REVOKE ALL ON TYPE priv_testtype1 FROM PUBLIC; ERROR: permission denied for type priv_testtype1 +CREATE TABLE test12 (c int DEFAULT 0 CHECK (c > 0 AND '(0,1)'::priv_testtype1 IS NOT NULL)); +ERROR: permission denied for type priv_testtype1 +CREATE TABLE test13 (c int DEFAULT ('(0,1)'::priv_testtype1).a); +ERROR: permission denied for type priv_testtype1 SET SESSION AUTHORIZATION regress_priv_user2; -- commands that should succeed CREATE AGGREGATE priv_testagg1b(priv_testdomain1) (sfunc = int4_sum, stype = bigint); @@ -1410,30 +1431,57 @@ CREATE DOMAIN priv_testdomain3b AS int; CREATE FUNCTION castfunc(int) RETURNS priv_testdomain3b AS $$ SELECT $1::priv_testdomain3b $$ LANGUAGE SQL; CREATE CAST (priv_testdomain1 AS priv_testdomain3b) WITH FUNCTION castfunc(int); WARNING: cast will be ignored because the source data type is a domain +CREATE DOMAIN priv_testdomain4b AS int CHECK (VALUE > ('(0,1)'::priv_testtype1).a); CREATE FUNCTION priv_testfunc5b(a priv_testdomain1) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; CREATE FUNCTION priv_testfunc6b(b int) RETURNS priv_testdomain1 LANGUAGE SQL AS $$ SELECT $1::priv_testdomain1 $$; +CREATE FUNCTION priv_testfunc7b(a int DEFAULT ('(0,1)'::priv_testtype1).a) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; CREATE OPERATOR !! (PROCEDURE = priv_testfunc5b, RIGHTARG = priv_testdomain1); CREATE TABLE test5b (a int, b priv_testdomain1); CREATE TABLE test6b OF priv_testtype1; +CREATE TABLE test6b2 (a int, b text); +ALTER TABLE test6b2 OF priv_testtype1; CREATE TABLE test10b (a int[], b priv_testtype1[]); CREATE TABLE test9b (a int, b int); ALTER TABLE test9b ADD COLUMN c priv_testdomain1; ALTER TABLE test9b ALTER COLUMN b TYPE priv_testdomain1; +CREATE INDEX ON test9b ((a::priv_testdomain1)); CREATE TYPE test7b AS (a int, b priv_testdomain1); CREATE TYPE test8b AS (a int, b int); ALTER TYPE test8b ADD ATTRIBUTE c priv_testdomain1; ALTER TYPE test8b ALTER ATTRIBUTE b TYPE priv_testdomain1; +CREATE DOMAIN priv_testdomain5b AS test8b CHECK ((VALUE).a > 0 AND ('(0,1)'::priv_testtype1).a >= 0); CREATE TABLE test11b AS (SELECT 1::priv_testdomain1 AS a); +CREATE VIEW test16b AS SELECT ('(0,1)'::priv_testtype1).a; +CREATE TABLE test17b (a int) PARTITION BY RANGE ((a + ('(0,1)'::priv_testtype1).a)); +CREATE POLICY priv_testpolicy1b ON test9b USING (('(0,1)'::priv_testtype1).a > 0); REVOKE ALL ON TYPE priv_testtype1 FROM PUBLIC; WARNING: no privileges could be revoked for "priv_testtype1" +CREATE TABLE test12 (c int DEFAULT 0 CHECK (c > 0 AND '(0,1)'::priv_testtype1 IS NOT NULL)); +CREATE TABLE test13 (c int DEFAULT ('(0,1)'::priv_testtype1).a); +-- new stored expressions require USAGE on types, rebuilds do not +\c - +REVOKE USAGE ON TYPE priv_testtype1 FROM regress_priv_user2; +SET SESSION AUTHORIZATION regress_priv_user2; +ALTER TABLE test12 ALTER COLUMN c TYPE bigint; +ALTER TYPE test8b ALTER ATTRIBUTE a TYPE bigint CASCADE; +ALTER TABLE test12 ALTER COLUMN c SET DEFAULT ('(0,1)'::priv_testtype1).a; +ERROR: permission denied for type priv_testtype1 +CREATE TABLE test14 (LIKE test12 INCLUDING CONSTRAINTS); +ERROR: permission denied for type priv_testtype1 +CREATE TABLE test15 (LIKE test13 INCLUDING DEFAULTS); +ERROR: permission denied for type priv_testtype1 \c - DROP AGGREGATE priv_testagg1b(priv_testdomain1); DROP DOMAIN priv_testdomain2b; +DROP DOMAIN priv_testdomain4b; +DROP DOMAIN priv_testdomain5b; DROP OPERATOR !! (NONE, priv_testdomain1); DROP FUNCTION priv_testfunc5b(a priv_testdomain1); DROP FUNCTION priv_testfunc6b(b int); +DROP FUNCTION priv_testfunc7b(a int); DROP TABLE test5b; DROP TABLE test6b; +DROP TABLE test6b2; DROP TABLE test9b; DROP TABLE test10b; DROP TYPE test7b; @@ -1441,7 +1489,11 @@ DROP TYPE test8b; DROP CAST (priv_testdomain1 AS priv_testdomain3b); DROP FUNCTION castfunc(int) CASCADE; DROP DOMAIN priv_testdomain3b; +DROP VIEW test16b; DROP TABLE test11b; +DROP TABLE test17b; +DROP TABLE test12; +DROP TABLE test13; DROP TYPE priv_testtype1; -- ok DROP DOMAIN priv_testdomain1; -- ok -- truncate diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index a79325e8a2f..506f1ed0a1f 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -2822,6 +2822,32 @@ execute q; +------------------+-------------------+ deallocate q; +-- expanded output with short-width columns +\pset border 2 +\pset expanded on +create table psql_short_tab(a int, b int); +insert into psql_short_tab values(10,20),(30,40); +\pset format aligned +select * from psql_short_tab; ++-[ RECORD 1 ]-+ +| a | 10 | +| b | 20 | ++-[ RECORD 2 ]-+ +| a | 30 | +| b | 40 | ++---+----------+ + +\pset format wrapped +select * from psql_short_tab; ++-[ RECORD 1 ]-+ +| a | 10 | +| b | 20 | ++-[ RECORD 2 ]-+ +| a | 30 | +| b | 40 | ++---+----------+ + +drop table psql_short_tab; \pset linestyle ascii \pset border 1 -- support table for output-format tests (useful to create a footer) @@ -4731,6 +4757,22 @@ invalid command \lo \echo 'should print #8-1' should print #8-1 \endif +-- test that begin/end matching ignores to-be-ignored text +create function silly_function(int) returns int +begin atomic select $1; +\if false +end +\endif +; +end; +\sf silly_function(int) +CREATE OR REPLACE FUNCTION public.silly_function(integer) + RETURNS integer + LANGUAGE sql +BEGIN ATOMIC + SELECT $1; +END +drop function silly_function(int); -- :{?...} defined variable test \set i 1 \if :{?i} @@ -5875,6 +5917,11 @@ SELECT line FROM reload_output ORDER BY lineno; (2 rows) DROP TABLE reload_output; +-- \copy must skip in-line data, even if the issued COPY command fails. +\copy no_such_table from stdin +ERROR: relation "no_such_table" does not exist +\echo this should get output +this should get output -- -- AUTOCOMMIT and combined queries -- diff --git a/src/test/regress/expected/psql_pipeline.out b/src/test/regress/expected/psql_pipeline.out index a0816fb10b6..a931d63cafe 100644 --- a/src/test/regress/expected/psql_pipeline.out +++ b/src/test/regress/expected/psql_pipeline.out @@ -764,5 +764,129 @@ VACUUM psql_pipeline \bind \sendpipeline 1 (1 row) +-- Deferred constraint violation at commit time in a pipeline. +CREATE TABLE psql_pipeline_defer (a INTEGER PRIMARY KEY DEFERRABLE INITIALLY DEFERRED); +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) RETURNING * \bind 1 \sendpipeline +\endpipeline + a +--- + 1 + 1 +(2 rows) + +ERROR: duplicate key value violates unique constraint "psql_pipeline_defer_pkey" +DETAIL: Key (a)=(1) already exists. +-- Same with \syncpipeline and commands after the failing sync. +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\syncpipeline +SELECT $1 \bind 'after_sync_1' \sendpipeline +\endpipeline +ERROR: duplicate key value violates unique constraint "psql_pipeline_defer_pkey" +DETAIL: Key (a)=(1) already exists. + ?column? +-------------- + after_sync_1 +(1 row) + +-- More patterns with more \syncpipeline, more commands and \getresults +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\syncpipeline +SELECT $1 \bind 'after_sync_1' \sendpipeline +\getresults +ERROR: duplicate key value violates unique constraint "psql_pipeline_defer_pkey" +DETAIL: Key (a)=(1) already exists. +SELECT $1 \bind 'after_sync_2' \sendpipeline +\endpipeline + ?column? +-------------- + after_sync_1 +(1 row) + + ?column? +-------------- + after_sync_2 +(1 row) + +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\syncpipeline +\getresults +ERROR: duplicate key value violates unique constraint "psql_pipeline_defer_pkey" +DETAIL: Key (a)=(1) already exists. +SELECT $1 \bind 'after_sync_1' \sendpipeline +\getresults +SELECT $1 \bind 'after_sync_2' \sendpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +SELECT $1 \bind 'after_sync_3' \sendpipeline +SELECT $1 \bind 'after_sync_4' \sendpipeline +SELECT $1 \bind 'after_sync_5' \sendpipeline +\endpipeline + ?column? +-------------- + after_sync_1 +(1 row) + + ?column? +-------------- + after_sync_2 +(1 row) + + ?column? +-------------- + after_sync_3 +(1 row) + + ?column? +-------------- + after_sync_4 +(1 row) + + ?column? +-------------- + after_sync_5 +(1 row) + +ERROR: duplicate key value violates unique constraint "psql_pipeline_defer_pkey" +DETAIL: Key (a)=(1) already exists. +-- Deferred error combined with a regular command error after the sync. +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\syncpipeline +SELECT $1 \bind \sendpipeline +SELECT $1 \bind 'after_error' \sendpipeline +\endpipeline +ERROR: duplicate key value violates unique constraint "psql_pipeline_defer_pkey" +DETAIL: Key (a)=(1) already exists. +ERROR: bind message supplies 0 parameters, but prepared statement "" requires 1 +-- Empty sync segment followed by a deferred error. +\startpipeline +\syncpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\endpipeline +ERROR: duplicate key value violates unique constraint "psql_pipeline_defer_pkey" +DETAIL: Key (a)=(1) already exists. +-- Deferred error with \getresults reading results one at a time. +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +SELECT $1 \bind 'partial' \sendpipeline +\syncpipeline +\getresults 1 +\getresults 1 + ?column? +---------- + partial +(1 row) + +\getresults +ERROR: duplicate key value violates unique constraint "psql_pipeline_defer_pkey" +DETAIL: Key (a)=(1) already exists. +\endpipeline +DROP TABLE psql_pipeline_defer; -- Clean up DROP TABLE psql_pipeline; diff --git a/src/test/regress/expected/rangetypes.out b/src/test/regress/expected/rangetypes.out index a7cc220bf0d..435c7306484 100644 --- a/src/test/regress/expected/rangetypes.out +++ b/src/test/regress/expected/rangetypes.out @@ -1547,6 +1547,21 @@ ERROR: range lower bound must be less than or equal to range upper bound LINE 1: select '[2010-01-01 01:00:00 -08, 2010-01-01 02:00:00 -05)':... ^ set timezone to default; +-- CREATE TYPE AS RANGE checks for USAGE on subtype +CREATE ROLE regress_subtype; +CREATE TYPE mytype AS (a INT, b INT); +REVOKE USAGE ON TYPE mytype FROM PUBLIC; +SET ROLE regress_subtype; +CREATE TYPE myrange AS RANGE (subtype = mytype); +ERROR: permission denied for type mytype +RESET ROLE; +GRANT USAGE ON TYPE mytype TO regress_subtype; +SET ROLE regress_subtype; +CREATE TYPE myrange AS RANGE (subtype = mytype); +RESET ROLE; +DROP TYPE mytype CASCADE; +NOTICE: drop cascades to type myrange +DROP ROLE regress_subtype; -- -- Test user-defined range of floats -- (type float8range was already made in test_setup.sql) diff --git a/src/test/regress/expected/returning.out b/src/test/regress/expected/returning.out index 341b689f766..d5920fcc652 100644 --- a/src/test/regress/expected/returning.out +++ b/src/test/regress/expected/returning.out @@ -540,6 +540,31 @@ DELETE FROM foo WHERE f1 = 5 foo | (0,7) | 5 | ok | 42 | 100 | | | | | | | 5 | ok | 42 | 100 (1 row) +-- Parenthesized OLD and NEW +INSERT INTO foo VALUES (6, 'paren-test', 60, 600) + RETURNING old, (old).f4, (old).*, + new, (new).f4, (new).*; + old | f4 | f1 | f2 | f3 | f4 | new | f4 | f1 | f2 | f3 | f4 +-----+----+----+----+----+----+-----------------------+-----+----+------------+----+----- + | | | | | | (6,paren-test,60,600) | 600 | 6 | paren-test | 60 | 600 +(1 row) + +UPDATE foo SET f4 = 700 WHERE f1 = 6 + RETURNING old, (old).f4, (old).*, + new, (new).f4, (new).*; + old | f4 | f1 | f2 | f3 | f4 | new | f4 | f1 | f2 | f3 | f4 +-----------------------+-----+----+------------+----+-----+-----------------------+-----+----+------------+----+----- + (6,paren-test,60,600) | 600 | 6 | paren-test | 60 | 600 | (6,paren-test,60,700) | 700 | 6 | paren-test | 60 | 700 +(1 row) + +DELETE FROM foo WHERE f1 = 6 + RETURNING old, (old).f4, (old).*, + new, (new).f4, (new).*; + old | f4 | f1 | f2 | f3 | f4 | new | f4 | f1 | f2 | f3 | f4 +-----------------------+-----+----+------------+----+-----+-----+----+----+----+----+---- + (6,paren-test,60,700) | 700 | 6 | paren-test | 60 | 700 | | | | | | +(1 row) + -- RETURNING OLD and NEW from subquery EXPLAIN (verbose, costs off) INSERT INTO foo VALUES (5, 'subquery test') diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 6cf828ca8d0..23bcea5690c 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -3250,6 +3250,8 @@ ALTER RULE NewInsertRule ON rule_v1 RENAME TO "_RETURN"; -- already exists ERROR: rule "_RETURN" for relation "rule_v1" already exists ALTER RULE "_RETURN" ON rule_v1 RENAME TO abc; -- ON SELECT rule cannot be renamed ERROR: renaming an ON SELECT rule is not allowed +ALTER RULE rtest_t4_ins1 ON rtest_t4 RENAME TO "_RETURN"; -- also disallowed +ERROR: non-view rule for "rtest_t4" must not be named "_RETURN" DROP VIEW rule_v1; DROP TABLE rule_t1; -- diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out index 625acf3019a..0d2fedb7d83 100644 --- a/src/test/regress/expected/sqljson.out +++ b/src/test/regress/expected/sqljson.out @@ -1148,6 +1148,44 @@ SELECT NULL::bytea IS JSON; SELECT NULL::int IS JSON; ERROR: cannot use type integer in IS JSON predicate +-- A user-defined string-category type with no implicit cast to text must +-- produce a clean error rather than crash for IS JSON / JSON() input +-- (per bug #19491). +CREATE FUNCTION sqljson_mystr_in(cstring) RETURNS sqljson_mystr + AS 'textin' LANGUAGE internal IMMUTABLE STRICT; +NOTICE: type "sqljson_mystr" is not yet defined +DETAIL: Creating a shell type definition. +CREATE FUNCTION sqljson_mystr_out(sqljson_mystr) RETURNS cstring + AS 'textout' LANGUAGE internal IMMUTABLE STRICT; +NOTICE: argument type sqljson_mystr is only a shell +LINE 1: CREATE FUNCTION sqljson_mystr_out(sqljson_mystr) RETURNS cst... + ^ +CREATE TYPE sqljson_mystr ( + INPUT = sqljson_mystr_in, + OUTPUT = sqljson_mystr_out, + LIKE = text, + CATEGORY = 'S' +); +SELECT '{"a":1}'::sqljson_mystr IS JSON; -- error +ERROR: cannot cast type sqljson_mystr to text +LINE 1: SELECT '{"a":1}'::sqljson_mystr IS JSON; + ^ +SELECT JSON('{"a":1}'::sqljson_mystr WITH UNIQUE KEYS); -- error +ERROR: cannot cast type sqljson_mystr to text +LINE 1: SELECT JSON('{"a":1}'::sqljson_mystr WITH UNIQUE KEYS); + ^ +-- An implicit cast to text lets the same query work normally. +CREATE CAST (sqljson_mystr AS text) WITHOUT FUNCTION AS IMPLICIT; +SELECT '{"a":1}'::sqljson_mystr IS JSON; + ?column? +---------- + t +(1 row) + +\set VERBOSITY terse +DROP TYPE sqljson_mystr CASCADE; +NOTICE: drop cascades to 3 other objects +\set VERBOSITY default SELECT '' IS JSON; ?column? ---------- @@ -1373,3 +1411,104 @@ SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': 1 RETURNING text) FORMAT JSON); (1 row) DROP FUNCTION volatile_one, stable_one; +-- Test deparsing of JSON aggregates that are computed below a WindowAgg +-- node. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT i % 2 AS g, + JSON_ARRAYAGG(i ORDER BY i RETURNING jsonb) AS ja, + JSON_ARRAYAGG(i ORDER BY i RETURNING text) AS ja_text, + JSON_ARRAYAGG(i ORDER BY i NULL ON NULL RETURNING jsonb) AS ja_null, + JSON_OBJECTAGG(i: i ABSENT ON NULL RETURNING jsonb) AS jo_absent, + JSON_OBJECTAGG(i: i WITH UNIQUE RETURNING jsonb) AS jo_unique, + row_number() OVER (ORDER BY i % 2) AS rn +FROM generate_series(1, 3) i +GROUP BY i % 2; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + WindowAgg + Output: ((i % 2)), JSON_ARRAYAGG(i ORDER BY i RETURNING jsonb), JSON_ARRAYAGG(i ORDER BY i RETURNING text), JSON_ARRAYAGG(i ORDER BY i NULL ON NULL RETURNING jsonb), JSON_OBJECTAGG(i : i ABSENT ON NULL RETURNING jsonb), JSON_OBJECTAGG(i : i WITH UNIQUE KEYS RETURNING jsonb), row_number() OVER w1 + Window: w1 AS (ORDER BY ((i.i % 2)) ROWS UNBOUNDED PRECEDING) + -> GroupAggregate + Output: ((i % 2)), jsonb_agg_strict(i ORDER BY i), json_agg_strict(i ORDER BY i), jsonb_agg(i ORDER BY i), jsonb_object_agg_strict(i, i), jsonb_object_agg_unique(i, i) + Group Key: ((i.i % 2)) + -> Sort + Output: ((i % 2)), i + Sort Key: ((i.i % 2)), i.i + -> Function Scan on pg_catalog.generate_series i + Output: (i % 2), i + Function Call: generate_series(1, 3) +(12 rows) + +SELECT i % 2 AS g, + JSON_ARRAYAGG(i ORDER BY i RETURNING jsonb) AS ja, + JSON_ARRAYAGG(i ORDER BY i RETURNING text) AS ja_text, + JSON_ARRAYAGG(i ORDER BY i NULL ON NULL RETURNING jsonb) AS ja_null, + JSON_OBJECTAGG(i: i ABSENT ON NULL RETURNING jsonb) AS jo_absent, + JSON_OBJECTAGG(i: i WITH UNIQUE RETURNING jsonb) AS jo_unique, + row_number() OVER (ORDER BY i % 2) AS rn +FROM generate_series(1, 3) i +GROUP BY i % 2; + g | ja | ja_text | ja_null | jo_absent | jo_unique | rn +---+--------+---------+---------+------------------+------------------+---- + 0 | [2] | [2] | [2] | {"2": 2} | {"2": 2} | 1 + 1 | [1, 3] | [1, 3] | [1, 3] | {"1": 1, "3": 3} | {"1": 1, "3": 3} | 2 +(2 rows) + +-- The same, but with the JSON aggregate used as a window function that is +-- computed below another WindowAgg node. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAYAGG(i NULL ON NULL RETURNING jsonb) OVER (ORDER BY i DESC) AS ja, + row_number() OVER (ORDER BY i) AS rn +FROM generate_series(1, 3) i; + QUERY PLAN +------------------------------------------------------------------------------------------ + WindowAgg + Output: JSON_ARRAYAGG(i NULL ON NULL RETURNING jsonb) OVER w1, row_number() OVER w2, i + Window: w2 AS (ORDER BY i.i ROWS UNBOUNDED PRECEDING) + -> Sort + Output: i, (jsonb_agg(i) OVER w1) + Sort Key: i.i + -> WindowAgg + Output: i, jsonb_agg(i) OVER w1 + Window: w1 AS (ORDER BY i.i) + -> Sort + Output: i + Sort Key: i.i DESC + -> Function Scan on pg_catalog.generate_series i + Output: i + Function Call: generate_series(1, 3) +(15 rows) + +SELECT JSON_ARRAYAGG(i NULL ON NULL RETURNING jsonb) OVER (ORDER BY i DESC) AS ja, + row_number() OVER (ORDER BY i) AS rn +FROM generate_series(1, 3) i; + ja | rn +-----------+---- + [3, 2, 1] | 1 + [3, 2] | 2 + [3] | 3 +(3 rows) + +-- The same, but with the expression containing the JSON aggregate postponed +-- to above the final sort due to being volatile. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT i % 2 AS g, + JSON_ARRAYAGG(i RETURNING text) || random()::text AS ja +FROM generate_series(1, 3) i +GROUP BY i % 2 +ORDER BY count(*); + QUERY PLAN +---------------------------------------------------------------------------------------- + Result + Output: ((i % 2)), (JSON_ARRAYAGG(i RETURNING text) || (random())::text), (count(*)) + -> Sort + Output: ((i % 2)), (count(*)), (json_agg_strict(i)) + Sort Key: (count(*)) + -> HashAggregate + Output: ((i % 2)), count(*), json_agg_strict(i) + Group Key: (i.i % 2) + -> Function Scan on pg_catalog.generate_series i + Output: (i % 2), i + Function Call: generate_series(1, 3) +(11 rows) + diff --git a/src/test/regress/expected/sqljson_jsontable.out b/src/test/regress/expected/sqljson_jsontable.out index 458c5aaa5b0..4d500e7de2d 100644 --- a/src/test/regress/expected/sqljson_jsontable.out +++ b/src/test/regress/expected/sqljson_jsontable.out @@ -250,6 +250,22 @@ SELECT * FROM JSON_TABLE(jsonb '{"d1": "foo"}', '$' {1} (1 row) +-- A DEFAULT expression whose base type matches the column type must still be +-- coerced to the column's typmod. +SELECT * FROM JSON_TABLE(jsonb '{}', '$' + COLUMNS (c numeric(4,1) PATH '$.x' DEFAULT 99999.999 ON EMPTY)); +ERROR: numeric field overflow +DETAIL: A field with precision 4, scale 1 must round to an absolute value less than 10^3. +SELECT * FROM JSON_TABLE(jsonb '{}', '$' + COLUMNS (c bit(3) PATH '$.x' DEFAULT b'10101' ON EMPTY)); +ERROR: bit string length 5 does not match type bit(3) +SELECT * FROM JSON_TABLE(jsonb '{}', '$' + COLUMNS (c numeric(4,1) PATH '$.x' DEFAULT abs(NULL::numeric) ON EMPTY)); + c +--- + +(1 row) + -- JSON_TABLE: Test backward parsing CREATE VIEW jsonb_table_view2 AS SELECT * FROM diff --git a/src/test/regress/expected/sqljson_queryfuncs.out b/src/test/regress/expected/sqljson_queryfuncs.out index 53145f50f18..822855c4a3c 100644 --- a/src/test/regress/expected/sqljson_queryfuncs.out +++ b/src/test/regress/expected/sqljson_queryfuncs.out @@ -433,6 +433,27 @@ SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int FORMAT JSON); -- RETURNING ERROR: cannot specify FORMAT JSON in RETURNING clause of JSON_VALUE() LINE 1: ...CT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int FORMAT JSO... ^ +-- A DEFAULT expression must be coerced to the RETURNING type's typmod even +-- when its base type already matches, but a matching NULL needs no coercion. +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING numeric(4,1) DEFAULT 99999.999 ON EMPTY); +ERROR: numeric field overflow +DETAIL: A field with precision 4, scale 1 must round to an absolute value less than 10^3. +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING varchar(3) DEFAULT 'toolong'::varchar(10) ON EMPTY); +ERROR: value too long for type character varying(3) +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING numeric(4,1) DEFAULT NULL::numeric ON EMPTY); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING bit(3) DEFAULT b'10101' ON EMPTY); +ERROR: bit string length 5 does not match type bit(3) +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING numeric(4,1) DEFAULT abs(NULL::numeric) ON EMPTY); + json_value +------------ + +(1 row) + -- RETUGNING pseudo-types not allowed SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING record); ERROR: returning pseudo-types is not supported in SQL/JSON functions diff --git a/src/test/regress/expected/stats_ext.out b/src/test/regress/expected/stats_ext.out index c2f2604a52b..c4376120c51 100644 --- a/src/test/regress/expected/stats_ext.out +++ b/src/test/regress/expected/stats_ext.out @@ -55,6 +55,10 @@ ERROR: duplicate expression in statistics definition CREATE STATISTICS tst (unrecognized) ON x, y FROM ext_stats_test; ERROR: unrecognized statistics kind "unrecognized" -- unsupported targets +CREATE STATISTICS tst ON x, y FROM ext_stats_test, ext_stats_test; +ERROR: only a single relation is allowed in CREATE STATISTICS +CREATE STATISTICS tst ON x, y FROM ext_stats_test, (SELECT * FROM ext_stats_test) AS foo; +ERROR: only a single relation is allowed in CREATE STATISTICS CREATE STATISTICS tst ON a FROM (VALUES (x)) AS foo; ERROR: CREATE STATISTICS only supports relation names in the FROM clause CREATE STATISTICS tst ON a FROM foo NATURAL JOIN bar; @@ -3501,6 +3505,31 @@ drop cascades to view tststats.priv_test_view DROP SCHEMA sts_sch1, sts_sch2 CASCADE; NOTICE: drop cascades to table sts_sch1.tbl DROP USER regress_stats_user1; +-- CREATE STATISTICS checks for the owner +CREATE ROLE regress_relowner; +CREATE ROLE regress_stxowner; +CREATE TABLE stats_ext_tbl (a int, b int); +ALTER TABLE stats_ext_tbl OWNER TO regress_relowner; +CREATE STATISTICS tst ON a, b FROM stats_ext_tbl; +ALTER STATISTICS tst OWNER TO regress_stxowner; +SELECT stxowner::regrole FROM pg_statistic_ext WHERE stxname = 'tst'; + stxowner +------------------ + regress_stxowner +(1 row) + +-- re-creating statistics via ALTER TABLE preserve the statistics owner. +ALTER TABLE stats_ext_tbl ALTER COLUMN a TYPE bigint; +SELECT stxowner::regrole FROM pg_statistic_ext WHERE stxname = 'tst'; + stxowner +------------------ + regress_stxowner +(1 row) + +-- Tidy up +DROP TABLE stats_ext_tbl; +DROP ROLE regress_relowner; +DROP ROLE regress_stxowner; CREATE TABLE grouping_unique (x integer); INSERT INTO grouping_unique (x) SELECT gs FROM generate_series(1,1000) AS gs; ANALYZE grouping_unique; diff --git a/src/test/regress/expected/stats_import.out b/src/test/regress/expected/stats_import.out index 2efd422df16..78e5f4563fb 100644 --- a/src/test/regress/expected/stats_import.out +++ b/src/test/regress/expected/stats_import.out @@ -12,6 +12,11 @@ CREATE TABLE stats_import.test( arange int4range, tags text[] ) WITH (autovacuum_enabled = false); +CREATE TABLE stats_import.test_mr( + id INTEGER PRIMARY KEY, + name text, + mrange int4multirange +) WITH (autovacuum_enabled = false); SELECT pg_catalog.pg_restore_relation_stats( 'schemaname', 'stats_import', @@ -241,6 +246,85 @@ WHERE oid = 'stats_import.test'::regclass; 16 | 500 | 4 | 2 (1 row) +-- error: reltuples must be finite (rejected with WARNING, returns false) +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', 'Infinity'::real); +WARNING: argument "reltuples" must be a finite value + pg_restore_relation_stats +--------------------------- + f +(1 row) + +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', '-Infinity'::real); +WARNING: argument "reltuples" must be a finite value + pg_restore_relation_stats +--------------------------- + f +(1 row) + +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', 'NaN'::real); +WARNING: argument "reltuples" must be a finite value + pg_restore_relation_stats +--------------------------- + f +(1 row) + +-- error: reltuples must not be less than -1.0 (rejected with WARNING, returns false) +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', '-5'::real); +WARNING: argument "reltuples" must not be less than -1.0 + pg_restore_relation_stats +--------------------------- + f +(1 row) + +-- reltuples is unchanged (still 500) after the rejected values above +SELECT relpages, reltuples, relallvisible, relallfrozen +FROM pg_class +WHERE oid = 'stats_import.test'::regclass; + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 16 | 500 | 4 | 2 +(1 row) + +-- ok: -1 (the "unknown" sentinel) is still accepted +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', '-1'::real); + pg_restore_relation_stats +--------------------------- + t +(1 row) + +SELECT relpages, reltuples, relallvisible, relallfrozen +FROM pg_class +WHERE oid = 'stats_import.test'::regclass; + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 16 | -1 | 4 | 2 +(1 row) + +-- restore reltuples to 500 for the following tests +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', '500'::real); + pg_restore_relation_stats +--------------------------- + t +(1 row) + -- ok: set just relallvisible, rest stay same SELECT pg_restore_relation_stats( 'schemaname', 'stats_import', @@ -1148,6 +1232,47 @@ AND attname = 'id'; stats_import | test | id | f | 0.36 | 5 | 0.6 | {2,1,3} | {0.3,0.25,0.05} | {1,2,3,4} | | | | | | | (1 row) +-- test for multiranges +INSERT INTO stats_import.test_mr +VALUES + (1, 'red', '{[1,3),[5,9),[20,30)}'::int4multirange), + (2, 'red', '{[11,13),[15,19),[20,30)}'::int4multirange), + (3, 'red', '{[21,23),[25,29),[120,130)}'::int4multirange); +-- warn: reject range values as ordinary multirange statistics +SELECT pg_catalog.pg_restore_attribute_stats( + 'schemaname', 'stats_import', + 'relname', 'test_mr', + 'attname', 'mrange', + 'inherited', false, + 'most_common_vals', ARRAY['[1,3)']::text, + 'most_common_freqs', ARRAY[1.0]::real[] +); +WARNING: malformed multirange literal: "[1,3)" +DETAIL: Missing left brace. + pg_restore_attribute_stats +---------------------------- + f +(1 row) + +-- ensure that we set attribute stats for a multirange +-- MCVs and histograms retain the multirange type. +SELECT pg_catalog.pg_restore_attribute_stats( + 'schemaname', 'stats_import', + 'relname', 'test_mr', + 'attname', 'mrange', + 'inherited', false, + 'most_common_vals', ARRAY['{[1,3),[5,9)}', '{[11,13),[15,19)}']::text, + 'most_common_freqs', ARRAY[0.6, 0.4]::real[], + 'histogram_bounds', ARRAY['{[1,3)}', '{[11,13)}', '{[21,23)}']::text, + 'range_length_histogram', '{19,29,109}'::text, + 'range_empty_frac', '0'::real, + 'range_bounds_histogram', '{"[1,30)","[11,30)","[21,130)"}'::text +); + pg_restore_attribute_stats +---------------------------- + t +(1 row) + -- -- Test the ability to exactly copy data from one table to an identical table, -- correctly reconstructing the stakind order as well as the staopN and @@ -1424,9 +1549,10 @@ AND attname = 'i'; DROP TABLE stats_temp; DROP SCHEMA stats_import CASCADE; -NOTICE: drop cascades to 6 other objects +NOTICE: drop cascades to 7 other objects DETAIL: drop cascades to type stats_import.complex_type drop cascades to table stats_import.test +drop cascades to table stats_import.test_mr drop cascades to table stats_import.part_parent drop cascades to sequence stats_import.testseq drop cascades to view stats_import.testview diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out index 323429d896f..501ffadc105 100644 --- a/src/test/regress/expected/subselect.out +++ b/src/test/regress/expected/subselect.out @@ -1837,6 +1837,220 @@ NOTICE: x = 3, y = 0 drop function tattle(x int, y int); -- +-- check that an upper-level qual is not pushed down if its operator is from a +-- different btree opfamily than the subquery's grouping eqop +-- +BEGIN; +CREATE TYPE t_rec AS (x numeric); +CREATE TEMP TABLE pdt (id int, a t_rec); +INSERT INTO pdt VALUES + (1, ROW(1.00)::t_rec), + (2, ROW(1.0)::t_rec), + (3, ROW(2)::t_rec); +-- DISTINCT ON: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT ON (a) id, a FROM pdt ORDER BY a, id) s +WHERE a *= ROW(1.0)::t_rec; + QUERY PLAN +--------------------------------------- + Subquery Scan on s + Filter: (s.a *= '(1.0)'::t_rec) + -> Unique + -> Sort + Sort Key: pdt.a, pdt.id + -> Seq Scan on pdt +(6 rows) + +SELECT * FROM (SELECT DISTINCT ON (a) id, a FROM pdt ORDER BY a, id) s +WHERE a *= ROW(1.0)::t_rec; + id | a +----+--- +(0 rows) + +-- Window function PARTITION BY: conflict, qual stays outside the WindowAgg +EXPLAIN (COSTS OFF) +SELECT * FROM ( + SELECT id, a, count(*) OVER (PARTITION BY a) AS cnt FROM pdt +) s +WHERE a *= ROW(1.0)::t_rec; + QUERY PLAN +-------------------------------------------- + Subquery Scan on s + Filter: (s.a *= '(1.0)'::t_rec) + -> WindowAgg + Window: w1 AS (PARTITION BY pdt.a) + -> Sort + Sort Key: pdt.a + -> Seq Scan on pdt +(7 rows) + +SELECT * FROM ( + SELECT id, a, count(*) OVER (PARTITION BY a) AS cnt FROM pdt +) s +WHERE a *= ROW(1.0)::t_rec; + id | a | cnt +----+-------+----- + 2 | (1.0) | 2 +(1 row) + +-- Plain DISTINCT: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT a FROM pdt) s WHERE a *= ROW(1.0)::t_rec; + QUERY PLAN +----------------------------------- + Subquery Scan on s + Filter: (s.a *= '(1.0)'::t_rec) + -> HashAggregate + Group Key: pdt.a + -> Seq Scan on pdt +(5 rows) + +SELECT * FROM (SELECT DISTINCT a FROM pdt) s WHERE a *= ROW(1.0)::t_rec; + a +--- +(0 rows) + +-- Positive: compatible opfamily, safe to push past the grouping +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT ON (a) id, a FROM pdt ORDER BY a, id) s +WHERE a = ROW(1.0)::t_rec; + QUERY PLAN +-------------------------------------------- + Limit + -> Sort + Sort Key: pdt.id + -> Seq Scan on pdt + Filter: (a = '(1.0)'::t_rec) +(5 rows) + +SELECT * FROM (SELECT DISTINCT ON (a) id, a FROM pdt ORDER BY a, id) s +WHERE a = ROW(1.0)::t_rec; + id | a +----+-------- + 1 | (1.00) +(1 row) + +-- Set operations: any operation other than UNION ALL groups rows by equality, +-- so the same opfamily-mismatch rules apply. +CREATE TEMP TABLE u1 (a t_rec); +CREATE TEMP TABLE u2 (a t_rec); +INSERT INTO u1 VALUES (ROW(1.00)::t_rec), (ROW(1.0)::t_rec); +INSERT INTO u2 VALUES (ROW(1.0)::t_rec); +-- UNION: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT a FROM u1 UNION SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + QUERY PLAN +----------------------------------- + Subquery Scan on s + Filter: (s.a *= '(1.0)'::t_rec) + -> HashAggregate + Group Key: u1.a + -> Append + -> Seq Scan on u1 + -> Seq Scan on u2 +(7 rows) + +SELECT * FROM (SELECT a FROM u1 UNION SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + a +--- +(0 rows) + +-- INTERSECT: same +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT a FROM u1 INTERSECT SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + QUERY PLAN +----------------------------------- + Subquery Scan on s + Filter: (s.a *= '(1.0)'::t_rec) + -> HashSetOp Intersect + -> Seq Scan on u1 + -> Seq Scan on u2 +(5 rows) + +SELECT * FROM (SELECT a FROM u1 INTERSECT SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + a +--- +(0 rows) + +-- INTERSECT ALL: still groups +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT a FROM u1 INTERSECT ALL SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + QUERY PLAN +----------------------------------- + Subquery Scan on s + Filter: (s.a *= '(1.0)'::t_rec) + -> HashSetOp Intersect All + -> Seq Scan on u1 + -> Seq Scan on u2 +(5 rows) + +SELECT * FROM (SELECT a FROM u1 INTERSECT ALL SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + a +--- +(0 rows) + +-- UNION ALL of (UNION ...): an inner grouping node still exposes the +-- conflict to a qual pushed down through the outer UNION ALL. +EXPLAIN (COSTS OFF) +SELECT * FROM ( + (SELECT a FROM u1 UNION SELECT a FROM u2) + UNION ALL + SELECT a FROM u2 +) s +WHERE a *= ROW(1.0)::t_rec; + QUERY PLAN +---------------------------------------- + Subquery Scan on s + Filter: (s.a *= '(1.0)'::t_rec) + -> Append + -> HashAggregate + Group Key: u1.a + -> Append + -> Seq Scan on u1 + -> Seq Scan on u2 + -> Seq Scan on u2 u2_1 +(9 rows) + +SELECT * FROM ( + (SELECT a FROM u1 UNION SELECT a FROM u2) + UNION ALL + SELECT a FROM u2 +) s +WHERE a *= ROW(1.0)::t_rec; + a +------- + (1.0) +(1 row) + +-- UNION ALL only: no grouping anywhere, pushdown remains allowed. +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT a FROM u1 UNION ALL SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + QUERY PLAN +--------------------------------------- + Append + -> Seq Scan on u1 + Filter: (a *= '(1.0)'::t_rec) + -> Seq Scan on u2 + Filter: (a *= '(1.0)'::t_rec) +(5 rows) + +SELECT * FROM (SELECT a FROM u1 UNION ALL SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + a +------- + (1.0) + (1.0) +(2 rows) + +ROLLBACK; +-- -- Test that LIMIT can be pushed to SORT through a subquery that just projects -- columns. We check for that having happened by looking to see if EXPLAIN -- ANALYZE shows that a top-N sort was used. We must suppress or filter away diff --git a/src/test/regress/expected/unicode.out b/src/test/regress/expected/unicode.out index 1e06de22649..63e48d3a961 100644 --- a/src/test/regress/expected/unicode.out +++ b/src/test/regress/expected/unicode.out @@ -105,3 +105,81 @@ ORDER BY num; SELECT is_normalized('abc', 'def'); -- run-time error ERROR: invalid normalization form: def +-- Hangul NFC recomposition tests +-- L+V -> LV composition (first and last) +SELECT normalize(U&'\1100\1161', NFC) = U&'\AC00' COLLATE "C" AS hangul_lv_first; + hangul_lv_first +----------------- + t +(1 row) + +SELECT normalize(U&'\1112\1175', NFC) = U&'\D788' COLLATE "C" AS hangul_lv_last; + hangul_lv_last +---------------- + t +(1 row) + +-- LV+T -> LVT composition +SELECT normalize(U&'\AC00\11A8', NFC) = U&'\AC01' COLLATE "C" AS hangul_lvt_first_t; + hangul_lvt_first_t +-------------------- + t +(1 row) + +SELECT normalize(U&'\AC00\11C2', NFC) = U&'\AC1B' COLLATE "C" AS hangul_lvt_last_t; + hangul_lvt_last_t +------------------- + t +(1 row) + +SELECT normalize(U&'\D788\11A8', NFC) = U&'\D789' COLLATE "C" AS hangul_lvt_last_lv; + hangul_lvt_last_lv +-------------------- + t +(1 row) + +-- L+V+T -> LVT composition +SELECT normalize(U&'\1100\1161\11A8', NFC) = U&'\AC01' COLLATE "C" AS hangul_full_lvt; + hangul_full_lvt +----------------- + t +(1 row) + +SELECT normalize(U&'\1112\1175\11C2', NFC) = U&'\D7A3' COLLATE "C" AS hangul_full_lvt; + hangul_full_lvt +----------------- + t +(1 row) + +-- TBASE invalid T syllable +SELECT normalize(U&'\AC00\11A7', NFC) = U&'\AC00\11A7' COLLATE "C" AS hangul_tbase_not_combined; + hangul_tbase_not_combined +--------------------------- + t +(1 row) + +SELECT normalize(U&'\1100\1161\11A7', NFC) = U&'\AC00\11A7' COLLATE "C" AS hangul_lv_tbase_separate; + hangul_lv_tbase_separate +-------------------------- + t +(1 row) + +-- Hangul NFD decomposition tests +SELECT normalize(U&'\AC00', NFD) = U&'\1100\1161' COLLATE "C" AS hangul_nfd_lv; + hangul_nfd_lv +--------------- + t +(1 row) + +SELECT normalize(U&'\AC01', NFD) = U&'\1100\1161\11A8' COLLATE "C" AS hangul_nfd_lvt; + hangul_nfd_lvt +---------------- + t +(1 row) + +SELECT normalize(U&'\D7A3', NFD) = U&'\1112\1175\11C2' COLLATE "C" AS hangul_nfd_last; + hangul_nfd_last +----------------- + t +(1 row) + diff --git a/src/test/regress/expected/uuid.out b/src/test/regress/expected/uuid.out index 95392003b86..5212eb992bf 100644 --- a/src/test/regress/expected/uuid.out +++ b/src/test/regress/expected/uuid.out @@ -248,6 +248,28 @@ SELECT y, ts, prev_ts FROM uuidts WHERE ts < prev_ts; ---+----+--------- (0 rows) +-- uuidv7: infinite intervals are rejected +SELECT uuidv7('infinity'::interval); +ERROR: interval out of range for UUID version 7 +DETAIL: UUID version 7 does not support infinite intervals. +SELECT uuidv7('-infinity'::interval); +ERROR: interval out of range for UUID version 7 +DETAIL: UUID version 7 does not support infinite intervals. +-- uuidv7: timestamps before Unix epoch are rejected +SELECT uuidv7('-1000 years'::interval); +ERROR: timestamp out of range for UUID version 7 +DETAIL: UUID version 7 supports timestamps from 1970-01-01 to approximately year 10889. +-- uuidv7: timestamps beyond 48-bit ms field (~year 10889) are rejected +SELECT uuidv7('9000 years'::interval); +ERROR: timestamp out of range for UUID version 7 +DETAIL: UUID version 7 supports timestamps from 1970-01-01 to approximately year 10889. +-- uuidv7: a large but in-range forward shift is accepted +SELECT uuid_extract_timestamp(uuidv7('1000 years'::interval)) > now() + '999 years'::interval; + ?column? +---------- + t +(1 row) + -- extract functions -- version SELECT uuid_extract_version('11111111-1111-5111-8111-111111111111'); -- 5 diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out index 6ee01f37009..f7bb520402b 100644 --- a/src/test/regress/expected/window.out +++ b/src/test/regress/expected/window.out @@ -4232,23 +4232,59 @@ WHERE c <= 3; (8 rows) -- Ensure we get the correct run condition when the window function is both --- monotonically increasing and decreasing. +-- monotonically increasing and decreasing in RANGE mode without an ORDER BY EXPLAIN (COSTS OFF) SELECT * FROM (SELECT empno, depname, salary, - count(empno) OVER () c + count(empno) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) c FROM empsalary) emp WHERE c = 1; - QUERY PLAN -------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------- WindowAgg - Window: w1 AS () + Window: w1 AS (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) Run Condition: (count(empsalary.empno) OVER w1 = 1) -> Seq Scan on empsalary (4 rows) +-- As above, but check we detect it's monotonically increasing +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +------------------------------------------------------------- + WindowAgg + Window: w1 AS (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) + Run Condition: (count(empsalary.empno) OVER w1 <= 3) + -> Seq Scan on empsalary +(4 rows) + +-- Ensure that ROWS mode without an ORDER BY doesn't think it's monotonically +-- decreasing, i.e. don't push down the run condition. +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) c + FROM empsalary) emp +WHERE c > 1; + QUERY PLAN +------------------------------------------------------------------ + Subquery Scan on emp + Filter: (emp.c > 1) + -> WindowAgg + Window: w1 AS (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) + -> Seq Scan on empsalary +(5 rows) + -- Try another case with a WindowFunc with a byref return type SELECT * FROM (SELECT row_number() OVER (PARTITION BY salary) AS rn, @@ -4436,6 +4472,181 @@ WHERE c = 1; -> Seq Scan on empsalary (9 rows) +-- +-- Ensure we get the correct behavior for run condition pushdown when the +-- frame option has an EXCLUDE clause +-- +-- Ensure pushdown occurs for ROWS BETWEEN UNBOUNDED PRECEDING with EXCLUDE +-- CURRENT ROW with COUNT(*) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------- + WindowAgg + Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint PRECEDING EXCLUDE CURRENT ROW) + Run Condition: (count(*) OVER w1 <= 3) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 rows) + +-- Ensure pushdown occurs for GROUPS BETWEEN UNBOUNDED PRECEDING with EXCLUDE +-- CURRENT ROW with COUNT(*) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------- + WindowAgg + Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) + Run Condition: (count(*) OVER w1 <= 3) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 rows) + +-- Ensure pushdown occurs for RANGE BETWEEN UNBOUNDED PRECEDING with EXCLUDE +-- CURRENT ROW with COUNT(*) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------- + WindowAgg + Window: w1 AS (ORDER BY empsalary.salary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) + Run Condition: (count(*) OVER w1 <= 3) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 rows) + +-- Ensure we don't get pushdown when a FILTER clause is present +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) FILTER (WHERE salary > 4000) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------- + Subquery Scan on emp + Filter: (emp.c <= 3) + -> WindowAgg + Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint PRECEDING EXCLUDE CURRENT ROW) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(7 rows) + +-- Ensure we don't get pushdown with COUNT(ANY) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(salary) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------- + Subquery Scan on emp + Filter: (emp.c <= 3) + -> WindowAgg + Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint PRECEDING EXCLUDE CURRENT ROW) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(7 rows) + +-- Ensure we don't get pushdown with EXCLUDE GROUP +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE GROUP) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------- + Subquery Scan on emp + Filter: (emp.c <= 3) + -> WindowAgg + Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint PRECEDING EXCLUDE GROUP) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(7 rows) + +-- Ensure we don't get pushdown with EXCLUDE TIES +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------- + Subquery Scan on emp + Filter: (emp.c <= 3) + -> WindowAgg + Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint PRECEDING EXCLUDE TIES) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(7 rows) + +-- Ensure we don't get pushdown with GROUPS mode and EXCLUDE GROUP +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE GROUP) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------ + Subquery Scan on emp + Filter: (emp.c <= 3) + -> WindowAgg + Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint PRECEDING EXCLUDE GROUP) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(7 rows) + +-- Ensure we don't get pushdown with GROUPS mode and EXCLUDE TIES +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES) c + FROM empsalary) emp +WHERE c <= 3; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------- + Subquery Scan on emp + Filter: (emp.c <= 3) + -> WindowAgg + Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint PRECEDING EXCLUDE TIES) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(7 rows) + -- Test Sort node collapsing EXPLAIN (COSTS OFF) SELECT * FROM diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out index 103a22a3b1d..7068d0eadcf 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -4,13 +4,19 @@ CREATE TABLE xmltest ( ); INSERT INTO xmltest VALUES (1, 'one'); INSERT INTO xmltest VALUES (2, 'two'); -INSERT INTO xmltest VALUES (3, 'three '); ERROR: invalid XML content -LINE 1: INSERT INTO xmltest VALUES (3, 'three '); ^ -DETAIL: line 1: Couldn't find end of Start Tag wrong line 1 -three + ^ +-- If no XML data could be inserted, skip the tests as the server has been +-- compiled without libxml support. +SELECT count(*) = 0 AS skip_test FROM xmltest \gset +\if :skip_test +\quit +\endif SELECT * FROM xmltest; id | data ----+-------------------- @@ -89,13 +95,13 @@ SELECT xmlconcat(1, 2); ERROR: argument of XMLCONCAT must be type xml, not type integer LINE 1: SELECT xmlconcat(1, 2); ^ -SELECT xmlconcat('bad', ' '); ERROR: invalid XML content -LINE 1: SELECT xmlconcat('bad', ' '); ^ -DETAIL: line 1: Couldn't find end of Start Tag syntax line 1 - + ^ SELECT xmlconcat('', NULL, ''); xmlconcat -------------- @@ -271,13 +277,13 @@ SELECT xmlparse(content ''); (1 row) -SELECT xmlparse(content '&idontexist;'); +SELECT xmlparse(content '&idontexist; '); ERROR: invalid XML content DETAIL: line 1: Entity 'idontexist' not defined -&idontexist; +&idontexist; ^ line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced -&idontexist; +&idontexist; ^ SELECT xmlparse(content ''); xmlparse @@ -285,11 +291,11 @@ SELECT xmlparse(content ''); (1 row) -SELECT xmlparse(document ' '); +SELECT xmlparse(document '!'); ERROR: invalid XML document DETAIL: line 1: Start tag expected, '<' not found - - ^ +! +^ SELECT xmlparse(document 'abc'); ERROR: invalid XML document DETAIL: line 1: Start tag expected, '<' not found @@ -301,21 +307,21 @@ SELECT xmlparse(document 'x'); x (1 row) -SELECT xmlparse(document '&'); +SELECT xmlparse(document '& '); ERROR: invalid XML document DETAIL: line 1: xmlParseEntityRef: no name -& +& ^ line 1: Opening and ending tag mismatch: invalidentity line 1 and abc -& +& ^ -SELECT xmlparse(document '&idontexist;'); +SELECT xmlparse(document '&idontexist; '); ERROR: invalid XML document DETAIL: line 1: Entity 'idontexist' not defined -&idontexist; +&idontexist; ^ line 1: Opening and ending tag mismatch: undefinedentity line 1 and abc -&idontexist; +&idontexist; ^ SELECT xmlparse(document ''); xmlparse @@ -329,13 +335,13 @@ SELECT xmlparse(document ''); (1 row) -SELECT xmlparse(document '&idontexist;'); +SELECT xmlparse(document '&idontexist; '); ERROR: invalid XML document DETAIL: line 1: Entity 'idontexist' not defined -&idontexist; +&idontexist; ^ line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced -&idontexist; +&idontexist; ^ SELECT xmlparse(document ''); xmlparse @@ -944,6 +950,12 @@ SELECT xpath('root', ''); {} (1 row) +SELECT xpath('//namespace::foo', ''); + xpath +-------------------- + {http://127.0.0.1} +(1 row) + -- Round-trip non-ASCII data through xpath(). DO $$ DECLARE diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out index 73c411118a3..af7f06476f1 100644 --- a/src/test/regress/expected/xml_1.out +++ b/src/test/regress/expected/xml_1.out @@ -12,1487 +12,13 @@ ERROR: unsupported XML feature LINE 1: INSERT INTO xmltest VALUES (2, 'two'); ^ DETAIL: This functionality requires the server to be built with libxml support. -INSERT INTO xmltest VALUES (3, 'three '); ERROR: unsupported XML feature -LINE 1: INSERT INTO xmltest VALUES (3, 'three '); ^ DETAIL: This functionality requires the server to be built with libxml support. -SELECT * FROM xmltest; - id | data -----+------ -(0 rows) - --- test non-throwing API, too -SELECT pg_input_is_valid('one', 'xml'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT pg_input_is_valid('oneone', 'xml'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT message FROM pg_input_error_info('', 'xml'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlcomment('test'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlcomment('-test'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlcomment('test-'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlcomment('--test'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlcomment('te st'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlconcat(xmlcomment('hello'), - xmlelement(NAME qux, 'foo'), - xmlcomment('world')); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlconcat('hello', 'you'); -ERROR: unsupported XML feature -LINE 1: SELECT xmlconcat('hello', 'you'); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlconcat(1, 2); -ERROR: argument of XMLCONCAT must be type xml, not type integer -LINE 1: SELECT xmlconcat(1, 2); - ^ -SELECT xmlconcat('bad', '', NULL, ''); -ERROR: unsupported XML feature -LINE 1: SELECT xmlconcat('', NULL, '', NULL, ''); -ERROR: unsupported XML feature -LINE 1: SELECT xmlconcat('', NULL, 'r'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlelement(name foo, xml 'br'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlelement(name foo, array[1, 2, 3]); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SET xmlbinary TO base64; -SELECT xmlelement(name foo, bytea 'bar'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SET xmlbinary TO hex; -SELECT xmlelement(name foo, bytea 'bar'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlelement(name foo, xmlattributes(true as bar)); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'br' as funnier)); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content ''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content ' '); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content 'abc'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content 'x'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content '&'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content '&idontexist;'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content ''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content ''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content '&idontexist;'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(content ''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(document ' '); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(document 'abc'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(document 'x'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(document '&'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(document '&idontexist;'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(document ''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(document ''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(document '&idontexist;'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlparse(document ''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name foo); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name xml); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name xmlstuff); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name foo, 'bar'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name foo, 'in?>valid'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name foo, null); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name xml, null); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name xmlstuff, null); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name foo, ' bar'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlroot(xml '', version no value, standalone no value); -ERROR: unsupported XML feature -LINE 1: SELECT xmlroot(xml '', version no value, standalone no... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlroot(xml '', version '2.0'); -ERROR: unsupported XML feature -LINE 1: SELECT xmlroot(xml '', version '2.0'); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlroot(xml '', version no value, standalone yes); -ERROR: unsupported XML feature -LINE 1: SELECT xmlroot(xml '', version no value, standalone ye... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlroot(xml '', version no value, standalone yes); -ERROR: unsupported XML feature -LINE 1: SELECT xmlroot(xml '', version no... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlroot(xmlroot(xml '', version '1.0'), version '1.1', standalone no); -ERROR: unsupported XML feature -LINE 1: SELECT xmlroot(xmlroot(xml '', version '1.0'), version... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlroot('', version no value, standalone no); -ERROR: unsupported XML feature -LINE 1: SELECT xmlroot('... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlroot('', version no value, standalone no value); -ERROR: unsupported XML feature -LINE 1: SELECT xmlroot('... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlroot('', version no value); -ERROR: unsupported XML feature -LINE 1: SELECT xmlroot('... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlroot ( - xmlelement ( - name gazonk, - xmlattributes ( - 'val' AS name, - 1 + 1 AS num - ), - xmlelement ( - NAME qux, - 'foo' - ) - ), - version '1.0', - standalone yes -); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(content data as character varying(20)) FROM xmltest; - xmlserialize --------------- -(0 rows) - -SELECT xmlserialize(content 'good' as char(10)); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(content 'good' as char(10)); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(document 'bad' as text); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(document 'bad' as text); - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- indent -SELECT xmlserialize(DOCUMENT '42' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT '42<... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT '42' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT '42<... - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- no indent -SELECT xmlserialize(DOCUMENT '42' AS text NO INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT '42<... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT '42' AS text NO INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT '42<... - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- indent non singly-rooted xml -SELECT xmlserialize(DOCUMENT '7342' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT '734... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT '7342' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT '734... - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- indent non singly-rooted xml with mixed contents -SELECT xmlserialize(DOCUMENT 'text node73text node42' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT 'text node73text nod... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT 'text node73text node42' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT 'text node73text nod... - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- indent singly-rooted xml with mixed contents -SELECT xmlserialize(DOCUMENT '42text node73' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT '42<... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT '42text node73' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT '42<... - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- indent empty string -SELECT xmlserialize(DOCUMENT '' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT '' AS text INDENT); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT '' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT '' AS text INDENT); - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- whitespaces -SELECT xmlserialize(DOCUMENT ' ' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT ' ' AS text INDENT); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT ' ' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT ' ' AS text INDENT); - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- indent null -SELECT xmlserialize(DOCUMENT NULL AS text INDENT); - xmlserialize --------------- - -(1 row) - -SELECT xmlserialize(CONTENT NULL AS text INDENT); - xmlserialize --------------- - -(1 row) - --- indent with XML declaration -SELECT xmlserialize(DOCUMENT '73' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT '73' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT '' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT '' AS text INDE... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT '' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT '' AS text INDE... - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- indent xml with empty element -SELECT xmlserialize(DOCUMENT '' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT '' AS tex... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT '' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT '' AS tex... - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- 'no indent' = not using 'no indent' -SELECT xmlserialize(DOCUMENT '42' AS text) = xmlserialize(DOCUMENT '42' AS text NO INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT '42<... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT '42' AS text) = xmlserialize(CONTENT '42' AS text NO INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT '42<... - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- indent xml strings containing blank nodes -SELECT xmlserialize(DOCUMENT ' ' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(DOCUMENT ' '... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlserialize(CONTENT 'text node ' AS text INDENT); -ERROR: unsupported XML feature -LINE 1: SELECT xmlserialize(CONTENT 'text node ... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml 'bar' IS DOCUMENT; -ERROR: unsupported XML feature -LINE 1: SELECT xml 'bar' IS DOCUMENT; - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml 'barfoo' IS DOCUMENT; -ERROR: unsupported XML feature -LINE 1: SELECT xml 'barfoo' IS DOCUMENT; - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml '' IS NOT DOCUMENT; -ERROR: unsupported XML feature -LINE 1: SELECT xml '' IS NOT DOCUMENT; - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml 'abc' IS NOT DOCUMENT; -ERROR: unsupported XML feature -LINE 1: SELECT xml 'abc' IS NOT DOCUMENT; - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT '<>' IS NOT DOCUMENT; -ERROR: unsupported XML feature -LINE 1: SELECT '<>' IS NOT DOCUMENT; - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlagg(data) FROM xmltest; - xmlagg --------- - -(1 row) - -SELECT xmlagg(data) FROM xmltest WHERE id > 10; - xmlagg --------- - -(1 row) - -SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp; -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. --- Check mapping SQL identifier to XML name -SELECT xmlpi(name ":::_xml_abc135.%-&_"); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmlpi(name "123"); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -PREPARE foo (xml) AS SELECT xmlconcat('', $1); -ERROR: unsupported XML feature -LINE 1: PREPARE foo (xml) AS SELECT xmlconcat('', $1); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SET XML OPTION DOCUMENT; -EXECUTE foo (''); -ERROR: prepared statement "foo" does not exist -EXECUTE foo ('bad'); -ERROR: prepared statement "foo" does not exist -SELECT xml ''; -ERROR: unsupported XML feature -LINE 1: SELECT xml ''; - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SET XML OPTION CONTENT; -EXECUTE foo (''); -ERROR: prepared statement "foo" does not exist -EXECUTE foo ('good'); -ERROR: prepared statement "foo" does not exist -SELECT xml ' '; -ERROR: unsupported XML feature -LINE 1: SELECT xml ' '; -ERROR: unsupported XML feature -LINE 1: SELECT xml ' '; -ERROR: unsupported XML feature -LINE 1: SELECT xml ''; - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml ' oops '; -ERROR: unsupported XML feature -LINE 1: SELECT xml ' oops '; - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml ' '; -ERROR: unsupported XML feature -LINE 1: SELECT xml ' '; - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml ''; -ERROR: unsupported XML feature -LINE 1: SELECT xml ''; - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- Test backwards parsing -CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); -CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); -ERROR: unsupported XML feature -LINE 1: CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -CREATE VIEW xmlview5 AS SELECT xmlparse(content 'x'); -CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); -ERROR: unsupported XML feature -LINE 1: CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); -ERROR: unsupported XML feature -LINE 1: ...EATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as ... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); -ERROR: unsupported XML feature -LINE 1: ...EATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as ... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -CREATE VIEW xmlview10 AS SELECT xmlserialize(document '42' AS text indent); -ERROR: unsupported XML feature -LINE 1: ...TE VIEW xmlview10 AS SELECT xmlserialize(document '42' AS character varying no indent); -ERROR: unsupported XML feature -LINE 1: ...TE VIEW xmlview11 AS SELECT xmlserialize(document 'x'::text STRIP WHITESPACE) AS "xmlparse"; -(2 rows) - --- Text XPath expressions evaluation -SELECT xpath('/value', data) FROM xmltest; - xpath -------- -(0 rows) - -SELECT xpath(NULL, NULL) IS NULL FROM xmltest; - ?column? ----------- -(0 rows) - -SELECT xpath('', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xpath('//text()', 'number one'); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('//text()', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('//loc:piece/@id', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('//loc:piece', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('//@value', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xpath('''<>''', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('''<>''', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xpath('count(//*)', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('count(//*)', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xpath('count(//*)=0', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('count(//*)=0', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xpath('count(//*)=3', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('count(//*)=3', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xpath('name(/*)', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('name(/*)', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xpath('/nosuchtag', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('/nosuchtag', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xpath('root', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('root', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- Round-trip non-ASCII data through xpath(). -DO $$ -DECLARE - xml_declaration text := ''; - degree_symbol text; - res xml[]; -BEGIN - -- Per the documentation, except when the server encoding is UTF8, xpath() - -- may not work on non-ASCII data. The untranslatable_character and - -- undefined_function traps below, currently dead code, will become relevant - -- if we remove this limitation. - IF current_setting('server_encoding') <> 'UTF8' THEN - RAISE LOG 'skip: encoding % unsupported for xpath', - current_setting('server_encoding'); - RETURN; - END IF; - - degree_symbol := convert_from('\xc2b0', 'UTF8'); - res := xpath('text()', (xml_declaration || - '' || degree_symbol || '')::xml); - IF degree_symbol <> res[1]::text THEN - RAISE 'expected % (%), got % (%)', - degree_symbol, convert_to(degree_symbol, 'UTF8'), - res[1], convert_to(res[1]::text, 'UTF8'); - END IF; -EXCEPTION - -- character with byte sequence 0xc2 0xb0 in encoding "UTF8" has no equivalent in encoding "LATIN8" - WHEN untranslatable_character - -- default conversion function for encoding "UTF8" to "MULE_INTERNAL" does not exist - OR undefined_function - -- unsupported XML feature - OR feature_not_supported THEN - RAISE LOG 'skip: %', SQLERRM; -END -$$; --- Test xmlexists and xpath_exists -SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); -ERROR: unsupported XML feature -LINE 1: ...sts('//town[text() = ''Toronto'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); -ERROR: unsupported XML feature -LINE 1: ...sts('//town[text() = ''Cwmbran'']' PASSING BY REF ''); -ERROR: unsupported XML feature -LINE 1: ...LECT xmlexists('count(/nosuchtag)' PASSING BY REF '')... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); -ERROR: unsupported XML feature -LINE 1: ...ELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); -ERROR: unsupported XML feature -LINE 1: ...ELECT xpath_exists('//town[text() = ''Cwmbran'']',''::xml); -ERROR: unsupported XML feature -LINE 1: SELECT xpath_exists('count(/nosuchtag)', ''::xml); - ^ -DETAIL: This functionality requires the server to be built with libxml support. -INSERT INTO xmltest VALUES (4, 'BudvarfreeCarlinglots'::xml); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmltest VALUES (4, 'BudvarMolsonfreeCarlinglots'::xml); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmltest VALUES (5, 'MolsonBudvarfreeCarlinglots'::xml); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmltest VALUES (6, 'MolsonfreeCarlinglots'::xml); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmltest VALUES (7, 'number one'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml_is_well_formed('bar'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml_is_well_formed('bar'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml_is_well_formed('&'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml_is_well_formed('&idontexist;'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml_is_well_formed(''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml_is_well_formed(''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xml_is_well_formed('&idontexist;'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SET xmloption TO CONTENT; -SELECT xml_is_well_formed('abc'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. --- Since xpath() deals with namespaces, it's a bit stricter about --- what's well-formed and what's not. If we don't obey these rules --- (i.e. ignore namespace-related errors from libxml), xpath() --- fails in subtle ways. The following would for example produce --- the xml value --- --- which is invalid because '<' may not appear un-escaped in --- attribute values. --- Since different libxml versions emit slightly different --- error messages, we suppress the DETAIL in this test. -\set VERBOSITY terse -SELECT xpath('/*', ''); -ERROR: unsupported XML feature at character 20 -\set VERBOSITY default --- Again, the XML isn't well-formed for namespace purposes -SELECT xpath('/*', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('/*', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- XPath deprecates relative namespaces, but they're not supposed to --- throw an error, only a warning. -SELECT xpath('/*', ''); -ERROR: unsupported XML feature -LINE 1: SELECT xpath('/*', ''); - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- External entity references should not leak filesystem information. -SELECT XMLPARSE(DOCUMENT ']>&c;'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT XMLPARSE(DOCUMENT ']>&c;'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. --- This might or might not load the requested DTD, but it mustn't throw error. -SELECT XMLPARSE(DOCUMENT ' '); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. --- XMLPATH tests -CREATE TABLE xmldata(data xml); -INSERT INTO xmldata VALUES(' - - AU - Australia - 3 - - - CN - China - 3 - - - HK - HongKong - 3 - - - IN - India - 3 - - - JP - Japan - 3Sinzo Abe - - - SG - Singapore - 3791 - -'); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmldata VALUES(' - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- XMLTABLE with columns -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+--------------+------------+-----------+------+------+-------------- -(0 rows) - -CREATE VIEW xmltableview1 AS SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); -SELECT * FROM xmltableview1; - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+--------------+------------+-----------+------+------+-------------- -(0 rows) - -\sv xmltableview1 -CREATE OR REPLACE VIEW public.xmltableview1 AS - SELECT "xmltable".id, - "xmltable"._id, - "xmltable".country_name, - "xmltable".country_id, - "xmltable".region_id, - "xmltable".size, - "xmltable".unit, - "xmltable".premier_name - FROM ( SELECT xmldata.data - FROM xmldata) x, - LATERAL XMLTABLE(('/ROWS/ROW'::text) PASSING (x.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) -EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; - QUERY PLAN ------------------------------------------ - Nested Loop - -> Seq Scan on xmldata - -> Table Function Scan on "xmltable" -(3 rows) - -EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; - QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Nested Loop - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - -> Seq Scan on public.xmldata - Output: xmldata.data - -> Table Function Scan on "xmltable" - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) -(7 rows) - --- errors -SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); -ERROR: XMLTABLE function has 1 columns available but 2 columns specified -SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_not_null 1) AS f (v1); -ERROR: option name "__pg__is_not_null" cannot be used in XMLTABLE -LINE 1: ...MLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_n... - ^ --- XMLNAMESPACES tests -SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), - '/zz:rows/zz:row' - PASSING '10' - COLUMNS a int PATH 'zz:a'); -ERROR: unsupported XML feature -LINE 3: PASSING '10' - COLUMNS a int PATH 'Zz:a'); -ERROR: unsupported XML feature -LINE 3: PASSING '10' - COLUMNS a int PATH 'a'); -ERROR: unsupported XML feature -LINE 3: PASSING '' - COLUMNS a text PATH 'foo/namespace::node()'); -ERROR: unsupported XML feature -LINE 2: PASSING '' - ^ -DETAIL: This functionality requires the server to be built with libxml support. --- used in prepare statements -PREPARE pp AS -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); -EXECUTE pp; - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+--------------+------------+-----------+------+------+-------------- -(0 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); - COUNTRY_NAME | REGION_ID ---------------+----------- -(0 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); - id | COUNTRY_NAME | REGION_ID -----+--------------+----------- -(0 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); - id | COUNTRY_NAME | REGION_ID -----+--------------+----------- -(0 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); - id ----- -(0 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); - id ----- -(0 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); - id | COUNTRY_NAME | REGION_ID | rawdata -----+--------------+-----------+--------- -(0 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); - id | COUNTRY_NAME | REGION_ID | rawdata -----+--------------+-----------+--------- -(0 rows) - -SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text); -ERROR: unsupported XML feature -LINE 1: SELECT * FROM xmltable('/root' passing 'a1aa1aa2a bbbbxxxcccc' COLUMNS element text PATH 'element/text()'); -- should fail -ERROR: unsupported XML feature -LINE 1: SELECT * FROM xmltable('/root' passing 'a1a &"<>!foo]]>2' columns c text); -ERROR: unsupported XML feature -LINE 1: select * from xmltable('d/r' passing ''"&<>' COLUMNS ent text); -ERROR: unsupported XML feature -LINE 1: SELECT * FROM xmltable('/x/a' PASSING '''"&<>' COLUMNS ent xml); -ERROR: unsupported XML feature -LINE 1: SELECT * FROM xmltable('/x/a' PASSING '' Seq Scan on public.xmldata - Output: xmldata.data - -> Table Function Scan on "xmltable" - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) -(7 rows) - --- test qual -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; - COUNTRY_NAME | REGION_ID ---------------+----------- -(0 rows) - -EXPLAIN (VERBOSE, COSTS OFF) -SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; - QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Nested Loop - Output: f."COUNTRY_NAME", f."REGION_ID" - -> Seq Scan on public.xmldata - Output: xmldata.data - -> Table Function Scan on "xmltable" f - Output: f."COUNTRY_NAME", f."REGION_ID" - Table Function Call: XMLTABLE(('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]'::text) PASSING (xmldata.data) COLUMNS "COUNTRY_NAME" text, "REGION_ID" integer) - Filter: (f."COUNTRY_NAME" = 'Japan'::text) -(8 rows) - -EXPLAIN (VERBOSE, FORMAT JSON, COSTS OFF) -SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; - QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - [ + - { + - "Plan": { + - "Node Type": "Nested Loop", + - "Parallel Aware": false, + - "Async Capable": false, + - "Join Type": "Inner", + - "Disabled": false, + - "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + - "Inner Unique": false, + - "Plans": [ + - { + - "Node Type": "Seq Scan", + - "Parent Relationship": "Outer", + - "Parallel Aware": false, + - "Async Capable": false, + - "Relation Name": "xmldata", + - "Schema": "public", + - "Alias": "xmldata", + - "Disabled": false, + - "Output": ["xmldata.data"] + - }, + - { + - "Node Type": "Table Function Scan", + - "Parent Relationship": "Inner", + - "Parallel Aware": false, + - "Async Capable": false, + - "Table Function Name": "xmltable", + - "Alias": "f", + - "Disabled": false, + - "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + - "Table Function Call": "XMLTABLE(('/ROWS/ROW[COUNTRY_NAME=\"Japan\" or COUNTRY_NAME=\"India\"]'::text) PASSING (xmldata.data) COLUMNS \"COUNTRY_NAME\" text, \"REGION_ID\" integer)",+ - "Filter": "(f.\"COUNTRY_NAME\" = 'Japan'::text)" + - } + - ] + - } + - } + - ] -(1 row) - --- should to work with more data -INSERT INTO xmldata VALUES(' - - CZ - Czech Republic - 2Milos Zeman - - - DE - Germany - 2 - - - FR - France - 2 - -'); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmldata VALUES(' - ^ -DETAIL: This functionality requires the server to be built with libxml support. -INSERT INTO xmldata VALUES(' - - EG - Egypt - 1 - - - SD - Sudan - 1 - -'); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmldata VALUES(' - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+--------------+------------+-----------+------+------+-------------- -(0 rows) - -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') - WHERE region_id = 2; - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+--------------+------------+-----------+------+------+-------------- -(0 rows) - -EXPLAIN (VERBOSE, COSTS OFF) -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') - WHERE region_id = 2; - QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - Nested Loop - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - -> Seq Scan on public.xmldata - Output: xmldata.data - -> Table Function Scan on "xmltable" - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) - Filter: ("xmltable".region_id = 2) -(8 rows) - --- should fail, NULL value -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE' NOT NULL, - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+--------------+------------+-----------+------+------+-------------- -(0 rows) - --- if all is ok, then result is empty --- one line xml test -WITH - x AS (SELECT proname, proowner, procost::numeric, pronargs, - array_to_string(proargnames,',') as proargnames, - case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes - FROM pg_proc WHERE proname = 'f_leak'), - y AS (SELECT xmlelement(name proc, - xmlforest(proname, proowner, - procost, pronargs, - proargnames, proargtypes)) as proc - FROM x), - z AS (SELECT xmltable.* - FROM y, - LATERAL xmltable('/proc' PASSING proc - COLUMNS proname name, - proowner oid, - procost float, - pronargs int, - proargnames text, - proargtypes text)) - SELECT * FROM z - EXCEPT SELECT * FROM x; -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. --- multi line xml test, result should be empty too -WITH - x AS (SELECT proname, proowner, procost::numeric, pronargs, - array_to_string(proargnames,',') as proargnames, - case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes - FROM pg_proc), - y AS (SELECT xmlelement(name data, - xmlagg(xmlelement(name proc, - xmlforest(proname, proowner, procost, - pronargs, proargnames, proargtypes)))) as doc - FROM x), - z AS (SELECT xmltable.* - FROM y, - LATERAL xmltable('/data/proc' PASSING doc - COLUMNS proname name, - proowner oid, - procost float, - pronargs int, - proargnames text, - proargtypes text)) - SELECT * FROM z - EXCEPT SELECT * FROM x; -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -CREATE TABLE xmltest2(x xml, _path text); -INSERT INTO xmltest2 VALUES('1', 'A'); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmltest2 VALUES('1', 'A')... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -INSERT INTO xmltest2 VALUES('2', 'B'); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmltest2 VALUES('2', 'B')... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -INSERT INTO xmltest2 VALUES('3', 'C'); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmltest2 VALUES('3', 'C')... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -INSERT INTO xmltest2 VALUES('2', 'D'); -ERROR: unsupported XML feature -LINE 1: INSERT INTO xmltest2 VALUES('2', 'D')... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); - a ---- -(0 rows) - -SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); - a ---- -(0 rows) - -SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); - a ---- -(0 rows) - --- XPath result can be boolean or number too -SELECT * FROM XMLTABLE('*' PASSING 'a' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); -ERROR: unsupported XML feature -LINE 1: SELECT * FROM XMLTABLE('*' PASSING 'a' COLUMNS a xml ... - ^ -DETAIL: This functionality requires the server to be built with libxml support. -\x -SELECT * FROM XMLTABLE('*' PASSING 'pre&deeppost' COLUMNS x xml PATH '/e/n2', y xml PATH '/'); -ERROR: unsupported XML feature -LINE 1: SELECT * FROM XMLTABLE('*' PASSING 'pre"', b xml PATH '""'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmltext(NULL); - xmltext ---------- - -(1 row) - -SELECT xmltext(''); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmltext(' '); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmltext('foo `$_-+?=*^%!|/\()[]{}'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmltext('foo & <"bar">'); -ERROR: unsupported XML feature -DETAIL: This functionality requires the server to be built with libxml support. -SELECT xmltext('x'|| '

73

'::xml || .42 || true || 'j'::char); -ERROR: unsupported XML feature -LINE 1: SELECT xmltext('x'|| '

73

'::xml || .42 || true || 'j':... - ^ -DETAIL: This functionality requires the server to be built with libxml support. +-- If no XML data could be inserted, skip the tests as the server has been +-- compiled without libxml support. +SELECT count(*) = 0 AS skip_test FROM xmltest \gset +\if :skip_test +\quit diff --git a/src/test/regress/expected/xml_2.out b/src/test/regress/expected/xml_2.out deleted file mode 100644 index a85d95358d9..00000000000 --- a/src/test/regress/expected/xml_2.out +++ /dev/null @@ -1,1869 +0,0 @@ -CREATE TABLE xmltest ( - id int, - data xml -); -INSERT INTO xmltest VALUES (1, 'one'); -INSERT INTO xmltest VALUES (2, 'two'); -INSERT INTO xmltest VALUES (3, 'one - 2 | two -(2 rows) - --- test non-throwing API, too -SELECT pg_input_is_valid('one', 'xml'); - pg_input_is_valid -------------------- - t -(1 row) - -SELECT pg_input_is_valid('oneone', 'xml'); - pg_input_is_valid -------------------- - f -(1 row) - -SELECT message FROM pg_input_error_info('', 'xml'); - message ----------------------------------------------- - invalid XML content: invalid XML declaration -(1 row) - -SELECT xmlcomment('test'); - xmlcomment -------------- - -(1 row) - -SELECT xmlcomment('-test'); - xmlcomment --------------- - -(1 row) - -SELECT xmlcomment('test-'); -ERROR: invalid XML comment -SELECT xmlcomment('--test'); -ERROR: invalid XML comment -SELECT xmlcomment('te st'); - xmlcomment --------------- - -(1 row) - -SELECT xmlconcat(xmlcomment('hello'), - xmlelement(NAME qux, 'foo'), - xmlcomment('world')); - xmlconcat ----------------------------------------- - foo -(1 row) - -SELECT xmlconcat('hello', 'you'); - xmlconcat ------------ - helloyou -(1 row) - -SELECT xmlconcat(1, 2); -ERROR: argument of XMLCONCAT must be type xml, not type integer -LINE 1: SELECT xmlconcat(1, 2); - ^ -SELECT xmlconcat('bad', '', NULL, ''); - xmlconcat --------------- - -(1 row) - -SELECT xmlconcat('', NULL, ''); - xmlconcat ------------------------------------ - -(1 row) - -SELECT xmlconcat(NULL); - xmlconcat ------------ - -(1 row) - -SELECT xmlconcat(NULL, NULL); - xmlconcat ------------ - -(1 row) - -SELECT xmlelement(name element, - xmlattributes (1 as one, 'deuce' as two), - 'content'); - xmlelement ------------------------------------------------- - content -(1 row) - -SELECT xmlelement(name element, - xmlattributes ('unnamed and wrong')); -ERROR: unnamed XML attribute value must be a column reference -LINE 2: xmlattributes ('unnamed and wrong')); - ^ -SELECT xmlelement(name element, xmlelement(name nested, 'stuff')); - xmlelement -------------------------------------------- - stuff -(1 row) - -SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; - xmlelement ----------------------------------------------------------------------- - sharon251000 - sam302000 - bill201000 - jeff23600 - cim30400 - linda19100 -(6 rows) - -SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); -ERROR: XML attribute name "a" appears more than once -LINE 1: ...ment(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a)); - ^ -SELECT xmlelement(name num, 37); - xmlelement ---------------- - 37 -(1 row) - -SELECT xmlelement(name foo, text 'bar'); - xmlelement ----------------- - bar -(1 row) - -SELECT xmlelement(name foo, xml 'bar'); - xmlelement ----------------- - bar -(1 row) - -SELECT xmlelement(name foo, text 'br'); - xmlelement -------------------------- - b<a/>r -(1 row) - -SELECT xmlelement(name foo, xml 'br'); - xmlelement -------------------- - br -(1 row) - -SELECT xmlelement(name foo, array[1, 2, 3]); - xmlelement -------------------------------------------------------------------------- - 123 -(1 row) - -SET xmlbinary TO base64; -SELECT xmlelement(name foo, bytea 'bar'); - xmlelement ------------------ - YmFy -(1 row) - -SET xmlbinary TO hex; -SELECT xmlelement(name foo, bytea 'bar'); - xmlelement -------------------- - 626172 -(1 row) - -SELECT xmlelement(name foo, xmlattributes(true as bar)); - xmlelement -------------------- - -(1 row) - -SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar)); - xmlelement ----------------------------------- - -(1 row) - -SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar)); -ERROR: timestamp out of range -DETAIL: XML does not support infinite timestamp values. -SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'br' as funnier)); - xmlelement ------------------------------------------------------------- - -(1 row) - -SELECT xmlparse(content ''); - xmlparse ----------- - -(1 row) - -SELECT xmlparse(content ' '); - xmlparse ----------- - -(1 row) - -SELECT xmlparse(content 'abc'); - xmlparse ----------- - abc -(1 row) - -SELECT xmlparse(content 'x'); - xmlparse --------------- - x -(1 row) - -SELECT xmlparse(content '&'); -ERROR: invalid XML content -DETAIL: line 1: xmlParseEntityRef: no name -& - ^ -SELECT xmlparse(content '&idontexist;'); -ERROR: invalid XML content -DETAIL: line 1: Entity 'idontexist' not defined -&idontexist; - ^ -SELECT xmlparse(content ''); - xmlparse ---------------------------- - -(1 row) - -SELECT xmlparse(content ''); - xmlparse --------------------------------- - -(1 row) - -SELECT xmlparse(content '&idontexist;'); -ERROR: invalid XML content -DETAIL: line 1: Entity 'idontexist' not defined -&idontexist; - ^ -line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced -SELECT xmlparse(content ''); - xmlparse ---------------------- - -(1 row) - -SELECT xmlparse(document ' '); -ERROR: invalid XML document -DETAIL: line 1: Start tag expected, '<' not found -SELECT xmlparse(document 'abc'); -ERROR: invalid XML document -DETAIL: line 1: Start tag expected, '<' not found -abc -^ -SELECT xmlparse(document 'x'); - xmlparse --------------- - x -(1 row) - -SELECT xmlparse(document '&'); -ERROR: invalid XML document -DETAIL: line 1: xmlParseEntityRef: no name -& - ^ -line 1: Opening and ending tag mismatch: invalidentity line 1 and abc -SELECT xmlparse(document '&idontexist;'); -ERROR: invalid XML document -DETAIL: line 1: Entity 'idontexist' not defined -&idontexist; - ^ -line 1: Opening and ending tag mismatch: undefinedentity line 1 and abc -SELECT xmlparse(document ''); - xmlparse ---------------------------- - -(1 row) - -SELECT xmlparse(document ''); - xmlparse --------------------------------- - -(1 row) - -SELECT xmlparse(document '&idontexist;'); -ERROR: invalid XML document -DETAIL: line 1: Entity 'idontexist' not defined -&idontexist; - ^ -line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced -SELECT xmlparse(document ''); - xmlparse ---------------------- - -(1 row) - -SELECT xmlpi(name foo); - xmlpi ---------- - -(1 row) - -SELECT xmlpi(name xml); -ERROR: invalid XML processing instruction -DETAIL: XML processing instruction target name cannot be "xml". -SELECT xmlpi(name xmlstuff); - xmlpi --------------- - -(1 row) - -SELECT xmlpi(name foo, 'bar'); - xmlpi -------------- - -(1 row) - -SELECT xmlpi(name foo, 'in?>valid'); -ERROR: invalid XML processing instruction -DETAIL: XML processing instruction cannot contain "?>". -SELECT xmlpi(name foo, null); - xmlpi -------- - -(1 row) - -SELECT xmlpi(name xml, null); -ERROR: invalid XML processing instruction -DETAIL: XML processing instruction target name cannot be "xml". -SELECT xmlpi(name xmlstuff, null); - xmlpi -------- - -(1 row) - -SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"'); - xmlpi -------------------------------------------------------- - -(1 row) - -SELECT xmlpi(name foo, ' bar'); - xmlpi -------------- - -(1 row) - -SELECT xmlroot(xml '', version no value, standalone no value); - xmlroot ---------- - -(1 row) - -SELECT xmlroot(xml '', version '2.0'); - xmlroot ------------------------------ - -(1 row) - -SELECT xmlroot(xml '', version no value, standalone yes); - xmlroot ----------------------------------------------- - -(1 row) - -SELECT xmlroot(xml '', version no value, standalone yes); - xmlroot ----------------------------------------------- - -(1 row) - -SELECT xmlroot(xmlroot(xml '', version '1.0'), version '1.1', standalone no); - xmlroot ---------------------------------------------- - -(1 row) - -SELECT xmlroot('', version no value, standalone no); - xmlroot ---------------------------------------------- - -(1 row) - -SELECT xmlroot('', version no value, standalone no value); - xmlroot ---------- - -(1 row) - -SELECT xmlroot('', version no value); - xmlroot ----------------------------------------------- - -(1 row) - -SELECT xmlroot ( - xmlelement ( - name gazonk, - xmlattributes ( - 'val' AS name, - 1 + 1 AS num - ), - xmlelement ( - NAME qux, - 'foo' - ) - ), - version '1.0', - standalone yes -); - xmlroot ------------------------------------------------------------------------------------------- - foo -(1 row) - -SELECT xmlserialize(content data as character varying(20)) FROM xmltest; - xmlserialize --------------------- - one - two -(2 rows) - -SELECT xmlserialize(content 'good' as char(10)); - xmlserialize --------------- - good -(1 row) - -SELECT xmlserialize(document 'bad' as text); -ERROR: not an XML document --- indent -SELECT xmlserialize(DOCUMENT '42' AS text INDENT); - xmlserialize -------------------------- - + - + - 42+ - + - -(1 row) - -SELECT xmlserialize(CONTENT '42' AS text INDENT); - xmlserialize -------------------------- - + - + - 42+ - + - -(1 row) - --- no indent -SELECT xmlserialize(DOCUMENT '42' AS text NO INDENT); - xmlserialize -------------------------------------------- - 42 -(1 row) - -SELECT xmlserialize(CONTENT '42' AS text NO INDENT); - xmlserialize -------------------------------------------- - 42 -(1 row) - --- indent non singly-rooted xml -SELECT xmlserialize(DOCUMENT '7342' AS text INDENT); -ERROR: not an XML document -SELECT xmlserialize(CONTENT '7342' AS text INDENT); - xmlserialize ------------------------ - 73 + - + - 42+ - -(1 row) - --- indent non singly-rooted xml with mixed contents -SELECT xmlserialize(DOCUMENT 'text node73text node42' AS text INDENT); -ERROR: not an XML document -SELECT xmlserialize(CONTENT 'text node73text node42' AS text INDENT); - xmlserialize ------------------------- - text node + - 73text node+ - + - 42 + - -(1 row) - --- indent singly-rooted xml with mixed contents -SELECT xmlserialize(DOCUMENT '42text node73' AS text INDENT); - xmlserialize ---------------------------------------------- - + - + - 42 + - text node73+ - + - -(1 row) - -SELECT xmlserialize(CONTENT '42text node73' AS text INDENT); - xmlserialize ---------------------------------------------- - + - + - 42 + - text node73+ - + - -(1 row) - --- indent empty string -SELECT xmlserialize(DOCUMENT '' AS text INDENT); -ERROR: not an XML document -SELECT xmlserialize(CONTENT '' AS text INDENT); - xmlserialize --------------- - -(1 row) - --- whitespaces -SELECT xmlserialize(DOCUMENT ' ' AS text INDENT); -ERROR: not an XML document -SELECT xmlserialize(CONTENT ' ' AS text INDENT); - xmlserialize --------------- - -(1 row) - --- indent null -SELECT xmlserialize(DOCUMENT NULL AS text INDENT); - xmlserialize --------------- - -(1 row) - -SELECT xmlserialize(CONTENT NULL AS text INDENT); - xmlserialize --------------- - -(1 row) - --- indent with XML declaration -SELECT xmlserialize(DOCUMENT '73' AS text INDENT); - xmlserialize ----------------------------------------- - + - + - + - 73 + - + - -(1 row) - -SELECT xmlserialize(CONTENT '73' AS text INDENT); - xmlserialize -------------------- - + - + - 73+ - + - -(1 row) - --- indent containing DOCTYPE declaration -SELECT xmlserialize(DOCUMENT '' AS text INDENT); - xmlserialize --------------- - + - -(1 row) - -SELECT xmlserialize(CONTENT '' AS text INDENT); - xmlserialize --------------- - + - + - -(1 row) - --- indent xml with empty element -SELECT xmlserialize(DOCUMENT '' AS text INDENT); - xmlserialize --------------- - + - + - -(1 row) - -SELECT xmlserialize(CONTENT '' AS text INDENT); - xmlserialize --------------- - + - + - -(1 row) - --- 'no indent' = not using 'no indent' -SELECT xmlserialize(DOCUMENT '42' AS text) = xmlserialize(DOCUMENT '42' AS text NO INDENT); - ?column? ----------- - t -(1 row) - -SELECT xmlserialize(CONTENT '42' AS text) = xmlserialize(CONTENT '42' AS text NO INDENT); - ?column? ----------- - t -(1 row) - --- indent xml strings containing blank nodes -SELECT xmlserialize(DOCUMENT ' ' AS text INDENT); - xmlserialize --------------- - + - + - -(1 row) - -SELECT xmlserialize(CONTENT 'text node ' AS text INDENT); - xmlserialize --------------- - text node + - + - + - -(1 row) - -SELECT xml 'bar' IS DOCUMENT; - ?column? ----------- - t -(1 row) - -SELECT xml 'barfoo' IS DOCUMENT; - ?column? ----------- - f -(1 row) - -SELECT xml '' IS NOT DOCUMENT; - ?column? ----------- - f -(1 row) - -SELECT xml 'abc' IS NOT DOCUMENT; - ?column? ----------- - t -(1 row) - -SELECT '<>' IS NOT DOCUMENT; -ERROR: invalid XML content -LINE 1: SELECT '<>' IS NOT DOCUMENT; - ^ -DETAIL: line 1: StartTag: invalid element name -<> - ^ -SELECT xmlagg(data) FROM xmltest; - xmlagg --------------------------------------- - onetwo -(1 row) - -SELECT xmlagg(data) FROM xmltest WHERE id > 10; - xmlagg --------- - -(1 row) - -SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp; - xmlelement --------------------------------------------------------------------------------------------------------------------------------- - sharonsambilljeffcimlinda -(1 row) - --- Check mapping SQL identifier to XML name -SELECT xmlpi(name ":::_xml_abc135.%-&_"); - xmlpi -------------------------------------------------- - -(1 row) - -SELECT xmlpi(name "123"); - xmlpi ---------------- - -(1 row) - -PREPARE foo (xml) AS SELECT xmlconcat('', $1); -SET XML OPTION DOCUMENT; -EXECUTE foo (''); - xmlconcat --------------- - -(1 row) - -EXECUTE foo ('bad'); -ERROR: invalid XML document -LINE 1: EXECUTE foo ('bad'); - ^ -DETAIL: line 1: Start tag expected, '<' not found -bad -^ -SELECT xml ''; -ERROR: invalid XML document -LINE 1: SELECT xml ''; - ^ -DETAIL: line 1: Extra content at the end of the document - - ^ -SET XML OPTION CONTENT; -EXECUTE foo (''); - xmlconcat --------------- - -(1 row) - -EXECUTE foo ('good'); - xmlconcat ------------- - good -(1 row) - -SELECT xml ' '; - xml --------------------------------------------------------------------- - -(1 row) - -SELECT xml ' '; - xml ------------------------------- - -(1 row) - -SELECT xml ''; - xml ------------------- - -(1 row) - -SELECT xml ' oops '; -ERROR: invalid XML content -LINE 1: SELECT xml ' oops '; - ^ -DETAIL: line 1: StartTag: invalid element name - oops - ^ -SELECT xml ' '; -ERROR: invalid XML content -LINE 1: SELECT xml ' '; - ^ -DETAIL: line 1: StartTag: invalid element name - - ^ -SELECT xml ''; -ERROR: invalid XML content -LINE 1: SELECT xml ''; - ^ -DETAIL: line 1: Extra content at the end of the document - - ^ --- Test backwards parsing -CREATE VIEW xmlview1 AS SELECT xmlcomment('test'); -CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you'); -CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&'); -CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp; -CREATE VIEW xmlview5 AS SELECT xmlparse(content 'x'); -CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); -CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); -CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); -CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); -CREATE VIEW xmlview10 AS SELECT xmlserialize(document '42' AS text indent); -CREATE VIEW xmlview11 AS SELECT xmlserialize(document '42' AS character varying no indent); -SELECT table_name, view_definition FROM information_schema.views - WHERE table_name LIKE 'xmlview%' ORDER BY 1; - table_name | view_definition -------------+--------------------------------------------------------------------------------------------------------------------------------------- - xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; - xmlview10 | SELECT XMLSERIALIZE(DOCUMENT '42'::xml AS text INDENT) AS "xmlserialize"; - xmlview11 | SELECT (XMLSERIALIZE(DOCUMENT '42'::xml AS character varying NO INDENT))::character varying AS "xmlserialize"; - xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat"; - xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement"; - xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(name AS name, age AS age, salary AS pay)) AS "xmlelement" + - | FROM emp; - xmlview5 | SELECT XMLPARSE(CONTENT 'x'::text STRIP WHITESPACE) AS "xmlparse"; - xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi"; - xmlview7 | SELECT XMLROOT(''::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot"; - xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10) NO INDENT))::character(10) AS "xmlserialize"; - xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text NO INDENT) AS "xmlserialize"; -(11 rows) - --- Text XPath expressions evaluation -SELECT xpath('/value', data) FROM xmltest; - xpath ----------------------- - {one} - {two} -(2 rows) - -SELECT xpath(NULL, NULL) IS NULL FROM xmltest; - ?column? ----------- - t - t -(2 rows) - -SELECT xpath('', ''); -ERROR: empty XPath expression -CONTEXT: SQL function "xpath" statement 1 -SELECT xpath('//text()', 'number one'); - xpath ----------------- - {"number one"} -(1 row) - -SELECT xpath('//loc:piece/@id', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); - xpath -------- - {1,2} -(1 row) - -SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); - xpath ------------------------------------------------------------------------------------------------------------------------------------------------- - {"number one",""} -(1 row) - -SELECT xpath('//loc:piece', 'number one', ARRAY[ARRAY['loc', 'http://127.0.0.1']]); - xpath ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - {"number one",""} -(1 row) - -SELECT xpath('//b', 'one two three etc'); - xpath -------------------------- - {two,etc} -(1 row) - -SELECT xpath('//text()', '<'); - xpath --------- - {<} -(1 row) - -SELECT xpath('//@value', ''); - xpath --------- - {<} -(1 row) - -SELECT xpath('''<>''', ''); - xpath ---------------------------- - {<<invalid>>} -(1 row) - -SELECT xpath('count(//*)', ''); - xpath -------- - {3} -(1 row) - -SELECT xpath('count(//*)=0', ''); - xpath ---------- - {false} -(1 row) - -SELECT xpath('count(//*)=3', ''); - xpath --------- - {true} -(1 row) - -SELECT xpath('name(/*)', ''); - xpath --------- - {root} -(1 row) - -SELECT xpath('/nosuchtag', ''); - xpath -------- - {} -(1 row) - -SELECT xpath('root', ''); - xpath ------------ - {} -(1 row) - --- Round-trip non-ASCII data through xpath(). -DO $$ -DECLARE - xml_declaration text := ''; - degree_symbol text; - res xml[]; -BEGIN - -- Per the documentation, except when the server encoding is UTF8, xpath() - -- may not work on non-ASCII data. The untranslatable_character and - -- undefined_function traps below, currently dead code, will become relevant - -- if we remove this limitation. - IF current_setting('server_encoding') <> 'UTF8' THEN - RAISE LOG 'skip: encoding % unsupported for xpath', - current_setting('server_encoding'); - RETURN; - END IF; - - degree_symbol := convert_from('\xc2b0', 'UTF8'); - res := xpath('text()', (xml_declaration || - '' || degree_symbol || '')::xml); - IF degree_symbol <> res[1]::text THEN - RAISE 'expected % (%), got % (%)', - degree_symbol, convert_to(degree_symbol, 'UTF8'), - res[1], convert_to(res[1]::text, 'UTF8'); - END IF; -EXCEPTION - -- character with byte sequence 0xc2 0xb0 in encoding "UTF8" has no equivalent in encoding "LATIN8" - WHEN untranslatable_character - -- default conversion function for encoding "UTF8" to "MULE_INTERNAL" does not exist - OR undefined_function - -- unsupported XML feature - OR feature_not_supported THEN - RAISE LOG 'skip: %', SQLERRM; -END -$$; --- Test xmlexists and xpath_exists -SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); - xmlexists ------------ - f -(1 row) - -SELECT xmlexists('//town[text() = ''Cwmbran'']' PASSING BY REF 'Bidford-on-AvonCwmbranBristol'); - xmlexists ------------ - t -(1 row) - -SELECT xmlexists('count(/nosuchtag)' PASSING BY REF ''); - xmlexists ------------ - t -(1 row) - -SELECT xpath_exists('//town[text() = ''Toronto'']','Bidford-on-AvonCwmbranBristol'::xml); - xpath_exists --------------- - f -(1 row) - -SELECT xpath_exists('//town[text() = ''Cwmbran'']','Bidford-on-AvonCwmbranBristol'::xml); - xpath_exists --------------- - t -(1 row) - -SELECT xpath_exists('count(/nosuchtag)', ''::xml); - xpath_exists --------------- - t -(1 row) - -INSERT INTO xmltest VALUES (4, 'BudvarfreeCarlinglots'::xml); -INSERT INTO xmltest VALUES (5, 'MolsonfreeCarlinglots'::xml); -INSERT INTO xmltest VALUES (6, 'BudvarfreeCarlinglots'::xml); -INSERT INTO xmltest VALUES (7, 'MolsonfreeCarlinglots'::xml); -SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING data); - count -------- - 0 -(1 row) - -SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING BY REF data BY REF); - count -------- - 0 -(1 row) - -SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers' PASSING BY REF data); - count -------- - 2 -(1 row) - -SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers/name[text() = ''Molson'']' PASSING BY REF data); - count -------- - 1 -(1 row) - -SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data); - count -------- - 0 -(1 row) - -SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data); - count -------- - 2 -(1 row) - -SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data); - count -------- - 1 -(1 row) - -SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARRAY[ARRAY['myns','http://myns.com']]); - count -------- - 0 -(1 row) - -SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers',data,ARRAY[ARRAY['myns','http://myns.com']]); - count -------- - 2 -(1 row) - -SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers/myns:name[text() = ''Molson'']',data,ARRAY[ARRAY['myns','http://myns.com']]); - count -------- - 1 -(1 row) - -CREATE TABLE query ( expr TEXT ); -INSERT INTO query VALUES ('/menu/beers/cost[text() = ''lots'']'); -SELECT COUNT(id) FROM xmltest, query WHERE xmlexists(expr PASSING BY REF data); - count -------- - 2 -(1 row) - --- Test xml_is_well_formed and variants -SELECT xml_is_well_formed_document('bar'); - xml_is_well_formed_document ------------------------------ - t -(1 row) - -SELECT xml_is_well_formed_document('abc'); - xml_is_well_formed_document ------------------------------ - f -(1 row) - -SELECT xml_is_well_formed_content('bar'); - xml_is_well_formed_content ----------------------------- - t -(1 row) - -SELECT xml_is_well_formed_content('abc'); - xml_is_well_formed_content ----------------------------- - t -(1 row) - -SET xmloption TO DOCUMENT; -SELECT xml_is_well_formed('abc'); - xml_is_well_formed --------------------- - f -(1 row) - -SELECT xml_is_well_formed('<>'); - xml_is_well_formed --------------------- - f -(1 row) - -SELECT xml_is_well_formed(''); - xml_is_well_formed --------------------- - t -(1 row) - -SELECT xml_is_well_formed('bar'); - xml_is_well_formed --------------------- - t -(1 row) - -SELECT xml_is_well_formed('barbaz'); - xml_is_well_formed --------------------- - f -(1 row) - -SELECT xml_is_well_formed('number one'); - xml_is_well_formed --------------------- - t -(1 row) - -SELECT xml_is_well_formed('bar'); - xml_is_well_formed --------------------- - f -(1 row) - -SELECT xml_is_well_formed('bar'); - xml_is_well_formed --------------------- - t -(1 row) - -SELECT xml_is_well_formed('&'); - xml_is_well_formed --------------------- - f -(1 row) - -SELECT xml_is_well_formed('&idontexist;'); - xml_is_well_formed --------------------- - f -(1 row) - -SELECT xml_is_well_formed(''); - xml_is_well_formed --------------------- - t -(1 row) - -SELECT xml_is_well_formed(''); - xml_is_well_formed --------------------- - t -(1 row) - -SELECT xml_is_well_formed('&idontexist;'); - xml_is_well_formed --------------------- - f -(1 row) - -SET xmloption TO CONTENT; -SELECT xml_is_well_formed('abc'); - xml_is_well_formed --------------------- - t -(1 row) - --- Since xpath() deals with namespaces, it's a bit stricter about --- what's well-formed and what's not. If we don't obey these rules --- (i.e. ignore namespace-related errors from libxml), xpath() --- fails in subtle ways. The following would for example produce --- the xml value --- --- which is invalid because '<' may not appear un-escaped in --- attribute values. --- Since different libxml versions emit slightly different --- error messages, we suppress the DETAIL in this test. -\set VERBOSITY terse -SELECT xpath('/*', ''); -ERROR: could not parse XML document -\set VERBOSITY default --- Again, the XML isn't well-formed for namespace purposes -SELECT xpath('/*', ''); -ERROR: could not parse XML document -DETAIL: line 1: Namespace prefix nosuchprefix on tag is not defined - - ^ -CONTEXT: SQL function "xpath" statement 1 --- XPath deprecates relative namespaces, but they're not supposed to --- throw an error, only a warning. -SELECT xpath('/*', ''); -WARNING: line 1: xmlns: URI relative is not absolute - - ^ - xpath --------------------------------------- - {""} -(1 row) - --- External entity references should not leak filesystem information. -SELECT XMLPARSE(DOCUMENT ']>&c;'); - xmlparse ------------------------------------------------------------------ - ]>&c; -(1 row) - -SELECT XMLPARSE(DOCUMENT ']>&c;'); - xmlparse ------------------------------------------------------------------------ - ]>&c; -(1 row) - --- This might or might not load the requested DTD, but it mustn't throw error. -SELECT XMLPARSE(DOCUMENT ' '); - xmlparse ------------------------------------------------------------------------------------------------------------------------------------------------------- -   -(1 row) - --- XMLPATH tests -CREATE TABLE xmldata(data xml); -INSERT INTO xmldata VALUES(' - - AU - Australia - 3 - - - CN - China - 3 - - - HK - HongKong - 3 - - - IN - India - 3 - - - JP - Japan - 3Sinzo Abe - - - SG - Singapore - 3791 - -'); --- XMLTABLE with columns -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+--------------+------------+-----------+------+------+--------------- - 1 | 1 | Australia | AU | 3 | | | not specified - 2 | 2 | China | CN | 3 | | | not specified - 3 | 3 | HongKong | HK | 3 | | | not specified - 4 | 4 | India | IN | 3 | | | not specified - 5 | 5 | Japan | JP | 3 | | | Sinzo Abe - 6 | 6 | Singapore | SG | 3 | 791 | km | not specified -(6 rows) - -CREATE VIEW xmltableview1 AS SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME/text()' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); -SELECT * FROM xmltableview1; - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+--------------+------------+-----------+------+------+--------------- - 1 | 1 | Australia | AU | 3 | | | not specified - 2 | 2 | China | CN | 3 | | | not specified - 3 | 3 | HongKong | HK | 3 | | | not specified - 4 | 4 | India | IN | 3 | | | not specified - 5 | 5 | Japan | JP | 3 | | | Sinzo Abe - 6 | 6 | Singapore | SG | 3 | 791 | km | not specified -(6 rows) - -\sv xmltableview1 -CREATE OR REPLACE VIEW public.xmltableview1 AS - SELECT "xmltable".id, - "xmltable"._id, - "xmltable".country_name, - "xmltable".country_id, - "xmltable".region_id, - "xmltable".size, - "xmltable".unit, - "xmltable".premier_name - FROM ( SELECT xmldata.data - FROM xmldata) x, - LATERAL XMLTABLE(('/ROWS/ROW'::text) PASSING (x.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) -EXPLAIN (COSTS OFF) SELECT * FROM xmltableview1; - QUERY PLAN ------------------------------------------ - Nested Loop - -> Seq Scan on xmldata - -> Table Function Scan on "xmltable" -(3 rows) - -EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; - QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Nested Loop - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - -> Seq Scan on public.xmldata - Output: xmldata.data - -> Table Function Scan on "xmltable" - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME/text()'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) -(7 rows) - --- errors -SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); -ERROR: XMLTABLE function has 1 columns available but 2 columns specified -SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_not_null 1) AS f (v1); -ERROR: option name "__pg__is_not_null" cannot be used in XMLTABLE -LINE 1: ...MLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_n... - ^ --- XMLNAMESPACES tests -SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), - '/zz:rows/zz:row' - PASSING '10' - COLUMNS a int PATH 'zz:a'); - a ----- - 10 -(1 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'); -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' - COLUMNS a int PATH 'a'); -ERROR: DEFAULT namespace is not supported -SELECT * FROM XMLTABLE('.' - PASSING '' - COLUMNS a text PATH 'foo/namespace::node()'); - a --------------------------------------- - http://www.w3.org/XML/1998/namespace -(1 row) - --- used in prepare statements -PREPARE pp AS -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); -EXECUTE pp; - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+--------------+------------+-----------+------+------+--------------- - 1 | 1 | Australia | AU | 3 | | | not specified - 2 | 2 | China | CN | 3 | | | not specified - 3 | 3 | HongKong | HK | 3 | | | not specified - 4 | 4 | India | IN | 3 | | | not specified - 5 | 5 | Japan | JP | 3 | | | Sinzo Abe - 6 | 6 | Singapore | SG | 3 | 791 | km | not specified -(6 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int); - COUNTRY_NAME | REGION_ID ---------------+----------- - India | 3 - Japan | 3 -(2 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY, "COUNTRY_NAME" text, "REGION_ID" int); - id | COUNTRY_NAME | REGION_ID -----+--------------+----------- - 1 | India | 3 - 2 | Japan | 3 -(2 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int); - id | COUNTRY_NAME | REGION_ID -----+--------------+----------- - 4 | India | 3 - 5 | Japan | 3 -(2 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id'); - id ----- - 4 - 5 -(2 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id FOR ORDINALITY); - id ----- - 1 - 2 -(2 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH '.'); - id | COUNTRY_NAME | REGION_ID | rawdata -----+--------------+-----------+------------------------------------------------------------------ - 4 | India | 3 | + - | | | IN + - | | | India + - | | | 3 + - | | | - 5 | Japan | 3 | + - | | | JP + - | | | Japan + - | | | 3Sinzo Abe+ - | | | -(2 rows) - -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS id int PATH '@id', "COUNTRY_NAME" text, "REGION_ID" int, rawdata xml PATH './*'); - id | COUNTRY_NAME | REGION_ID | rawdata -----+--------------+-----------+----------------------------------------------------------------------------------------------------------------------------- - 4 | India | 3 | INIndia3 - 5 | Japan | 3 | JPJapan3Sinzo Abe -(2 rows) - -SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text); - element ----------------------- - a1aa2a bbbbxxxcccc -(1 row) - -SELECT * FROM xmltable('/root' passing 'a1aa2a bbbbxxxcccc' COLUMNS element text PATH 'element/text()'); -- should fail -ERROR: more than one value returned by column XPath expression --- CDATA test -select * from xmltable('d/r' passing ' &"<>!foo]]>2' columns c text); - c -------------------------- - &"<>!foo - 2 -(2 rows) - --- XML builtin entities -SELECT * FROM xmltable('/x/a' PASSING ''"&<>' COLUMNS ent text); - ent ------ - ' - " - & - < - > -(5 rows) - -SELECT * FROM xmltable('/x/a' PASSING ''"&<>' COLUMNS ent xml); - ent ------------------- - ' - " - & - < - > -(5 rows) - -EXPLAIN (VERBOSE, COSTS OFF) -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); - QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - Nested Loop - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - -> Seq Scan on public.xmldata - Output: xmldata.data - -> Table Function Scan on "xmltable" - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) -(7 rows) - --- test qual -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; - COUNTRY_NAME | REGION_ID ---------------+----------- - Japan | 3 -(1 row) - -EXPLAIN (VERBOSE, COSTS OFF) -SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; - QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Nested Loop - Output: f."COUNTRY_NAME", f."REGION_ID" - -> Seq Scan on public.xmldata - Output: xmldata.data - -> Table Function Scan on "xmltable" f - Output: f."COUNTRY_NAME", f."REGION_ID" - Table Function Call: XMLTABLE(('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]'::text) PASSING (xmldata.data) COLUMNS "COUNTRY_NAME" text, "REGION_ID" integer) - Filter: (f."COUNTRY_NAME" = 'Japan'::text) -(8 rows) - -EXPLAIN (VERBOSE, FORMAT JSON, COSTS OFF) -SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; - QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - [ + - { + - "Plan": { + - "Node Type": "Nested Loop", + - "Parallel Aware": false, + - "Async Capable": false, + - "Join Type": "Inner", + - "Disabled": false, + - "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + - "Inner Unique": false, + - "Plans": [ + - { + - "Node Type": "Seq Scan", + - "Parent Relationship": "Outer", + - "Parallel Aware": false, + - "Async Capable": false, + - "Relation Name": "xmldata", + - "Schema": "public", + - "Alias": "xmldata", + - "Disabled": false, + - "Output": ["xmldata.data"] + - }, + - { + - "Node Type": "Table Function Scan", + - "Parent Relationship": "Inner", + - "Parallel Aware": false, + - "Async Capable": false, + - "Table Function Name": "xmltable", + - "Alias": "f", + - "Disabled": false, + - "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + - "Table Function Call": "XMLTABLE(('/ROWS/ROW[COUNTRY_NAME=\"Japan\" or COUNTRY_NAME=\"India\"]'::text) PASSING (xmldata.data) COLUMNS \"COUNTRY_NAME\" text, \"REGION_ID\" integer)",+ - "Filter": "(f.\"COUNTRY_NAME\" = 'Japan'::text)" + - } + - ] + - } + - } + - ] -(1 row) - --- should to work with more data -INSERT INTO xmldata VALUES(' - - CZ - Czech Republic - 2Milos Zeman - - - DE - Germany - 2 - - - FR - France - 2 - -'); -INSERT INTO xmldata VALUES(' - - EG - Egypt - 1 - - - SD - Sudan - 1 - -'); -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+----------------+------------+-----------+------+------+--------------- - 1 | 1 | Australia | AU | 3 | | | not specified - 2 | 2 | China | CN | 3 | | | not specified - 3 | 3 | HongKong | HK | 3 | | | not specified - 4 | 4 | India | IN | 3 | | | not specified - 5 | 5 | Japan | JP | 3 | | | Sinzo Abe - 6 | 6 | Singapore | SG | 3 | 791 | km | not specified - 10 | 1 | Czech Republic | CZ | 2 | | | Milos Zeman - 11 | 2 | Germany | DE | 2 | | | not specified - 12 | 3 | France | FR | 2 | | | not specified - 20 | 1 | Egypt | EG | 1 | | | not specified - 21 | 2 | Sudan | SD | 1 | | | not specified -(11 rows) - -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') - WHERE region_id = 2; - id | _id | country_name | country_id | region_id | size | unit | premier_name -----+-----+----------------+------------+-----------+------+------+--------------- - 10 | 1 | Czech Republic | CZ | 2 | | | Milos Zeman - 11 | 2 | Germany | DE | 2 | | | not specified - 12 | 3 | France | FR | 2 | | | not specified -(3 rows) - -EXPLAIN (VERBOSE, COSTS OFF) -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE', - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified') - WHERE region_id = 2; - QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - Nested Loop - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - -> Seq Scan on public.xmldata - Output: xmldata.data - -> Table Function Scan on "xmltable" - Output: "xmltable".id, "xmltable"._id, "xmltable".country_name, "xmltable".country_id, "xmltable".region_id, "xmltable".size, "xmltable".unit, "xmltable".premier_name - Table Function Call: XMLTABLE(('/ROWS/ROW'::text) PASSING (xmldata.data) COLUMNS id integer PATH ('@id'::text), _id FOR ORDINALITY, country_name text PATH ('COUNTRY_NAME'::text) NOT NULL, country_id text PATH ('COUNTRY_ID'::text), region_id integer PATH ('REGION_ID'::text), size double precision PATH ('SIZE'::text), unit text PATH ('SIZE/@unit'::text), premier_name text DEFAULT ('not specified'::text) PATH ('PREMIER_NAME'::text)) - Filter: ("xmltable".region_id = 2) -(8 rows) - --- should fail, NULL value -SELECT xmltable.* - FROM (SELECT data FROM xmldata) x, - LATERAL XMLTABLE('/ROWS/ROW' - PASSING data - COLUMNS id int PATH '@id', - _id FOR ORDINALITY, - country_name text PATH 'COUNTRY_NAME' NOT NULL, - country_id text PATH 'COUNTRY_ID', - region_id int PATH 'REGION_ID', - size float PATH 'SIZE' NOT NULL, - unit text PATH 'SIZE/@unit', - premier_name text PATH 'PREMIER_NAME' DEFAULT 'not specified'); -ERROR: null is not allowed in column "size" --- if all is ok, then result is empty --- one line xml test -WITH - x AS (SELECT proname, proowner, procost::numeric, pronargs, - array_to_string(proargnames,',') as proargnames, - case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes - FROM pg_proc WHERE proname = 'f_leak'), - y AS (SELECT xmlelement(name proc, - xmlforest(proname, proowner, - procost, pronargs, - proargnames, proargtypes)) as proc - FROM x), - z AS (SELECT xmltable.* - FROM y, - LATERAL xmltable('/proc' PASSING proc - COLUMNS proname name, - proowner oid, - procost float, - pronargs int, - proargnames text, - proargtypes text)) - SELECT * FROM z - EXCEPT SELECT * FROM x; - proname | proowner | procost | pronargs | proargnames | proargtypes ----------+----------+---------+----------+-------------+------------- -(0 rows) - --- multi line xml test, result should be empty too -WITH - x AS (SELECT proname, proowner, procost::numeric, pronargs, - array_to_string(proargnames,',') as proargnames, - case when proargtypes <> '' then array_to_string(proargtypes::oid[],',') end as proargtypes - FROM pg_proc), - y AS (SELECT xmlelement(name data, - xmlagg(xmlelement(name proc, - xmlforest(proname, proowner, procost, - pronargs, proargnames, proargtypes)))) as doc - FROM x), - z AS (SELECT xmltable.* - FROM y, - LATERAL xmltable('/data/proc' PASSING doc - COLUMNS proname name, - proowner oid, - procost float, - pronargs int, - proargnames text, - proargtypes text)) - SELECT * FROM z - EXCEPT SELECT * FROM x; - proname | proowner | procost | pronargs | proargnames | proargtypes ----------+----------+---------+----------+-------------+------------- -(0 rows) - -CREATE TABLE xmltest2(x xml, _path text); -INSERT INTO xmltest2 VALUES('1', 'A'); -INSERT INTO xmltest2 VALUES('2', 'B'); -INSERT INTO xmltest2 VALUES('3', 'C'); -INSERT INTO xmltest2 VALUES('2', 'D'); -SELECT xmltable.* FROM xmltest2, LATERAL xmltable('/d/r' PASSING x COLUMNS a int PATH '' || lower(_path) || 'c'); - a ---- - 1 - 2 - 3 - 2 -(4 rows) - -SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH '.'); - a ---- - 1 - 2 - 3 - 2 -(4 rows) - -SELECT xmltable.* FROM xmltest2, LATERAL xmltable(('/d/r/' || lower(_path) || 'c') PASSING x COLUMNS a int PATH 'x' DEFAULT ascii(_path) - 54); - a ----- - 11 - 12 - 13 - 14 -(4 rows) - --- XPath result can be boolean or number too -SELECT * FROM XMLTABLE('*' PASSING 'a' COLUMNS a xml PATH '.', b text PATH '.', c text PATH '"hi"', d boolean PATH '. = "a"', e integer PATH 'string-length(.)'); - a | b | c | d | e -----------+---+----+---+--- - a | a | hi | t | 1 -(1 row) - -\x -SELECT * FROM XMLTABLE('*' PASSING 'pre&deeppost' COLUMNS x xml PATH '/e/n2', y xml PATH '/'); --[ RECORD 1 ]----------------------------------------------------------- -x | &deep -y | pre&deeppost+ - | - -\x -SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '""', b xml PATH '""'); - a | b ---------+-------------- - | <foo/> -(1 row) - -SELECT xmltext(NULL); - xmltext ---------- - -(1 row) - -SELECT xmltext(''); - xmltext ---------- - -(1 row) - -SELECT xmltext(' '); - xmltext ---------- - -(1 row) - -SELECT xmltext('foo `$_-+?=*^%!|/\()[]{}'); - xmltext --------------------------- - foo `$_-+?=*^%!|/\()[]{} -(1 row) - -SELECT xmltext('foo & <"bar">'); - xmltext ------------------------------------ - foo & <"bar"> -(1 row) - -SELECT xmltext('x'|| '

73

'::xml || .42 || true || 'j'::char); - xmltext ---------------------------------- - x<P>73</P>0.42truej -(1 row) - diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index b751783e833..d9660cddbdf 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -539,27 +539,57 @@ alter table t2 alter column z drop not null; create unique index t2_z_uidx on t2(z) nulls not distinct; explain (costs off) select y,z from t2 group by y,z; +drop table t1 cascade; +drop table t2; +drop table t3; +drop table p_t1; + +-- A composite type used by the tests below to exercise the asymmetry +-- between record_ops (per-field equality, the default) and record_image_ops +-- (bytewise equality): values like row(1.0) and row(1.00) are field-equal +-- but byte-distinct. +create type avg_rec as (x numeric); + -- A unique index proves uniqueness only under its own opfamily. When the -- GROUP BY's eqop comes from a different opfamily with looser equality, -- rows the index regards as distinct can collapse into one GROUP BY group, -- so the index is not usable for removing redundant columns. -create type t_rec as (x numeric); -create temp table t_opf (a t_rec not null, b text); +create temp table t_opf (a avg_rec not null, b text); create unique index on t_opf (a record_image_ops); -- (1.0) and (1.00) are bytewise distinct but logically equal as records; -- the index admits both, but GROUP BY a (default record_ops) would merge -- them, so b must be retained as a grouping key. -insert into t_opf values (row(1.0)::t_rec, 'X'), (row(1.00)::t_rec, 'Y'); +insert into t_opf values (row(1.0)::avg_rec, 'X'), (row(1.00)::avg_rec, 'Y'); explain (costs off) select a, b from t_opf group by a, b order by b; select a, b from t_opf group by a, b order by b; drop table t_opf; -drop type t_rec; -drop table t1 cascade; -drop table t2; -drop table t3; -drop table p_t1; +-- A HAVING clause that uses an equality operator from a different opfamily +-- than the GROUP BY's eqop must NOT be pushed down to WHERE. +create temp table t_having (id int, a avg_rec); +insert into t_having values + (1, row(1.0)::avg_rec), + (2, row(1.00)::avg_rec), + (3, row(2)::avg_rec); + +-- the clause must stay in HAVING +explain (costs off) +select a, count(*) from t_having group by a having a *= row(1.0)::avg_rec; +select a, count(*) from t_having group by a having a *= row(1.0)::avg_rec; + +-- the clause must stay in HAVING +explain (costs off) +select a, count(*) from t_having group by a having a *= any (array[row(1.0)::avg_rec]); +select a, count(*) from t_having group by a having a *= any (array[row(1.0)::avg_rec]); + +-- the clause can be pushed down to WHERE +explain (costs off) +select a, count(*) from t_having group by a having a = row(1.0)::avg_rec; +select a, count(*) from t_having group by a having a = row(1.0)::avg_rec; + +drop table t_having; +drop type avg_rec; -- -- Test GROUP BY matching of join columns that are type-coerced due to USING diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index e1937a85ba7..336bf77b5e6 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -1157,7 +1157,9 @@ copy attest from stdin; \. select * from attest; copy attest(a) from stdin; +\. copy attest("........pg.dropped.1........") from stdin; +\. copy attest(b,c) from stdin; 31 32 \. diff --git a/src/test/regress/sql/collate.icu.utf8.sql b/src/test/regress/sql/collate.icu.utf8.sql index 90ea90d64e0..a17e8ae27f9 100644 --- a/src/test/regress/sql/collate.icu.utf8.sql +++ b/src/test/regress/sql/collate.icu.utf8.sql @@ -564,6 +564,12 @@ CREATE COLLATION case_insensitive (provider = icu, locale = '@colStrength=second SELECT 'abc' <= 'ABC' COLLATE case_sensitive, 'abc' >= 'ABC' COLLATE case_sensitive; SELECT 'abc' <= 'ABC' COLLATE case_insensitive, 'abc' >= 'ABC' COLLATE case_insensitive; +SELECT 'AB' LIKE 'ab' COLLATE case_insensitive AS t; +SELECT 'AB' LIKE 'a\b' COLLATE case_insensitive AS t; +SELECT 'AB' LIKE '\ab' COLLATE case_insensitive AS t; +SELECT 'AB' LIKE '\a%' COLLATE case_insensitive AS t; +SELECT 'AB' LIKE '\a\%' COLLATE case_insensitive AS f; + -- tests with array_sort SELECT array_sort('{a,B}'::text[] COLLATE case_insensitive); SELECT array_sort('{a,B}'::text[] COLLATE "C"); @@ -741,6 +747,16 @@ CREATE UNIQUE INDEX ON test3ci (x); -- error SELECT string_to_array('ABC,DEF,GHI' COLLATE case_insensitive, ',', 'abc'); SELECT string_to_array('ABCDEFGHI' COLLATE case_insensitive, NULL, 'b'); +-- These queries should be able to use the index on test1ci.x: +SET enable_seqscan = off; +SET enable_indexonlyscan = off; +EXPLAIN (COSTS OFF) +SELECT * FROM test1ci WHERE x ~ '^abc$' COLLATE "C"; +EXPLAIN (COSTS OFF) +SELECT * FROM test1ci WHERE x LIKE 'abc' COLLATE case_insensitive; +RESET enable_seqscan; +RESET enable_indexonlyscan; + -- Test HAVING-to-WHERE pushdown with nondeterministic collations. -- When a HAVING clause uses a different collation than the GROUP BY's -- nondeterministic collation, it must not be pushed to WHERE, otherwise @@ -757,31 +773,39 @@ EXPLAIN (COSTS OFF) SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive; SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive; --- Negative: function applied to grouped column with conflicting collation +-- Negative: function over the grouping column, conflicting collation EXPLAIN (COSTS OFF) SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x) = 'ABC' COLLATE case_sensitive; SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x) = 'ABC' COLLATE case_sensitive; --- Positive: function with same collation as GROUP BY +-- Negative: function over the grouping column whose result is compared as an +-- integer, under no collation +EXPLAIN (COSTS OFF) +SELECT x, count(*) FROM test3ci GROUP BY x HAVING ascii(x) = 97; +SELECT x, count(*) FROM test3ci GROUP BY x HAVING ascii(x) = 97; + +-- Negative: a function wrapping the grouping column is not provably safe even +-- when compared under the matching collation, since the function need not +-- preserve the collation's equality EXPLAIN (COSTS OFF) SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x) = 'ABC' COLLATE case_insensitive; SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x) = 'ABC' COLLATE case_insensitive; --- Negative: inner function has conflicting collation, even though outer --- operator's collation matches GROUP BY due to a COLLATE override +-- Negative: same, with the grouping column wrapped in a function whose input +-- collation is overridden; still not a direct operand, so it stays in HAVING EXPLAIN (COSTS OFF) SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x COLLATE case_sensitive) COLLATE case_insensitive = 'ABC'; SELECT x, count(*) FROM test3ci GROUP BY x HAVING upper(x COLLATE case_sensitive) COLLATE case_insensitive = 'ABC'; -- Mixed AND: conflicting clause stays in HAVING, safe clause pushed to WHERE EXPLAIN (COSTS OFF) -SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_sensitive AND length(x) > 1; -SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_sensitive AND length(x) > 1; +SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_sensitive AND x >= 'a' COLLATE case_insensitive; +SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_sensitive AND x >= 'a' COLLATE case_insensitive; -- Positive: AND of two safe clauses, both can be pushed EXPLAIN (COSTS OFF) -SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive AND length(x) > 1; -SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive AND length(x) > 1; +SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive AND x >= 'a' COLLATE case_insensitive; +SELECT x, count(*) FROM test3ci GROUP BY x HAVING x = 'abc' COLLATE case_insensitive AND x >= 'a' COLLATE case_insensitive; -- Negative: OR with a conflicting clause: must stay in HAVING EXPLAIN (COSTS OFF) @@ -822,6 +846,111 @@ EXPLAIN (COSTS OFF) SELECT x, count(*) FROM test3cs GROUP BY x HAVING x = 'abc' COLLATE case_insensitive ORDER BY 1; SELECT x, count(*) FROM test3cs GROUP BY x HAVING x = 'abc' COLLATE case_insensitive ORDER BY 1; +-- Test WHERE-pushdown past a grouping layer (DISTINCT, DISTINCT ON, window +-- PARTITION BY) when the qual applies a different collation than the +-- grouping column's nondeterministic collation. The qual would distinguish +-- rows the grouping considers equal, so it must NOT be pushed inside the +-- subquery. +CREATE TABLE pushdown_ci (id int, x text COLLATE case_insensitive); +INSERT INTO pushdown_ci VALUES (1, 'ABC'), (2, 'abc'), (3, 'def'); + +-- DISTINCT ON: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT ON (x) id, x FROM pushdown_ci ORDER BY x, id) s +WHERE x = 'abc' COLLATE case_sensitive; + +SELECT * FROM (SELECT DISTINCT ON (x) id, x FROM pushdown_ci ORDER BY x, id) s +WHERE x = 'abc' COLLATE case_sensitive; + +-- Window function PARTITION BY: conflict, qual stays outside the WindowAgg +EXPLAIN (COSTS OFF) +SELECT * FROM ( + SELECT id, x, count(*) OVER (PARTITION BY x) AS cnt FROM pushdown_ci +) s +WHERE x = 'abc' COLLATE case_sensitive; + +SELECT * FROM ( + SELECT id, x, count(*) OVER (PARTITION BY x) AS cnt FROM pushdown_ci +) s +WHERE x = 'abc' COLLATE case_sensitive; + +-- Plain DISTINCT: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT x FROM pushdown_ci) s +WHERE x = 'abc' COLLATE case_sensitive; + +SELECT * FROM (SELECT DISTINCT x FROM pushdown_ci) s +WHERE x = 'abc' COLLATE case_sensitive; + +-- Positive: matching collation, safe to push past the grouping +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT ON (x) id, x FROM pushdown_ci ORDER BY x, id) s +WHERE x = 'abc' COLLATE case_insensitive; + +SELECT * FROM (SELECT DISTINCT ON (x) id, x FROM pushdown_ci ORDER BY x, id) s +WHERE x = 'abc' COLLATE case_insensitive; + +-- Set operations: any operation other than UNION ALL groups rows by equality, +-- so the same collation-mismatch rules apply. +CREATE TABLE pushdown_ci2 (x text COLLATE case_insensitive); +INSERT INTO pushdown_ci2 VALUES ('abc'); + +-- UNION: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT x FROM pushdown_ci UNION SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + +SELECT * FROM (SELECT x FROM pushdown_ci UNION SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + +-- INTERSECT: same +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT x FROM pushdown_ci INTERSECT SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + +SELECT * FROM (SELECT x FROM pushdown_ci INTERSECT SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + +-- INTERSECT ALL: still groups +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT x FROM pushdown_ci INTERSECT ALL SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + +SELECT * FROM (SELECT x FROM pushdown_ci INTERSECT ALL SELECT x FROM pushdown_ci2) s +WHERE x = 'abc' COLLATE case_sensitive; + +-- Negative: a function over a grouping column with a nondeterministic +-- collation, whose result is compared under no collation (an integer +-- comparison), can distinguish values the grouping considers equal. +-- PARTITION BY +EXPLAIN (COSTS OFF) +SELECT * FROM ( + SELECT id, x, count(*) OVER (PARTITION BY x) AS cnt FROM pushdown_ci +) s +WHERE ascii(x) = 97; + +SELECT * FROM ( + SELECT id, x, count(*) OVER (PARTITION BY x) AS cnt FROM pushdown_ci +) s +WHERE ascii(x) = 97; + +-- Same with DISTINCT +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT x FROM pushdown_ci) s WHERE ascii(x) = 97; + +SELECT * FROM (SELECT DISTINCT x FROM pushdown_ci) s WHERE ascii(x) = 97; + +-- Same with Set operations +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT x FROM pushdown_ci UNION SELECT x FROM pushdown_ci2) s +WHERE ascii(x) = 97; + +SELECT * FROM (SELECT x FROM pushdown_ci UNION SELECT x FROM pushdown_ci2) s +WHERE ascii(x) = 97; + +DROP TABLE pushdown_ci2; +DROP TABLE pushdown_ci; + -- bpchar CREATE TABLE test1bpci (x char(3) COLLATE case_insensitive); CREATE TABLE test2bpci (x char(3) COLLATE case_insensitive); @@ -956,6 +1085,13 @@ SELECT U&'\0061\0308bc' LIKE U&'_\00e4bc' COLLATE ignore_accents; -- escape character at end of pattern SELECT 'foox' LIKE 'foo\' COLLATE ignore_accents; +-- literal backslash with nondeterministic collation (bug #19474) +SELECT 'back\slash' COLLATE ignore_accents LIKE 'back\slash%' ESCAPE '#'; +SELECT 'aäb' COLLATE ignore_accents LIKE 'a#äb' ESCAPE '#' AS multibyte_escape; +SELECT 'a\äb' COLLATE ignore_accents LIKE 'a\äb%' ESCAPE '#' AS backslash_multibyte; +SELECT 'a\b%c' COLLATE ignore_accents LIKE 'a#\b#%%c' ESCAPE '#' AS mixed_escapes; +SELECT 'backslash' COLLATE ignore_accents LIKE 'back\\slash%'; + -- foreign keys (mixing different nondeterministic collations not allowed) CREATE TABLE test10pk (x text COLLATE case_sensitive PRIMARY KEY); CREATE TABLE test10fk (x text COLLATE case_insensitive REFERENCES test10pk (x) ON UPDATE CASCADE ON DELETE CASCADE); -- error diff --git a/src/test/regress/sql/collate.linux.utf8.sql b/src/test/regress/sql/collate.linux.utf8.sql index 132d13af0a8..6d726ee9c99 100644 --- a/src/test/regress/sql/collate.linux.utf8.sql +++ b/src/test/regress/sql/collate.linux.utf8.sql @@ -188,6 +188,9 @@ SELECT to_date('01 ŞUB 2010', 'DD TMMON YYYY'); SELECT to_date('01 Şub 2010', 'DD TMMON YYYY'); SELECT to_date('1234567890ab 2010', 'TMMONTH YYYY'); -- fail +SELECT to_date('01 Aralık 2010', 'DD TMMONTH YYYY'); +SELECT to_date('01 aralık 2010', 'DD TMMONTH YYYY'); +SELECT to_date('2010 01 araLık', 'YYYY DD TMMONTH'); -- backwards parsing diff --git a/src/test/regress/sql/collate.sql b/src/test/regress/sql/collate.sql index 4b0e4472c3f..b018da13f24 100644 --- a/src/test/regress/sql/collate.sql +++ b/src/test/regress/sql/collate.sql @@ -302,6 +302,16 @@ CREATE COLLATION coll_dup_chk (LC_CTYPE = "POSIX", LOCALE = ''); -- FROM conflicts with any other option CREATE COLLATION coll_dup_chk (FROM = "C", VERSION = "1"); +-- Regex exact-match optimization should use an index even when the expression +-- and index have different collations, so long as the expression's collation +-- is deterministic. This example tests what we want because the optimizer +-- does not perceive "C" collation (used by the system catalogs) as identical +-- to "POSIX" collation. +EXPLAIN (COSTS OFF) +SELECT * FROM pg_class WHERE relname ~ '^pg_class$' COLLATE "POSIX"; +EXPLAIN (COSTS OFF) +SELECT * FROM pg_class WHERE relname LIKE 'pg\_class' COLLATE "POSIX"; + -- -- Clean up. Many of these table names will be re-used if the user is -- trying to run any platform-specific collation tests later, so we diff --git a/src/test/regress/sql/collate.utf8.sql b/src/test/regress/sql/collate.utf8.sql index d6d14220ab3..22aecee3a60 100644 --- a/src/test/regress/sql/collate.utf8.sql +++ b/src/test/regress/sql/collate.utf8.sql @@ -128,6 +128,7 @@ SELECT lower('0Σ' COLLATE PG_UNICODE_FAST); -- 0030 03A3 SELECT lower('ΑΣΑ' COLLATE PG_UNICODE_FAST); -- 0391 03A3 0391 SELECT lower('ἈΣ̓Α' COLLATE PG_UNICODE_FAST); -- 0391 0343 03A3 0343 0391 SELECT lower('ᾼΣͅΑ' COLLATE PG_UNICODE_FAST); -- 0391 0345 03A3 0345 0391 +SELECT lower(U&'\0300\03A3' COLLATE PG_UNICODE_FAST); -- properties diff --git a/src/test/regress/sql/compression_pglz.sql b/src/test/regress/sql/compression_pglz.sql index a44af02afb7..dbd37f7d4eb 100644 --- a/src/test/regress/sql/compression_pglz.sql +++ b/src/test/regress/sql/compression_pglz.sql @@ -48,6 +48,16 @@ SELECT test_pglz_decompress('\x01ff'::bytea, 1024, true); SELECT test_pglz_decompress('\x010f01'::bytea, 1024, false); SELECT test_pglz_decompress('\x010f01'::bytea, 1024, true); +-- Corrupted compressed data. Set control bit with a valid 2-byte match +-- tag where offset exceeds output written. +SELECT test_pglz_decompress('\x011001'::bytea, 1024, false); +SELECT test_pglz_decompress('\x011001'::bytea, 1024, true); + +-- Corrupted compressed data. Set control bit with a valid 2-byte match +-- tag where offset is 0. +SELECT test_pglz_decompress('\x010300'::bytea, 1024, false); +SELECT test_pglz_decompress('\x010300'::bytea, 1024, true); + -- Clean up DROP FUNCTION test_pglz_compress; DROP FUNCTION test_pglz_decompress; diff --git a/src/test/regress/sql/constraints.sql b/src/test/regress/sql/constraints.sql index 1e9989698b6..99846e7cc6a 100644 --- a/src/test/regress/sql/constraints.sql +++ b/src/test/regress/sql/constraints.sql @@ -702,6 +702,9 @@ DROP TABLE ATACC1, ATACC2, ATACC3; -- NOT NULL NO INHERIT is not possible on partitioned tables CREATE TABLE ATACC1 (a int NOT NULL NO INHERIT) PARTITION BY LIST (a); CREATE TABLE ATACC1 (a int, NOT NULL a NO INHERIT) PARTITION BY LIST (a); +CREATE TABLE ATACC1 (a int, CONSTRAINT a_is_not_null NOT NULL a) PARTITION BY LIST (a); +ALTER TABLE ATACC1 ALTER CONSTRAINT a_is_not_null NO INHERIT; +DROP TABLE ATACC1; -- it's not possible to override a no-inherit constraint with an inheritable one CREATE TABLE ATACC2 (a int, CONSTRAINT a_is_not_null NOT NULL a NO INHERIT); diff --git a/src/test/regress/sql/copy.sql b/src/test/regress/sql/copy.sql index f0b88a23db8..7cb6a18850c 100644 --- a/src/test/regress/sql/copy.sql +++ b/src/test/regress/sql/copy.sql @@ -245,6 +245,7 @@ alter table header_copytest drop column c; alter table header_copytest add column c text; copy header_copytest to stdout with (header match); copy header_copytest from stdin with (header wrong_choice); +\. -- works copy header_copytest from stdin with (header match); a b c diff --git a/src/test/regress/sql/copy2.sql b/src/test/regress/sql/copy2.sql index 45273557ce0..aa949739921 100644 --- a/src/test/regress/sql/copy2.sql +++ b/src/test/regress/sql/copy2.sql @@ -52,47 +52,78 @@ COPY x (a, b, c, d, e) from stdin; -- non-existent column in column list: should fail COPY x (xyz) from stdin; +\. -- redundant options COPY x from stdin (format CSV, FORMAT CSV); +\. COPY x from stdin (freeze off, freeze on); +\. COPY x from stdin (delimiter ',', delimiter ','); +\. COPY x from stdin (null ' ', null ' '); +\. COPY x from stdin (header off, header on); +\. COPY x from stdin (quote ':', quote ':'); +\. COPY x from stdin (escape ':', escape ':'); +\. COPY x from stdin (force_quote (a), force_quote *); +\. COPY x from stdin (force_not_null (a), force_not_null (b)); +\. COPY x from stdin (force_null (a), force_null (b)); +\. COPY x from stdin (convert_selectively (a), convert_selectively (b)); +\. COPY x from stdin (encoding 'sql_ascii', encoding 'sql_ascii'); +\. COPY x from stdin (on_error ignore, on_error ignore); +\. COPY x from stdin (log_verbosity default, log_verbosity verbose); +\. -- incorrect options COPY x from stdin (format BINARY, delimiter ','); +\. COPY x from stdin (format BINARY, null 'x'); +\. COPY x from stdin (format BINARY, on_error ignore); +\. COPY x from stdin (on_error unsupported); +\. COPY x from stdin (format TEXT, force_quote(a)); +\. COPY x from stdin (format TEXT, force_quote *); +\. COPY x from stdin (format CSV, force_quote(a)); +\. COPY x from stdin (format CSV, force_quote *); +\. COPY x from stdin (format TEXT, force_not_null(a)); +\. COPY x from stdin (format TEXT, force_not_null *); +\. COPY x to stdout (format CSV, force_not_null(a)); COPY x to stdout (format CSV, force_not_null *); COPY x from stdin (format TEXT, force_null(a)); +\. COPY x from stdin (format TEXT, force_null *); +\. COPY x to stdout (format CSV, force_null(a)); COPY x to stdout (format CSV, force_null *); COPY x to stdout (format BINARY, on_error unsupported); COPY x from stdin (log_verbosity unsupported); +\. COPY x from stdin with (reject_limit 1); +\. COPY x from stdin with (on_error ignore, reject_limit 0); +\. -- too many columns in column list: should fail COPY x (a, b, c, d, e, d, c) from stdin; +\. -- missing data: should fail COPY x from stdin; @@ -149,14 +180,19 @@ COPY x from stdin WHERE a > 60003; \. COPY x from stdin WHERE f > 60003; +\. COPY x from stdin WHERE a = max(x.b); +\. COPY x from stdin WHERE a IN (SELECT 1 FROM x); +\. COPY x from stdin WHERE a IN (generate_series(1,5)); +\. COPY x from stdin WHERE a = row_number() over(b); +\. -- check results of copy in @@ -353,10 +389,12 @@ ROLLBACK; -- should fail with "not referenced by COPY" error BEGIN; COPY forcetest (d, e) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b)); +\. ROLLBACK; -- should fail with "not referenced by COPY" error BEGIN; COPY forcetest (d, e) FROM STDIN WITH (FORMAT csv, FORCE_NULL(b)); +\. ROLLBACK; -- should succeed with no effect ("b" remains an empty string, "c" remains NULL) BEGIN; @@ -382,10 +420,12 @@ SELECT b, c FROM forcetest WHERE a = 6; -- should fail with "conflicting or redundant options" error BEGIN; COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL *, FORCE_NOT_NULL(b)); +\. ROLLBACK; -- should fail with "conflicting or redundant options" error BEGIN; COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL *, FORCE_NULL(b)); +\. ROLLBACK; \pset null '' @@ -638,19 +678,25 @@ truncate copy_default; -- DEFAULT cannot be used in binary mode copy copy_default from stdin with (format binary, default '\D'); +\. -- DEFAULT cannot be new line nor carriage return copy copy_default from stdin with (default E'\n'); +\. copy copy_default from stdin with (default E'\r'); +\. -- DELIMITER cannot appear in DEFAULT spec copy copy_default from stdin with (delimiter ';', default 'test;test'); +\. -- CSV quote cannot appear in DEFAULT spec copy copy_default from stdin with (format csv, quote '"', default 'test"test'); +\. -- NULL and DEFAULT spec must be different copy copy_default from stdin with (default '\N'); +\. -- cannot use DEFAULT marker in column that has no DEFAULT value copy copy_default from stdin with (default '\D'); diff --git a/src/test/regress/sql/copyselect.sql b/src/test/regress/sql/copyselect.sql index e32a4f8e38e..273a5f90a56 100644 --- a/src/test/regress/sql/copyselect.sql +++ b/src/test/regress/sql/copyselect.sql @@ -42,6 +42,7 @@ copy (select t into temp test3 from test1 where id=3) to stdout; -- This should fail -- copy (select * from test1) from stdin; +\. -- -- This should fail -- diff --git a/src/test/regress/sql/encoding.sql b/src/test/regress/sql/encoding.sql index d591818c3eb..0c1bf17a2e2 100644 --- a/src/test/regress/sql/encoding.sql +++ b/src/test/regress/sql/encoding.sql @@ -228,6 +228,18 @@ ALTER TABLE toast_3b_utf8 RENAME TO toast_4b_utf8; UPDATE toast_4b_utf8 SET c = repeat(U&'\+01F680', 3000); SELECT SUBSTRING(c FROM 3000 FOR 1) FROM toast_4b_utf8; +-- ascii() and multibyte characters +SELECT ascii(test_bytea_to_text('\xc3')); +SELECT ascii(test_bytea_to_text('\xe2')); +SELECT ascii(test_bytea_to_text('\xe282')); +SELECT ascii(test_bytea_to_text('\xf0')); +SELECT ascii(test_bytea_to_text('\xf09f')); +SELECT ascii(test_bytea_to_text('\xf09f98')); +-- invalid continuation byte +SELECT ascii(test_bytea_to_text('\xc3ff')); +-- invalid leading byte +SELECT ascii(test_bytea_to_text('\x80')); + DROP TABLE encoding_tests; DROP TABLE toast_4b_utf8; DROP FUNCTION test_encoding; diff --git a/src/test/regress/sql/generated_stored.sql b/src/test/regress/sql/generated_stored.sql index 6abae289ffe..4d002f236c1 100644 --- a/src/test/regress/sql/generated_stored.sql +++ b/src/test/regress/sql/generated_stored.sql @@ -216,10 +216,13 @@ COPY gtest1 FROM stdin; \. COPY gtest1 (a, b) FROM stdin; +\. COPY gtest1 FROM stdin WHERE b <> 10; +\. COPY gtest1 FROM stdin WHERE gtest1 IS NULL; +\. SELECT * FROM gtest1 ORDER BY a; @@ -236,6 +239,7 @@ COPY gtest3 FROM stdin; \. COPY gtest3 (a, b) FROM stdin; +\. SELECT * FROM gtest3 ORDER BY a; @@ -597,6 +601,21 @@ ALTER TABLE ONLY gtest30 ALTER COLUMN b DROP EXPRESSION; -- error \d gtest30 \d gtest30_1 ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error +BEGIN; +CREATE TABLE gtest30_1_1 () INHERITS (gtest30_1); +ALTER TABLE gtest30 ALTER COLUMN b DROP EXPRESSION; +\d gtest30_1_1 +ROLLBACK; + +-- test drop expression with subpartitions +CREATE TABLE gtest_root (a int, b int, c int GENERATED ALWAYS AS (a + b) STORED) PARTITION BY LIST (a); +CREATE TABLE gtest_node PARTITION OF gtest_root FOR VALUES IN (1) PARTITION BY LIST (b); +CREATE TABLE gtest_leaf PARTITION OF gtest_node FOR VALUES IN (1); +ALTER TABLE gtest_node ALTER COLUMN c DROP EXPRESSION; -- fails +ALTER TABLE ONLY gtest_root ALTER COLUMN c DROP EXPRESSION; -- fails +ALTER TABLE gtest_root ALTER COLUMN c DROP EXPRESSION; +\d gtest_(root|node|leaf) +DROP TABLE gtest_root; -- composite type dependencies CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text); diff --git a/src/test/regress/sql/generated_virtual.sql b/src/test/regress/sql/generated_virtual.sql index 0ba8c626047..b1b92b2ced5 100644 --- a/src/test/regress/sql/generated_virtual.sql +++ b/src/test/regress/sql/generated_virtual.sql @@ -216,10 +216,13 @@ COPY gtest1 FROM stdin; \. COPY gtest1 (a, b) FROM stdin; +\. COPY gtest1 FROM stdin WHERE b <> 10; +\. COPY gtest1 FROM stdin WHERE gtest1 IS NULL; +\. SELECT * FROM gtest1 ORDER BY a; @@ -236,6 +239,7 @@ COPY gtest3 FROM stdin; \. COPY gtest3 (a, b) FROM stdin; +\. SELECT * FROM gtest3 ORDER BY a; @@ -366,6 +370,27 @@ INSERT INTO gtest21b (a) VALUES (NULL); -- error ALTER TABLE gtest21b ALTER COLUMN b DROP NOT NULL; INSERT INTO gtest21b (a) VALUES (0); -- ok now +-- virtual generated columns are not physically stored, even when not null +CREATE TABLE gtest21c (a int NOT NULL, b int GENERATED ALWAYS AS (a * 2) VIRTUAL NOT NULL, c int NOT NULL); +INSERT INTO gtest21c (a, c) VALUES (10, 42); +SELECT a, b, c FROM gtest21c; +DROP TABLE gtest21c; + +-- try adding a virtual generated column to an existing table with tuples, +-- then try adding an atthasmissing column before adding a normal nullable +-- column. +CREATE TABLE gtest21d (a int NOT NULL); +INSERT INTO gtest21d (a) VALUES(10); +ALTER TABLE gtest21d ADD COLUMN b INT GENERATED ALWAYS AS (a * 10) VIRTUAL NOT NULL; +SELECT * FROM gtest21d ORDER BY a; +INSERT INTO gtest21d (a) VALUES(20); +ALTER TABLE gtest21d ADD COLUMN c INT NOT NULL DEFAULT 1234; +SELECT * FROM gtest21d ORDER BY a; +ALTER TABLE gtest21d ADD COLUMN d INT; +INSERT INTO gtest21d (a, c, d) VALUES(30, 12345, 100); +SELECT * FROM gtest21d ORDER BY a; +DROP TABLE gtest21d; + -- not-null constraint with partitioned table CREATE TABLE gtestnn_parent ( f1 int, diff --git a/src/test/regress/sql/gist.sql b/src/test/regress/sql/gist.sql index 6f1fc65f128..1ebb1d9ee43 100644 --- a/src/test/regress/sql/gist.sql +++ b/src/test/regress/sql/gist.sql @@ -169,6 +169,35 @@ explain (verbose, costs off) select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; +-- Test that an index-only scan deforms the tuple it reconstructs with the +-- descriptor the AM formed it with, not the scan slot's descriptor. +create temp table gist_ios_tupdesc (a inet, r numrange); + +-- range_ops forms its tuples using the opclass input type, the polymorphic +-- anyrange (alignment 'd'), while the scan slot uses the actual range type +-- numrange (alignment 'i'). A buggy implementation will incorrectly access +-- the r/numrange column at the wrong offset. +-- +-- The range bounds are made long so the value needs a four-byte varlena +-- header; shorter values get a one-byte header and are stored without +-- alignment padding, which would mask the problem. +insert into gist_ios_tupdesc +values ( + '::1', -- shifts "r" datum value to differing offset + numrange(repeat('7', 200)::numeric, repeat('8', 200)::numeric)); +create index on gist_ios_tupdesc using gist (a inet_ops, r); +vacuum analyze gist_ios_tupdesc; + +explain (costs off) +select lower(r) = repeat('7', 200)::numeric as lower_ok, + upper(r) = repeat('8', 200)::numeric as upper_ok + from gist_ios_tupdesc where r && numrange(null, null); +select lower(r) = repeat('7', 200)::numeric as lower_ok, + upper(r) = repeat('8', 200)::numeric as upper_ok + from gist_ios_tupdesc where r && numrange(null, null); + +drop table gist_ios_tupdesc; + -- Force an index build using buffering. create index gist_tbl_box_index_forcing_buffering on gist_tbl using gist (p) with (buffering=on, fillfactor=50); diff --git a/src/test/regress/sql/hash_part.sql b/src/test/regress/sql/hash_part.sql index 6e2c1f21bfc..7243299d962 100644 --- a/src/test/regress/sql/hash_part.sql +++ b/src/test/regress/sql/hash_part.sql @@ -35,6 +35,9 @@ SELECT satisfies_hash_partition('mchash'::regclass, NULL, 0, NULL); -- remainder is null SELECT satisfies_hash_partition('mchash'::regclass, 4, NULL, NULL); +-- variadic null +SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, VARIADIC NULL::int[]); + -- too many arguments SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, NULL::int, NULL::text, NULL::json); diff --git a/src/test/regress/sql/indexing.sql b/src/test/regress/sql/indexing.sql index 706a6ec04ac..0f302f07a3f 100644 --- a/src/test/regress/sql/indexing.sql +++ b/src/test/regress/sql/indexing.sql @@ -993,3 +993,17 @@ reindex index test_pg_index_toast_index; drop index test_pg_index_toast_index; drop function test_pg_index_toast_func; drop table test_pg_index_toast_table; + +-- Test of a partitioned index attach, when there are exclusion constraints. +create table idx_excl_part (a int4range, b int4range) partition by list (a); +create table idx_excl_part_1 (a int4range, b int4range); +alter table only idx_excl_part attach partition idx_excl_part_1 for values in ('[0,1)'::int4range); +alter table only idx_excl_part add constraint idxpart_id_data_excl exclude using gist (a with =, b with &&); +alter table idx_excl_part_1 add constraint idxpart_1_id_data_excl exclude using gist (a with &&, b with &&); +-- This should be disallowed, because the constraints don't match. +alter index idxpart_id_data_excl attach partition idxpart_1_id_data_excl; +-- but if we recreate the constraint differently, it's allowed: +alter table idx_excl_part_1 drop constraint idxpart_1_id_data_excl; +alter table idx_excl_part_1 add constraint idxpart_1_id_data_excl exclude using gist (a with =, b with &&); +alter index idxpart_id_data_excl attach partition idxpart_1_id_data_excl; +-- leave these tables around, for pg_upgrade testing diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql index 3ac1ac69074..478c8e59c95 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -1376,6 +1376,16 @@ select * from (select 1 as x) ss1 left join (select 2 as y) ss2 on (true), lateral (select ss2.y as z limit 1) ss3; +-- Also, we mustn't remove an RTE_RESULT that is the only baserel where a PHV +-- can be evaluated, even when the PHV's phrels also mention an outer join. +explain (verbose, costs off) +select * from (values (1),(2)) v(x) + left join (select q from (select 7 as q from (select where false) ss1) ss2 + left join (select 8 as z) ss3 on true) ss4 on true; +select * from (values (1),(2)) v(x) + left join (select q from (select 7 as q from (select where false) ss1) ss2 + left join (select 8 as z) ss3 on true) ss4 on true; + -- This example demonstrates the folly of our old "have_dangerous_phv" logic begin; set local from_collapse_limit to 2; @@ -2342,6 +2352,25 @@ CREATE TEMP TABLE parted_b1 partition of parted_b for values from (0) to (10); explain (costs off) select a.* from a left join parted_b pb on a.b_id = pb.id; +-- test that clauses that still embed PHVs are not referencing the removed +-- relation when rebuilt for a partition of the kept relation +explain (costs off) +select 1 from (select t1.id from parted_b t1 left join parted_b t2 on t1.id = t2.id) s +where s.id = 1 group by (); + +explain (costs off) +select 1 from parted_b t1 + join (select t2.id from parted_b t2 left join parted_b t3 on t2.id = t3.id) s + on t1.id = s.id +group by (); + +-- likewise for a PHV embedded in an OR join clause +explain (costs off) +select 1 from parted_b t1 + join (select t2.id from parted_b t2 left join parted_b t3 on t2.id = t3.id) s + on (t1.id = 1 and s.id = 2) or (t1.id = 3 and s.id = 4) +group by (); + rollback; create temp table parent (k int primary key, pd int); diff --git a/src/test/regress/sql/jsonb_jsonpath.sql b/src/test/regress/sql/jsonb_jsonpath.sql index 3e8929a5269..6fa4a5c0b4e 100644 --- a/src/test/regress/sql/jsonb_jsonpath.sql +++ b/src/test/regress/sql/jsonb_jsonpath.sql @@ -523,6 +523,13 @@ select jsonb_path_query('0.0012345', '$.decimal(2,4)'); select jsonb_path_query('-0.00123456', '$.decimal(2,-4)'); select jsonb_path_query('12.3', '$.decimal(12345678901,1)'); select jsonb_path_query('12.3', '$.decimal(1,12345678901)'); +-- An out-of-range precision or scale does not fail in silent mode. +select jsonb_path_query('12345.678', '$.decimal(0, 6)', silent => true); +select jsonb_path_query('12345.678', '$.decimal(1001, 6)', silent => true); +select jsonb_path_query('1234.5678', '$.decimal(-6, +2)', silent => true); +select jsonb_path_query('1234.5678', '$.decimal(6, -1001)', silent => true); +select jsonb_path_query('1234.5678', '$.decimal(6, 1001)', silent => true); +select '1234.5678'::jsonb @? '$.decimal(0)'; -- Test .integer() select jsonb_path_query('null', '$.integer()'); diff --git a/src/test/regress/sql/money.sql b/src/test/regress/sql/money.sql index b888ec21c30..d769a211090 100644 --- a/src/test/regress/sql/money.sql +++ b/src/test/regress/sql/money.sql @@ -142,6 +142,10 @@ SELECT '-92233720368547758.08'::money - '0.01'::money; SELECT '92233720368547758.07'::money * 2::float8; SELECT '-1'::money / 1.175494e-38::float4; SELECT '92233720368547758.07'::money * 2::int4; +SELECT '-92233720368547758.08'::money * -1::int8; +SELECT '-92233720368547758.08'::money / -1::int8; +SELECT '-92233720368547758.08'::money / -1::int4; +SELECT '-92233720368547758.08'::money / -1::int2; SELECT '1'::money / 0::int2; SELECT '42'::money * 'inf'::float8; SELECT '42'::money * '-inf'::float8; diff --git a/src/test/regress/sql/object_address.sql b/src/test/regress/sql/object_address.sql index 1a6c61f49d5..119ef9ed02a 100644 --- a/src/test/regress/sql/object_address.sql +++ b/src/test/regress/sql/object_address.sql @@ -46,6 +46,10 @@ ALTER DEFAULT PRIVILEGES FOR ROLE regress_addr_user REVOKE DELETE ON TABLES FROM CREATE TRANSFORM FOR int LANGUAGE SQL ( FROM SQL WITH FUNCTION prsd_lextype(internal), TO SQL WITH FUNCTION int4recv(internal)); +-- make a function that uses it too, mainly to exercise pg_dump +CREATE FUNCTION public.sql_func_with_transform(int) RETURNS int LANGUAGE sql +AS 'select $1 + 1' +TRANSFORM FOR TYPE int; -- suppress warning that depends on wal_level SET client_min_messages = 'ERROR'; CREATE PUBLICATION addr_pub FOR TABLE addr_nsp.gentable; diff --git a/src/test/regress/sql/partition_prune.sql b/src/test/regress/sql/partition_prune.sql index 359a9208056..dac673ef80a 100644 --- a/src/test/regress/sql/partition_prune.sql +++ b/src/test/regress/sql/partition_prune.sql @@ -118,6 +118,26 @@ explain (costs off) select * from rlp where a > 1 and a >=15; /* rlp3 onwards, i explain (costs off) select * from rlp where a = 1 and a = 3; /* empty */ explain (costs off) select * from rlp where (a = 1 and a = 3) or (a > 1 and a = 15); +-- Test cases for range partitioned tables with IN clauses. +create table rangepart (a int) partition by range (a); +create table rangepart1 partition of rangepart for values from (0) to (10); +create table rangepart2 partition of rangepart for values from (10) to (20); +create table rangepart_def partition of rangepart default; + +-- Ensure we scan all apart from the default partition +explain (costs off) select * from rangepart where a in(5,15); + +-- Ensure we scan only the default +explain (costs off) select * from rangepart where a in(20,21); + +-- Ensure we scan only the default +explain (costs off) select * from rangepart where a in(-1,20); + +-- Ensure we scan all partitions +explain (costs off) select * from rangepart where a is not null and a in(-1,5,15,20); + +drop table rangepart; + -- multi-column keys create table mc3p (a int, b int, c int) partition by range (a, abs(b), c); create table mc3p_default partition of mc3p default; diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index 75fe68df333..f30d0672571 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -253,6 +253,7 @@ BEGIN; LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- fail COMMIT; COPY atest2 FROM stdin; -- fail +\. GRANT ALL ON atest1 TO PUBLIC; -- fail -- checks in subquery, both ok @@ -296,6 +297,7 @@ BEGIN; LOCK atest2 IN ACCESS EXCLUSIVE MODE; -- ok COMMIT; COPY atest2 FROM stdin; -- fail +\. -- checks in subquery, both fail SELECT * FROM atest1 WHERE ( b IN ( SELECT col1 FROM atest2 ) ); @@ -543,6 +545,7 @@ SELECT one, two FROM atest5 NATURAL JOIN atest6; -- ok now -- test column-level privileges for INSERT and UPDATE INSERT INTO atest5 (two) VALUES (3); -- ok COPY atest5 FROM stdin; -- fail +\. COPY atest5 (two) FROM stdin; -- ok 1 \. @@ -941,18 +944,24 @@ CREATE CAST (priv_testdomain1 AS priv_testdomain3a) WITH FUNCTION castfunc(int); DROP FUNCTION castfunc(int) CASCADE; DROP DOMAIN priv_testdomain3a; +CREATE DOMAIN priv_testdomain4a AS int CHECK (VALUE > ('(0,1)'::priv_testtype1).a); + CREATE FUNCTION priv_testfunc5a(a priv_testdomain1) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; CREATE FUNCTION priv_testfunc6a(b int) RETURNS priv_testdomain1 LANGUAGE SQL AS $$ SELECT $1::priv_testdomain1 $$; +CREATE FUNCTION priv_testfunc7a(a int DEFAULT ('(0,1)'::priv_testtype1).a) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; CREATE OPERATOR !+! (PROCEDURE = int4pl, LEFTARG = priv_testdomain1, RIGHTARG = priv_testdomain1); CREATE TABLE test5a (a int, b priv_testdomain1); CREATE TABLE test6a OF priv_testtype1; +CREATE TABLE test6a2 (a int, b text); +ALTER TABLE test6a2 OF priv_testtype1; CREATE TABLE test10a (a int[], b priv_testtype1[]); CREATE TABLE test9a (a int, b int); ALTER TABLE test9a ADD COLUMN c priv_testdomain1; ALTER TABLE test9a ALTER COLUMN b TYPE priv_testdomain1; +CREATE INDEX ON test9a ((a::priv_testdomain1)); CREATE TYPE test7a AS (a int, b priv_testdomain1); @@ -960,10 +969,19 @@ CREATE TYPE test8a AS (a int, b int); ALTER TYPE test8a ADD ATTRIBUTE c priv_testdomain1; ALTER TYPE test8a ALTER ATTRIBUTE b TYPE priv_testdomain1; +CREATE DOMAIN priv_testdomain5a AS test8a CHECK ((VALUE).a > 0 AND ('(0,1)'::priv_testtype1).a >= 0); + CREATE TABLE test11a AS (SELECT 1::priv_testdomain1 AS a); +CREATE VIEW test16a AS SELECT ('(0,1)'::priv_testtype1).a; +CREATE TABLE test17a (a int) PARTITION BY RANGE ((a + ('(0,1)'::priv_testtype1).a)); +CREATE POLICY priv_testpolicy1a ON test9a USING (('(0,1)'::priv_testtype1).a > 0); + REVOKE ALL ON TYPE priv_testtype1 FROM PUBLIC; +CREATE TABLE test12 (c int DEFAULT 0 CHECK (c > 0 AND '(0,1)'::priv_testtype1 IS NOT NULL)); +CREATE TABLE test13 (c int DEFAULT ('(0,1)'::priv_testtype1).a); + SET SESSION AUTHORIZATION regress_priv_user2; -- commands that should succeed @@ -976,18 +994,24 @@ CREATE DOMAIN priv_testdomain3b AS int; CREATE FUNCTION castfunc(int) RETURNS priv_testdomain3b AS $$ SELECT $1::priv_testdomain3b $$ LANGUAGE SQL; CREATE CAST (priv_testdomain1 AS priv_testdomain3b) WITH FUNCTION castfunc(int); +CREATE DOMAIN priv_testdomain4b AS int CHECK (VALUE > ('(0,1)'::priv_testtype1).a); + CREATE FUNCTION priv_testfunc5b(a priv_testdomain1) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; CREATE FUNCTION priv_testfunc6b(b int) RETURNS priv_testdomain1 LANGUAGE SQL AS $$ SELECT $1::priv_testdomain1 $$; +CREATE FUNCTION priv_testfunc7b(a int DEFAULT ('(0,1)'::priv_testtype1).a) RETURNS int LANGUAGE SQL AS $$ SELECT $1 $$; CREATE OPERATOR !! (PROCEDURE = priv_testfunc5b, RIGHTARG = priv_testdomain1); CREATE TABLE test5b (a int, b priv_testdomain1); CREATE TABLE test6b OF priv_testtype1; +CREATE TABLE test6b2 (a int, b text); +ALTER TABLE test6b2 OF priv_testtype1; CREATE TABLE test10b (a int[], b priv_testtype1[]); CREATE TABLE test9b (a int, b int); ALTER TABLE test9b ADD COLUMN c priv_testdomain1; ALTER TABLE test9b ALTER COLUMN b TYPE priv_testdomain1; +CREATE INDEX ON test9b ((a::priv_testdomain1)); CREATE TYPE test7b AS (a int, b priv_testdomain1); @@ -995,18 +1019,41 @@ CREATE TYPE test8b AS (a int, b int); ALTER TYPE test8b ADD ATTRIBUTE c priv_testdomain1; ALTER TYPE test8b ALTER ATTRIBUTE b TYPE priv_testdomain1; +CREATE DOMAIN priv_testdomain5b AS test8b CHECK ((VALUE).a > 0 AND ('(0,1)'::priv_testtype1).a >= 0); + CREATE TABLE test11b AS (SELECT 1::priv_testdomain1 AS a); +CREATE VIEW test16b AS SELECT ('(0,1)'::priv_testtype1).a; +CREATE TABLE test17b (a int) PARTITION BY RANGE ((a + ('(0,1)'::priv_testtype1).a)); +CREATE POLICY priv_testpolicy1b ON test9b USING (('(0,1)'::priv_testtype1).a > 0); + REVOKE ALL ON TYPE priv_testtype1 FROM PUBLIC; +CREATE TABLE test12 (c int DEFAULT 0 CHECK (c > 0 AND '(0,1)'::priv_testtype1 IS NOT NULL)); +CREATE TABLE test13 (c int DEFAULT ('(0,1)'::priv_testtype1).a); + +-- new stored expressions require USAGE on types, rebuilds do not +\c - +REVOKE USAGE ON TYPE priv_testtype1 FROM regress_priv_user2; +SET SESSION AUTHORIZATION regress_priv_user2; +ALTER TABLE test12 ALTER COLUMN c TYPE bigint; +ALTER TYPE test8b ALTER ATTRIBUTE a TYPE bigint CASCADE; +ALTER TABLE test12 ALTER COLUMN c SET DEFAULT ('(0,1)'::priv_testtype1).a; +CREATE TABLE test14 (LIKE test12 INCLUDING CONSTRAINTS); +CREATE TABLE test15 (LIKE test13 INCLUDING DEFAULTS); + \c - DROP AGGREGATE priv_testagg1b(priv_testdomain1); DROP DOMAIN priv_testdomain2b; +DROP DOMAIN priv_testdomain4b; +DROP DOMAIN priv_testdomain5b; DROP OPERATOR !! (NONE, priv_testdomain1); DROP FUNCTION priv_testfunc5b(a priv_testdomain1); DROP FUNCTION priv_testfunc6b(b int); +DROP FUNCTION priv_testfunc7b(a int); DROP TABLE test5b; DROP TABLE test6b; +DROP TABLE test6b2; DROP TABLE test9b; DROP TABLE test10b; DROP TYPE test7b; @@ -1014,7 +1061,11 @@ DROP TYPE test8b; DROP CAST (priv_testdomain1 AS priv_testdomain3b); DROP FUNCTION castfunc(int) CASCADE; DROP DOMAIN priv_testdomain3b; +DROP VIEW test16b; DROP TABLE test11b; +DROP TABLE test17b; +DROP TABLE test12; +DROP TABLE test13; DROP TYPE priv_testtype1; -- ok DROP DOMAIN priv_testdomain1; -- ok diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql index f064e4f5456..f4a4486be79 100644 --- a/src/test/regress/sql/psql.sql +++ b/src/test/regress/sql/psql.sql @@ -483,6 +483,17 @@ execute q; deallocate q; +-- expanded output with short-width columns +\pset border 2 +\pset expanded on +create table psql_short_tab(a int, b int); +insert into psql_short_tab values(10,20),(30,40); +\pset format aligned +select * from psql_short_tab; +\pset format wrapped +select * from psql_short_tab; +drop table psql_short_tab; + \pset linestyle ascii \pset border 1 @@ -1099,6 +1110,17 @@ select \if false \\ (bogus \else \\ 42 \endif \\ forty_two; \echo 'should print #8-1' \endif +-- test that begin/end matching ignores to-be-ignored text +create function silly_function(int) returns int +begin atomic select $1; +\if false +end +\endif +; +end; +\sf silly_function(int) +drop function silly_function(int); + -- :{?...} defined variable test \set i 1 \if :{?i} @@ -1545,6 +1567,15 @@ SELECT line FROM reload_output ORDER BY lineno; DROP TABLE reload_output; +-- \copy must skip in-line data, even if the issued COPY command fails. +\copy no_such_table from stdin +foo +\echo this should not get output +bar +\echo this should not get output +\. +\echo this should get output + -- -- AUTOCOMMIT and combined queries -- diff --git a/src/test/regress/sql/psql_pipeline.sql b/src/test/regress/sql/psql_pipeline.sql index 6788dceee2e..468ef1d090b 100644 --- a/src/test/regress/sql/psql_pipeline.sql +++ b/src/test/regress/sql/psql_pipeline.sql @@ -438,5 +438,68 @@ SELECT 1 \bind \sendpipeline VACUUM psql_pipeline \bind \sendpipeline \endpipeline +-- Deferred constraint violation at commit time in a pipeline. +CREATE TABLE psql_pipeline_defer (a INTEGER PRIMARY KEY DEFERRABLE INITIALLY DEFERRED); +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) RETURNING * \bind 1 \sendpipeline +\endpipeline + +-- Same with \syncpipeline and commands after the failing sync. +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\syncpipeline +SELECT $1 \bind 'after_sync_1' \sendpipeline +\endpipeline + +-- More patterns with more \syncpipeline, more commands and \getresults +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\syncpipeline +SELECT $1 \bind 'after_sync_1' \sendpipeline +\getresults +SELECT $1 \bind 'after_sync_2' \sendpipeline +\endpipeline +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\syncpipeline +\getresults +SELECT $1 \bind 'after_sync_1' \sendpipeline +\getresults +SELECT $1 \bind 'after_sync_2' \sendpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +SELECT $1 \bind 'after_sync_3' \sendpipeline +SELECT $1 \bind 'after_sync_4' \sendpipeline +SELECT $1 \bind 'after_sync_5' \sendpipeline +\endpipeline + +-- Deferred error combined with a regular command error after the sync. +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\syncpipeline +SELECT $1 \bind \sendpipeline +SELECT $1 \bind 'after_error' \sendpipeline +\endpipeline + +-- Empty sync segment followed by a deferred error. +\startpipeline +\syncpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +\endpipeline + +-- Deferred error with \getresults reading results one at a time. +\startpipeline +INSERT INTO psql_pipeline_defer VALUES ($1), ($1) \bind 1 \sendpipeline +SELECT $1 \bind 'partial' \sendpipeline +\syncpipeline +\getresults 1 +\getresults 1 +\getresults +\endpipeline + +DROP TABLE psql_pipeline_defer; + -- Clean up DROP TABLE psql_pipeline; diff --git a/src/test/regress/sql/rangetypes.sql b/src/test/regress/sql/rangetypes.sql index a5ecdf5372f..bad1b5afcad 100644 --- a/src/test/regress/sql/rangetypes.sql +++ b/src/test/regress/sql/rangetypes.sql @@ -434,6 +434,20 @@ select '[2010-01-01 01:00:00 -05, 2010-01-01 02:00:00 -08)'::tstzrange; select '[2010-01-01 01:00:00 -08, 2010-01-01 02:00:00 -05)'::tstzrange; set timezone to default; +-- CREATE TYPE AS RANGE checks for USAGE on subtype +CREATE ROLE regress_subtype; +CREATE TYPE mytype AS (a INT, b INT); +REVOKE USAGE ON TYPE mytype FROM PUBLIC; +SET ROLE regress_subtype; +CREATE TYPE myrange AS RANGE (subtype = mytype); +RESET ROLE; +GRANT USAGE ON TYPE mytype TO regress_subtype; +SET ROLE regress_subtype; +CREATE TYPE myrange AS RANGE (subtype = mytype); +RESET ROLE; +DROP TYPE mytype CASCADE; +DROP ROLE regress_subtype; + -- -- Test user-defined range of floats -- (type float8range was already made in test_setup.sql) diff --git a/src/test/regress/sql/returning.sql b/src/test/regress/sql/returning.sql index cc99cb53f63..133e115851b 100644 --- a/src/test/regress/sql/returning.sql +++ b/src/test/regress/sql/returning.sql @@ -243,6 +243,17 @@ DELETE FROM foo WHERE f1 = 5 RETURNING old.tableoid::regclass, old.ctid, old.*, new.tableoid::regclass, new.ctid, new.*, *; +-- Parenthesized OLD and NEW +INSERT INTO foo VALUES (6, 'paren-test', 60, 600) + RETURNING old, (old).f4, (old).*, + new, (new).f4, (new).*; +UPDATE foo SET f4 = 700 WHERE f1 = 6 + RETURNING old, (old).f4, (old).*, + new, (new).f4, (new).*; +DELETE FROM foo WHERE f1 = 6 + RETURNING old, (old).f4, (old).*, + new, (new).f4, (new).*; + -- RETURNING OLD and NEW from subquery EXPLAIN (verbose, costs off) INSERT INTO foo VALUES (5, 'subquery test') diff --git a/src/test/regress/sql/rowsecurity.sql b/src/test/regress/sql/rowsecurity.sql index 21ac0ca51ee..c08b56bdace 100644 --- a/src/test/regress/sql/rowsecurity.sql +++ b/src/test/regress/sql/rowsecurity.sql @@ -1653,8 +1653,10 @@ COPY copy_t FROM STDIN; --ok SET SESSION AUTHORIZATION regress_rls_bob; SET row_security TO OFF; COPY copy_t FROM STDIN; --fail - would be affected by RLS. +\. SET row_security TO ON; COPY copy_t FROM STDIN; --fail - COPY FROM not supported by RLS. +\. -- Check COPY FROM as user with permissions and BYPASSRLS SET SESSION AUTHORIZATION regress_rls_exempt_user; @@ -1670,8 +1672,10 @@ COPY copy_t FROM STDIN; --ok SET SESSION AUTHORIZATION regress_rls_carol; SET row_security TO OFF; COPY copy_t FROM STDIN; --fail - permission denied. +\. SET row_security TO ON; COPY copy_t FROM STDIN; --fail - permission denied. +\. RESET SESSION AUTHORIZATION; DROP TABLE copy_t; diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index fdd3ff1d161..4b6653981fb 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -1087,6 +1087,7 @@ SELECT * FROM rule_v1; ALTER RULE InsertRule ON rule_v1 RENAME TO NewInsertRule; -- doesn't exist ALTER RULE NewInsertRule ON rule_v1 RENAME TO "_RETURN"; -- already exists ALTER RULE "_RETURN" ON rule_v1 RENAME TO abc; -- ON SELECT rule cannot be renamed +ALTER RULE rtest_t4_ins1 ON rtest_t4 RENAME TO "_RETURN"; -- also disallowed DROP VIEW rule_v1; DROP TABLE rule_t1; diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql index 343d344d270..a995bfa9153 100644 --- a/src/test/regress/sql/sqljson.sql +++ b/src/test/regress/sql/sqljson.sql @@ -395,6 +395,28 @@ SELECT NULL::text IS JSON; SELECT NULL::bytea IS JSON; SELECT NULL::int IS JSON; +-- A user-defined string-category type with no implicit cast to text must +-- produce a clean error rather than crash for IS JSON / JSON() input +-- (per bug #19491). +CREATE FUNCTION sqljson_mystr_in(cstring) RETURNS sqljson_mystr + AS 'textin' LANGUAGE internal IMMUTABLE STRICT; +CREATE FUNCTION sqljson_mystr_out(sqljson_mystr) RETURNS cstring + AS 'textout' LANGUAGE internal IMMUTABLE STRICT; +CREATE TYPE sqljson_mystr ( + INPUT = sqljson_mystr_in, + OUTPUT = sqljson_mystr_out, + LIKE = text, + CATEGORY = 'S' +); +SELECT '{"a":1}'::sqljson_mystr IS JSON; -- error +SELECT JSON('{"a":1}'::sqljson_mystr WITH UNIQUE KEYS); -- error +-- An implicit cast to text lets the same query work normally. +CREATE CAST (sqljson_mystr AS text) WITHOUT FUNCTION AS IMPLICIT; +SELECT '{"a":1}'::sqljson_mystr IS JSON; +\set VERBOSITY terse +DROP TYPE sqljson_mystr CASCADE; +\set VERBOSITY default + SELECT '' IS JSON; SELECT bytea '\x00' IS JSON; @@ -507,3 +529,44 @@ SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': stable_one() RETURNING text) FORMAT EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': 1 RETURNING text) FORMAT JSON); SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': 1 RETURNING text) FORMAT JSON); DROP FUNCTION volatile_one, stable_one; + +-- Test deparsing of JSON aggregates that are computed below a WindowAgg +-- node. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT i % 2 AS g, + JSON_ARRAYAGG(i ORDER BY i RETURNING jsonb) AS ja, + JSON_ARRAYAGG(i ORDER BY i RETURNING text) AS ja_text, + JSON_ARRAYAGG(i ORDER BY i NULL ON NULL RETURNING jsonb) AS ja_null, + JSON_OBJECTAGG(i: i ABSENT ON NULL RETURNING jsonb) AS jo_absent, + JSON_OBJECTAGG(i: i WITH UNIQUE RETURNING jsonb) AS jo_unique, + row_number() OVER (ORDER BY i % 2) AS rn +FROM generate_series(1, 3) i +GROUP BY i % 2; +SELECT i % 2 AS g, + JSON_ARRAYAGG(i ORDER BY i RETURNING jsonb) AS ja, + JSON_ARRAYAGG(i ORDER BY i RETURNING text) AS ja_text, + JSON_ARRAYAGG(i ORDER BY i NULL ON NULL RETURNING jsonb) AS ja_null, + JSON_OBJECTAGG(i: i ABSENT ON NULL RETURNING jsonb) AS jo_absent, + JSON_OBJECTAGG(i: i WITH UNIQUE RETURNING jsonb) AS jo_unique, + row_number() OVER (ORDER BY i % 2) AS rn +FROM generate_series(1, 3) i +GROUP BY i % 2; + +-- The same, but with the JSON aggregate used as a window function that is +-- computed below another WindowAgg node. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT JSON_ARRAYAGG(i NULL ON NULL RETURNING jsonb) OVER (ORDER BY i DESC) AS ja, + row_number() OVER (ORDER BY i) AS rn +FROM generate_series(1, 3) i; +SELECT JSON_ARRAYAGG(i NULL ON NULL RETURNING jsonb) OVER (ORDER BY i DESC) AS ja, + row_number() OVER (ORDER BY i) AS rn +FROM generate_series(1, 3) i; + +-- The same, but with the expression containing the JSON aggregate postponed +-- to above the final sort due to being volatile. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT i % 2 AS g, + JSON_ARRAYAGG(i RETURNING text) || random()::text AS ja +FROM generate_series(1, 3) i +GROUP BY i % 2 +ORDER BY count(*); diff --git a/src/test/regress/sql/sqljson_jsontable.sql b/src/test/regress/sql/sqljson_jsontable.sql index 154eea79c76..41824094b96 100644 --- a/src/test/regress/sql/sqljson_jsontable.sql +++ b/src/test/regress/sql/sqljson_jsontable.sql @@ -132,6 +132,15 @@ SELECT * FROM JSON_TABLE(jsonb '{"d1": "foo"}', '$' SELECT * FROM JSON_TABLE(jsonb '{"d1": "foo"}', '$' COLUMNS (js1 oid[] PATH '$.d2' DEFAULT '{1}'::int[]::oid[] ON EMPTY)); +-- A DEFAULT expression whose base type matches the column type must still be +-- coerced to the column's typmod. +SELECT * FROM JSON_TABLE(jsonb '{}', '$' + COLUMNS (c numeric(4,1) PATH '$.x' DEFAULT 99999.999 ON EMPTY)); +SELECT * FROM JSON_TABLE(jsonb '{}', '$' + COLUMNS (c bit(3) PATH '$.x' DEFAULT b'10101' ON EMPTY)); +SELECT * FROM JSON_TABLE(jsonb '{}', '$' + COLUMNS (c numeric(4,1) PATH '$.x' DEFAULT abs(NULL::numeric) ON EMPTY)); + -- JSON_TABLE: Test backward parsing CREATE VIEW jsonb_table_view2 AS diff --git a/src/test/regress/sql/sqljson_queryfuncs.sql b/src/test/regress/sql/sqljson_queryfuncs.sql index a5d5e256d7f..879cc7db002 100644 --- a/src/test/regress/sql/sqljson_queryfuncs.sql +++ b/src/test/regress/sql/sqljson_queryfuncs.sql @@ -105,6 +105,14 @@ SELECT JSON_VALUE(jsonb '[" "]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int FORMAT JSON); -- RETURNING FORMAT not allowed +-- A DEFAULT expression must be coerced to the RETURNING type's typmod even +-- when its base type already matches, but a matching NULL needs no coercion. +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING numeric(4,1) DEFAULT 99999.999 ON EMPTY); +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING varchar(3) DEFAULT 'toolong'::varchar(10) ON EMPTY); +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING numeric(4,1) DEFAULT NULL::numeric ON EMPTY); +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING bit(3) DEFAULT b'10101' ON EMPTY); +SELECT JSON_VALUE(jsonb '{}', '$.a' RETURNING numeric(4,1) DEFAULT abs(NULL::numeric) ON EMPTY); + -- RETUGNING pseudo-types not allowed SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING record); diff --git a/src/test/regress/sql/stats_ext.sql b/src/test/regress/sql/stats_ext.sql index 7272f9d8764..2a08c38259b 100644 --- a/src/test/regress/sql/stats_ext.sql +++ b/src/test/regress/sql/stats_ext.sql @@ -41,6 +41,8 @@ CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), (y + 1), (x || 'x'), (x || 'x') CREATE STATISTICS tst ON (x || 'x'), (x || 'x'), y FROM ext_stats_test; CREATE STATISTICS tst (unrecognized) ON x, y FROM ext_stats_test; -- unsupported targets +CREATE STATISTICS tst ON x, y FROM ext_stats_test, ext_stats_test; +CREATE STATISTICS tst ON x, y FROM ext_stats_test, (SELECT * FROM ext_stats_test) AS foo; CREATE STATISTICS tst ON a FROM (VALUES (x)) AS foo; CREATE STATISTICS tst ON a FROM foo NATURAL JOIN bar; CREATE STATISTICS tst ON a FROM (SELECT * FROM ext_stats_test) AS foo; @@ -1803,6 +1805,24 @@ DROP SCHEMA tststats CASCADE; DROP SCHEMA sts_sch1, sts_sch2 CASCADE; DROP USER regress_stats_user1; +-- CREATE STATISTICS checks for the owner +CREATE ROLE regress_relowner; +CREATE ROLE regress_stxowner; +CREATE TABLE stats_ext_tbl (a int, b int); +ALTER TABLE stats_ext_tbl OWNER TO regress_relowner; +CREATE STATISTICS tst ON a, b FROM stats_ext_tbl; +ALTER STATISTICS tst OWNER TO regress_stxowner; +SELECT stxowner::regrole FROM pg_statistic_ext WHERE stxname = 'tst'; + +-- re-creating statistics via ALTER TABLE preserve the statistics owner. +ALTER TABLE stats_ext_tbl ALTER COLUMN a TYPE bigint; +SELECT stxowner::regrole FROM pg_statistic_ext WHERE stxname = 'tst'; + +-- Tidy up +DROP TABLE stats_ext_tbl; +DROP ROLE regress_relowner; +DROP ROLE regress_stxowner; + CREATE TABLE grouping_unique (x integer); INSERT INTO grouping_unique (x) SELECT gs FROM generate_series(1,1000) AS gs; ANALYZE grouping_unique; diff --git a/src/test/regress/sql/stats_import.sql b/src/test/regress/sql/stats_import.sql index ee97fa6bc1b..0ba5791e2e5 100644 --- a/src/test/regress/sql/stats_import.sql +++ b/src/test/regress/sql/stats_import.sql @@ -15,6 +15,12 @@ CREATE TABLE stats_import.test( tags text[] ) WITH (autovacuum_enabled = false); +CREATE TABLE stats_import.test_mr( + id INTEGER PRIMARY KEY, + name text, + mrange int4multirange +) WITH (autovacuum_enabled = false); + SELECT pg_catalog.pg_restore_relation_stats( 'schemaname', 'stats_import', @@ -177,6 +183,49 @@ SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; +-- error: reltuples must be finite (rejected with WARNING, returns false) +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', 'Infinity'::real); + +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', '-Infinity'::real); + +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', 'NaN'::real); + +-- error: reltuples must not be less than -1.0 (rejected with WARNING, returns false) +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', '-5'::real); + +-- reltuples is unchanged (still 500) after the rejected values above +SELECT relpages, reltuples, relallvisible, relallfrozen +FROM pg_class +WHERE oid = 'stats_import.test'::regclass; + +-- ok: -1 (the "unknown" sentinel) is still accepted +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', '-1'::real); + +SELECT relpages, reltuples, relallvisible, relallfrozen +FROM pg_class +WHERE oid = 'stats_import.test'::regclass; + +-- restore reltuples to 500 for the following tests +SELECT pg_restore_relation_stats( + 'schemaname', 'stats_import', + 'relname', 'test', + 'reltuples', '500'::real); + -- ok: set just relallvisible, rest stay same SELECT pg_restore_relation_stats( 'schemaname', 'stats_import', @@ -801,6 +850,38 @@ AND tablename = 'test' AND inherited = false AND attname = 'id'; +-- test for multiranges +INSERT INTO stats_import.test_mr +VALUES + (1, 'red', '{[1,3),[5,9),[20,30)}'::int4multirange), + (2, 'red', '{[11,13),[15,19),[20,30)}'::int4multirange), + (3, 'red', '{[21,23),[25,29),[120,130)}'::int4multirange); + +-- warn: reject range values as ordinary multirange statistics +SELECT pg_catalog.pg_restore_attribute_stats( + 'schemaname', 'stats_import', + 'relname', 'test_mr', + 'attname', 'mrange', + 'inherited', false, + 'most_common_vals', ARRAY['[1,3)']::text, + 'most_common_freqs', ARRAY[1.0]::real[] +); + +-- ensure that we set attribute stats for a multirange +-- MCVs and histograms retain the multirange type. +SELECT pg_catalog.pg_restore_attribute_stats( + 'schemaname', 'stats_import', + 'relname', 'test_mr', + 'attname', 'mrange', + 'inherited', false, + 'most_common_vals', ARRAY['{[1,3),[5,9)}', '{[11,13),[15,19)}']::text, + 'most_common_freqs', ARRAY[0.6, 0.4]::real[], + 'histogram_bounds', ARRAY['{[1,3)}', '{[11,13)}', '{[21,23)}']::text, + 'range_length_histogram', '{19,29,109}'::text, + 'range_empty_frac', '0'::real, + 'range_bounds_histogram', '{"[1,30)","[11,30)","[21,130)"}'::text +); + -- -- Test the ability to exactly copy data from one table to an identical table, -- correctly reconstructing the stakind order as well as the staopN and diff --git a/src/test/regress/sql/subselect.sql b/src/test/regress/sql/subselect.sql index c729d6d1970..10079f32ccd 100644 --- a/src/test/regress/sql/subselect.sql +++ b/src/test/regress/sql/subselect.sql @@ -925,6 +925,111 @@ select * from drop function tattle(x int, y int); +-- +-- check that an upper-level qual is not pushed down if its operator is from a +-- different btree opfamily than the subquery's grouping eqop +-- +BEGIN; + +CREATE TYPE t_rec AS (x numeric); +CREATE TEMP TABLE pdt (id int, a t_rec); +INSERT INTO pdt VALUES + (1, ROW(1.00)::t_rec), + (2, ROW(1.0)::t_rec), + (3, ROW(2)::t_rec); + +-- DISTINCT ON: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT ON (a) id, a FROM pdt ORDER BY a, id) s +WHERE a *= ROW(1.0)::t_rec; + +SELECT * FROM (SELECT DISTINCT ON (a) id, a FROM pdt ORDER BY a, id) s +WHERE a *= ROW(1.0)::t_rec; + +-- Window function PARTITION BY: conflict, qual stays outside the WindowAgg +EXPLAIN (COSTS OFF) +SELECT * FROM ( + SELECT id, a, count(*) OVER (PARTITION BY a) AS cnt FROM pdt +) s +WHERE a *= ROW(1.0)::t_rec; + +SELECT * FROM ( + SELECT id, a, count(*) OVER (PARTITION BY a) AS cnt FROM pdt +) s +WHERE a *= ROW(1.0)::t_rec; + +-- Plain DISTINCT: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT a FROM pdt) s WHERE a *= ROW(1.0)::t_rec; + +SELECT * FROM (SELECT DISTINCT a FROM pdt) s WHERE a *= ROW(1.0)::t_rec; + +-- Positive: compatible opfamily, safe to push past the grouping +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT DISTINCT ON (a) id, a FROM pdt ORDER BY a, id) s +WHERE a = ROW(1.0)::t_rec; + +SELECT * FROM (SELECT DISTINCT ON (a) id, a FROM pdt ORDER BY a, id) s +WHERE a = ROW(1.0)::t_rec; + +-- Set operations: any operation other than UNION ALL groups rows by equality, +-- so the same opfamily-mismatch rules apply. +CREATE TEMP TABLE u1 (a t_rec); +CREATE TEMP TABLE u2 (a t_rec); +INSERT INTO u1 VALUES (ROW(1.00)::t_rec), (ROW(1.0)::t_rec); +INSERT INTO u2 VALUES (ROW(1.0)::t_rec); + +-- UNION: conflict, qual stays in outer query +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT a FROM u1 UNION SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + +SELECT * FROM (SELECT a FROM u1 UNION SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + +-- INTERSECT: same +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT a FROM u1 INTERSECT SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + +SELECT * FROM (SELECT a FROM u1 INTERSECT SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + +-- INTERSECT ALL: still groups +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT a FROM u1 INTERSECT ALL SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + +SELECT * FROM (SELECT a FROM u1 INTERSECT ALL SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + +-- UNION ALL of (UNION ...): an inner grouping node still exposes the +-- conflict to a qual pushed down through the outer UNION ALL. +EXPLAIN (COSTS OFF) +SELECT * FROM ( + (SELECT a FROM u1 UNION SELECT a FROM u2) + UNION ALL + SELECT a FROM u2 +) s +WHERE a *= ROW(1.0)::t_rec; + +SELECT * FROM ( + (SELECT a FROM u1 UNION SELECT a FROM u2) + UNION ALL + SELECT a FROM u2 +) s +WHERE a *= ROW(1.0)::t_rec; + +-- UNION ALL only: no grouping anywhere, pushdown remains allowed. +EXPLAIN (COSTS OFF) +SELECT * FROM (SELECT a FROM u1 UNION ALL SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + +SELECT * FROM (SELECT a FROM u1 UNION ALL SELECT a FROM u2) s +WHERE a *= ROW(1.0)::t_rec; + +ROLLBACK; + -- -- Test that LIMIT can be pushed to SORT through a subquery that just projects -- columns. We check for that having happened by looking to see if EXPLAIN diff --git a/src/test/regress/sql/unicode.sql b/src/test/regress/sql/unicode.sql index e50adb68ed0..951f86a336e 100644 --- a/src/test/regress/sql/unicode.sql +++ b/src/test/regress/sql/unicode.sql @@ -36,3 +36,23 @@ FROM ORDER BY num; SELECT is_normalized('abc', 'def'); -- run-time error + +-- Hangul NFC recomposition tests +-- L+V -> LV composition (first and last) +SELECT normalize(U&'\1100\1161', NFC) = U&'\AC00' COLLATE "C" AS hangul_lv_first; +SELECT normalize(U&'\1112\1175', NFC) = U&'\D788' COLLATE "C" AS hangul_lv_last; +-- LV+T -> LVT composition +SELECT normalize(U&'\AC00\11A8', NFC) = U&'\AC01' COLLATE "C" AS hangul_lvt_first_t; +SELECT normalize(U&'\AC00\11C2', NFC) = U&'\AC1B' COLLATE "C" AS hangul_lvt_last_t; +SELECT normalize(U&'\D788\11A8', NFC) = U&'\D789' COLLATE "C" AS hangul_lvt_last_lv; +-- L+V+T -> LVT composition +SELECT normalize(U&'\1100\1161\11A8', NFC) = U&'\AC01' COLLATE "C" AS hangul_full_lvt; +SELECT normalize(U&'\1112\1175\11C2', NFC) = U&'\D7A3' COLLATE "C" AS hangul_full_lvt; +-- TBASE invalid T syllable +SELECT normalize(U&'\AC00\11A7', NFC) = U&'\AC00\11A7' COLLATE "C" AS hangul_tbase_not_combined; +SELECT normalize(U&'\1100\1161\11A7', NFC) = U&'\AC00\11A7' COLLATE "C" AS hangul_lv_tbase_separate; + +-- Hangul NFD decomposition tests +SELECT normalize(U&'\AC00', NFD) = U&'\1100\1161' COLLATE "C" AS hangul_nfd_lv; +SELECT normalize(U&'\AC01', NFD) = U&'\1100\1161\11A8' COLLATE "C" AS hangul_nfd_lvt; +SELECT normalize(U&'\D7A3', NFD) = U&'\1112\1175\11C2' COLLATE "C" AS hangul_nfd_last; diff --git a/src/test/regress/sql/uuid.sql b/src/test/regress/sql/uuid.sql index 465153a0341..e92dd2f2ead 100644 --- a/src/test/regress/sql/uuid.sql +++ b/src/test/regress/sql/uuid.sql @@ -131,6 +131,19 @@ WITH uuidts AS ( ) SELECT y, ts, prev_ts FROM uuidts WHERE ts < prev_ts; +-- uuidv7: infinite intervals are rejected +SELECT uuidv7('infinity'::interval); +SELECT uuidv7('-infinity'::interval); + +-- uuidv7: timestamps before Unix epoch are rejected +SELECT uuidv7('-1000 years'::interval); + +-- uuidv7: timestamps beyond 48-bit ms field (~year 10889) are rejected +SELECT uuidv7('9000 years'::interval); + +-- uuidv7: a large but in-range forward shift is accepted +SELECT uuid_extract_timestamp(uuidv7('1000 years'::interval)) > now() + '999 years'::interval; + -- extract functions -- version diff --git a/src/test/regress/sql/window.sql b/src/test/regress/sql/window.sql index ff58f45ce26..cbc11c704ab 100644 --- a/src/test/regress/sql/window.sql +++ b/src/test/regress/sql/window.sql @@ -1361,16 +1361,37 @@ SELECT * FROM WHERE c <= 3; -- Ensure we get the correct run condition when the window function is both --- monotonically increasing and decreasing. +-- monotonically increasing and decreasing in RANGE mode without an ORDER BY EXPLAIN (COSTS OFF) SELECT * FROM (SELECT empno, depname, salary, - count(empno) OVER () c + count(empno) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) c FROM empsalary) emp WHERE c = 1; +-- As above, but check we detect it's monotonically increasing +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER (RANGE BETWEEN CURRENT ROW AND CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure that ROWS mode without an ORDER BY doesn't think it's monotonically +-- decreasing, i.e. don't push down the run condition. +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + depname, + salary, + count(empno) OVER (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) c + 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, @@ -1460,6 +1481,96 @@ SELECT * FROM FROM empsalary) emp WHERE c = 1; +-- +-- Ensure we get the correct behavior for run condition pushdown when the +-- frame option has an EXCLUDE clause +-- + +-- Ensure pushdown occurs for ROWS BETWEEN UNBOUNDED PRECEDING with EXCLUDE +-- CURRENT ROW with COUNT(*) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure pushdown occurs for GROUPS BETWEEN UNBOUNDED PRECEDING with EXCLUDE +-- CURRENT ROW with COUNT(*) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure pushdown occurs for RANGE BETWEEN UNBOUNDED PRECEDING with EXCLUDE +-- CURRENT ROW with COUNT(*) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure we don't get pushdown when a FILTER clause is present +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) FILTER (WHERE salary > 4000) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure we don't get pushdown with COUNT(ANY) +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(salary) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure we don't get pushdown with EXCLUDE GROUP +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE GROUP) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure we don't get pushdown with EXCLUDE TIES +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure we don't get pushdown with GROUPS mode and EXCLUDE GROUP +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE GROUP) c + FROM empsalary) emp +WHERE c <= 3; + +-- Ensure we don't get pushdown with GROUPS mode and EXCLUDE TIES +EXPLAIN (COSTS OFF) +SELECT * FROM + (SELECT empno, + salary, + count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES) c + FROM empsalary) emp +WHERE c <= 3; + + -- Test Sort node collapsing EXPLAIN (COSTS OFF) SELECT * FROM diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql index 0ea4f508837..d999b240d6a 100644 --- a/src/test/regress/sql/xml.sql +++ b/src/test/regress/sql/xml.sql @@ -5,7 +5,14 @@ CREATE TABLE xmltest ( INSERT INTO xmltest VALUES (1, 'one'); INSERT INTO xmltest VALUES (2, 'two'); -INSERT INTO xmltest VALUES (3, 'three '); + +-- If no XML data could be inserted, skip the tests as the server has been +-- compiled without libxml support. +SELECT count(*) = 0 AS skip_test FROM xmltest \gset +\if :skip_test +\quit +\endif SELECT * FROM xmltest; @@ -30,7 +37,7 @@ SELECT xmlconcat(xmlcomment('hello'), SELECT xmlconcat('hello', 'you'); SELECT xmlconcat(1, 2); -SELECT xmlconcat('bad', ' '); SELECT xmlconcat('', NULL, ''); SELECT xmlconcat('', NULL, ''); SELECT xmlconcat(NULL); @@ -75,17 +82,17 @@ SELECT xmlparse(content '&'); SELECT xmlparse(content '&idontexist;'); SELECT xmlparse(content ''); SELECT xmlparse(content ''); -SELECT xmlparse(content '&idontexist;'); +SELECT xmlparse(content '&idontexist; '); SELECT xmlparse(content ''); -SELECT xmlparse(document ' '); +SELECT xmlparse(document '!'); SELECT xmlparse(document 'abc'); SELECT xmlparse(document 'x'); -SELECT xmlparse(document '&'); -SELECT xmlparse(document '&idontexist;'); +SELECT xmlparse(document '& '); +SELECT xmlparse(document '&idontexist; '); SELECT xmlparse(document ''); SELECT xmlparse(document ''); -SELECT xmlparse(document '&idontexist;'); +SELECT xmlparse(document '&idontexist; '); SELECT xmlparse(document ''); @@ -244,6 +251,7 @@ SELECT xpath('count(//*)=3', ''); SELECT xpath('name(/*)', ''); SELECT xpath('/nosuchtag', ''); SELECT xpath('root', ''); +SELECT xpath('//namespace::foo', ''); -- Round-trip non-ASCII data through xpath(). DO $$ diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index 310d70a4c08..973399b63d0 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -819,7 +819,7 @@ sub switch_server_cert "$common_connstr user=ssltestuser sslcert=ssl/client-revoked.crt " . sslkey('client-revoked.key'), "certificate authorization fails with revoked client cert", - expected_stderr => qr|SSL error: ssl[a-z0-9/]* alert certificate revoked|, + expected_stderr => qr!SSL error: (ssl[a-z0-9/]*|tls) alert certificate revoked!, log_like => [ qr{Client certificate verification failed at depth 0: certificate revoked}, qr{Failed certificate data \(unverified\): subject "/CN=ssltestuser", serial number \d+, issuer "/CN=Test CA for PostgreSQL SSL regression test client certs"}, @@ -921,7 +921,7 @@ sub switch_server_cert "$common_connstr user=ssltestuser sslcert=ssl/client-revoked.crt " . sslkey('client-revoked.key'), "certificate authorization fails with revoked client cert with server-side CRL directory", - expected_stderr => qr|SSL error: ssl[a-z0-9/]* alert certificate revoked|, + expected_stderr => qr!SSL error: (ssl[a-z0-9/]*|tls) alert certificate revoked!, log_like => [ qr{Client certificate verification failed at depth 0: certificate revoked}, qr{Failed certificate data \(unverified\): subject "/CN=ssltestuser", serial number \d+, issuer "/CN=Test CA for PostgreSQL SSL regression test client certs"}, @@ -932,7 +932,7 @@ sub switch_server_cert "$common_connstr user=ssltestuser sslcert=ssl/client-revoked-utf8.crt " . sslkey('client-revoked-utf8.key'), "certificate authorization fails with revoked UTF-8 client cert with server-side CRL directory", - expected_stderr => qr|SSL error: ssl[a-z0-9/]* alert certificate revoked|, + expected_stderr => qr!SSL error: (ssl[a-z0-9/]*|tls) alert certificate revoked!, log_like => [ qr{Client certificate verification failed at depth 0: certificate revoked}, qr{Failed certificate data \(unverified\): subject "/CN=\\xce\\x9f\\xce\\xb4\\xcf\\x85\\xcf\\x83\\xcf\\x83\\xce\\xad\\xce\\xb1\\xcf\\x82", serial number \d+, issuer "/CN=Test CA for PostgreSQL SSL regression test client certs"}, diff --git a/src/test/subscription/t/021_twophase.pl b/src/test/subscription/t/021_twophase.pl index b8e4242d1f1..ab2e0a7fa8d 100644 --- a/src/test/subscription/t/021_twophase.pl +++ b/src/test/subscription/t/021_twophase.pl @@ -309,6 +309,47 @@ "SELECT count(*) FROM pg_prepared_xacts;"); is($result, qq(0), 'transaction is aborted on subscriber'); +############################### +# Test that an empty prepared transaction is not replicated. +# +# A transaction that is assigned an XID but makes no change decoded by logical +# replication (here, via a row lock) must not be sent to the subscriber. +# Otherwise the subscriber would receive a PREPARE with no preceding BEGIN +# PREPARE and error out, breaking replication. +############################### + +# An empty prepared transaction that is committed. +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + SELECT a FROM tab_full WHERE a = 1 FOR SHARE; + PREPARE TRANSACTION 'test_empty_prepared'; + COMMIT PREPARED 'test_empty_prepared';"); + +# An empty prepared transaction that is rolled back. +$node_publisher->safe_psql( + 'postgres', " + BEGIN; + SELECT a FROM tab_full WHERE a = 1 FOR SHARE; + PREPARE TRANSACTION 'test_empty_prepared'; + ROLLBACK PREPARED 'test_empty_prepared';"); + +# A subsequent normal change must still replicate. Reaching catchup confirms +# the apply worker was not stalled by the empty prepared transactions above. +$node_publisher->safe_psql('postgres', "INSERT INTO tab_full VALUES (31);"); +$node_publisher->wait_for_catchup($appname); + +# The empty transactions must not have been prepared on the subscriber. +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'empty prepared transaction is not replicated'); + +# The subsequent change is visible, so replication is healthy. +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM tab_full WHERE a = 31;"); +is($result, qq(1), + 'replication continues after an empty prepared transaction'); + ############################### # copy_data=false and two_phase ############################### diff --git a/src/test/subscription/t/023_twophase_stream.pl b/src/test/subscription/t/023_twophase_stream.pl index dc629425daa..301c4d901c8 100644 --- a/src/test/subscription/t/023_twophase_stream.pl +++ b/src/test/subscription/t/023_twophase_stream.pl @@ -439,6 +439,8 @@ sub test_streaming )); $node_subscriber->restart; +$offset = -s $node_subscriber->logfile; + $node_publisher->safe_psql( 'postgres', q{ BEGIN; @@ -447,8 +449,6 @@ sub test_streaming COMMIT PREPARED 'xact'; }); -$offset = -s $node_subscriber->logfile; - # Confirm the ERROR is reported because max_prepared_transactions is zero $node_subscriber->wait_for_log( qr/ERROR: ( [A-Z0-9]+:)? prepared transactions are disabled/, diff --git a/src/test/subscription/t/100_bugs.pl b/src/test/subscription/t/100_bugs.pl index 50223054918..8aaf0eebb60 100644 --- a/src/test/subscription/t/100_bugs.pl +++ b/src/test/subscription/t/100_bugs.pl @@ -477,13 +477,13 @@ is( $result, qq(2|f 3|t), 'check replicated update on subscriber'); -# Test create and immediate drop of replication slot via replication commands -# (this exposed a memory-management bug in v18) my $publisher_host = $node_publisher->host; my $publisher_port = $node_publisher->port; my $connstr_db = "host=$publisher_host port=$publisher_port replication=database dbname=postgres"; +# Test create and immediate drop of replication slot via replication commands +# (this exposed a memory-management bug in v18) is( $node_publisher->psql( 'postgres', qq[ @@ -495,6 +495,27 @@ 0, 'create and immediate drop of replication slot'); +# REPLICATION users should not be able to bypass LOAD restrictions. +$node_publisher->safe_psql( + 'postgres', qq( + CREATE USER repluser REPLICATION; +)); + +my ($ret, $stdout, $stderr) = $node_publisher->psql( + 'postgres', + qq[ + SET ROLE repluser; + CREATE_REPLICATION_SLOT fail_slot LOGICAL regress;', + ], + timeout => $PostgreSQL::Test::Utils::timeout_default, + extra_params => [ '-d', $connstr_db ]); + +is($ret, 3, 'loading unblessed output plugin fails'); +like( + $stderr, + qr/ERROR: library "regress" may not be used as an output plugin/, + 'loading unblessed output plugin fails: stderr'); + $node_publisher->stop('fast'); $node_subscriber->stop('fast'); @@ -592,7 +613,7 @@ BEGIN CREATE SUBSCRIPTION regress_sub1 CONNECTION '$publisher_connstr' PUBLICATION regress_pub WITH (connect=false); )); -my ($ret, $stdout, $stderr) = +($ret, $stdout, $stderr) = $node_publisher->psql('postgres', q{DROP SUBSCRIPTION regress_sub1}); isnt($ret, 0, "replication slot does not exist: exit code not 0"); @@ -605,4 +626,49 @@ BEGIN $node_publisher->stop('fast'); +# https://postgr.es/m/19c7623e882.4080fd5426212.311756747309556767%40zohocorp.com + +# The bug was that when an ERROR was raised while processing an INSERT ... ON +# CONFLICT statement, the decoded change misses to be free'd. This can cause an +# assertion failure if enabled. + +$node_publisher->rotate_logfile(); +$node_publisher->start(); + +# Create a publication with the zero-division row filter. It always throws an +# ERROR before publishing changes, when the filter is evaluated. +$node_publisher->safe_psql( + 'postgres', qq( + CREATE TABLE tab_upsert (a INT PRIMARY KEY, b INT); + CREATE PUBLICATION pub_rowfilter_error FOR TABLE tab_upsert WHERE ((a / 0) > 0); + SELECT * FROM pg_create_logical_replication_slot('upsert_slot', 'pgoutput'); + INSERT INTO tab_upsert (a, b) VALUES (1, 1) + ON CONFLICT(a) DO UPDATE SET b = excluded.b; +)); + +# Decode the changes with a publication whose row filter causes a +# division by zero error, and verify that the logical decoder doesn't crash. +($ret, $stdout, $stderr) = $node_publisher->psql( + 'postgres', qq( + SELECT * + FROM pg_logical_slot_peek_binary_changes( + 'upsert_slot', + NULL, + NULL, + 'proto_version', '1', + 'publication_names', 'pub_rowfilter_error' + ); +)); + +ok( $stderr =~ qr/division by zero/, + 'peek logical changes with row filter causing division by zero throws error' +); + +# Clean up +$node_publisher->safe_psql('postgres', "SELECT pg_drop_replication_slot('upsert_slot')"); +$node_publisher->safe_psql('postgres', "DROP PUBLICATION pub_rowfilter_error"); +$node_publisher->safe_psql('postgres', "DROP TABLE tab_upsert"); + +$node_publisher->stop('fast'); + done_testing(); diff --git a/src/timezone/data/tzdata.zi b/src/timezone/data/tzdata.zi index 53082964703..079a47fda43 100644 --- a/src/timezone/data/tzdata.zi +++ b/src/timezone/data/tzdata.zi @@ -1,4 +1,4 @@ -# version 2026b +# version 2026c # redo posix_only # This zic input file is in the public domain. R d 1916 o - Jun 14 23s 1 S @@ -135,132 +135,6 @@ R M 2025 o - F 23 3 -1 - R M 2025 o - Ap 6 2 0 - R M 2026 o - F 15 3 -1 - R M 2026 o - Mar 22 2 0 - -R M 2027 o - F 7 3 -1 - -R M 2027 o - Mar 14 2 0 - -R M 2028 o - Ja 23 3 -1 - -R M 2028 o - Mar 5 2 0 - -R M 2029 o - Ja 14 3 -1 - -R M 2029 o - F 18 2 0 - -R M 2029 o - D 30 3 -1 - -R M 2030 o - F 10 2 0 - -R M 2030 o - D 22 3 -1 - -R M 2031 o - Ja 26 2 0 - -R M 2031 o - D 14 3 -1 - -R M 2032 o - Ja 18 2 0 - -R M 2032 o - N 28 3 -1 - -R M 2033 o - Ja 9 2 0 - -R M 2033 o - N 20 3 -1 - -R M 2033 o - D 25 2 0 - -R M 2034 o - N 5 3 -1 - -R M 2034 o - D 17 2 0 - -R M 2035 o - O 28 3 -1 - -R M 2035 o - D 9 2 0 - -R M 2036 o - O 19 3 -1 - -R M 2036 o - N 23 2 0 - -R M 2037 o - O 4 3 -1 - -R M 2037 o - N 15 2 0 - -R M 2038 o - S 26 3 -1 - -R M 2038 o - O 31 2 0 - -R M 2039 o - S 18 3 -1 - -R M 2039 o - O 23 2 0 - -R M 2040 o - S 2 3 -1 - -R M 2040 o - O 14 2 0 - -R M 2041 o - Au 25 3 -1 - -R M 2041 o - S 29 2 0 - -R M 2042 o - Au 10 3 -1 - -R M 2042 o - S 21 2 0 - -R M 2043 o - Au 2 3 -1 - -R M 2043 o - S 13 2 0 - -R M 2044 o - Jul 24 3 -1 - -R M 2044 o - Au 28 2 0 - -R M 2045 o - Jul 9 3 -1 - -R M 2045 o - Au 20 2 0 - -R M 2046 o - Jul 1 3 -1 - -R M 2046 o - Au 5 2 0 - -R M 2047 o - Jun 23 3 -1 - -R M 2047 o - Jul 28 2 0 - -R M 2048 o - Jun 7 3 -1 - -R M 2048 o - Jul 19 2 0 - -R M 2049 o - May 30 3 -1 - -R M 2049 o - Jul 4 2 0 - -R M 2050 o - May 15 3 -1 - -R M 2050 o - Jun 26 2 0 - -R M 2051 o - May 7 3 -1 - -R M 2051 o - Jun 18 2 0 - -R M 2052 o - Ap 28 3 -1 - -R M 2052 o - Jun 2 2 0 - -R M 2053 o - Ap 13 3 -1 - -R M 2053 o - May 25 2 0 - -R M 2054 o - Ap 5 3 -1 - -R M 2054 o - May 10 2 0 - -R M 2055 o - Mar 28 3 -1 - -R M 2055 o - May 2 2 0 - -R M 2056 o - Mar 12 3 -1 - -R M 2056 o - Ap 23 2 0 - -R M 2057 o - Mar 4 3 -1 - -R M 2057 o - Ap 8 2 0 - -R M 2058 o - F 17 3 -1 - -R M 2058 o - Mar 31 2 0 - -R M 2059 o - F 9 3 -1 - -R M 2059 o - Mar 23 2 0 - -R M 2060 o - F 1 3 -1 - -R M 2060 o - Mar 7 2 0 - -R M 2061 o - Ja 16 3 -1 - -R M 2061 o - F 27 2 0 - -R M 2062 o - Ja 8 3 -1 - -R M 2062 o - F 12 2 0 - -R M 2062 o - D 31 3 -1 - -R M 2063 o - F 4 2 0 - -R M 2063 o - D 16 3 -1 - -R M 2064 o - Ja 27 2 0 - -R M 2064 o - D 7 3 -1 - -R M 2065 o - Ja 11 2 0 - -R M 2065 o - N 22 3 -1 - -R M 2066 o - Ja 3 2 0 - -R M 2066 o - N 14 3 -1 - -R M 2066 o - D 26 2 0 - -R M 2067 o - N 6 3 -1 - -R M 2067 o - D 11 2 0 - -R M 2068 o - O 21 3 -1 - -R M 2068 o - D 2 2 0 - -R M 2069 o - O 13 3 -1 - -R M 2069 o - N 17 2 0 - -R M 2070 o - O 5 3 -1 - -R M 2070 o - N 9 2 0 - -R M 2071 o - S 20 3 -1 - -R M 2071 o - N 1 2 0 - -R M 2072 o - S 11 3 -1 - -R M 2072 o - O 16 2 0 - -R M 2073 o - Au 27 3 -1 - -R M 2073 o - O 8 2 0 - -R M 2074 o - Au 19 3 -1 - -R M 2074 o - S 30 2 0 - -R M 2075 o - Au 11 3 -1 - -R M 2075 o - S 15 2 0 - -R M 2076 o - Jul 26 3 -1 - -R M 2076 o - S 6 2 0 - -R M 2077 o - Jul 18 3 -1 - -R M 2077 o - Au 22 2 0 - -R M 2078 o - Jul 10 3 -1 - -R M 2078 o - Au 14 2 0 - -R M 2079 o - Jun 25 3 -1 - -R M 2079 o - Au 6 2 0 - -R M 2080 o - Jun 16 3 -1 - -R M 2080 o - Jul 21 2 0 - -R M 2081 o - Jun 1 3 -1 - -R M 2081 o - Jul 13 2 0 - -R M 2082 o - May 24 3 -1 - -R M 2082 o - Jun 28 2 0 - -R M 2083 o - May 16 3 -1 - -R M 2083 o - Jun 20 2 0 - -R M 2084 o - Ap 30 3 -1 - -R M 2084 o - Jun 11 2 0 - -R M 2085 o - Ap 22 3 -1 - -R M 2085 o - May 27 2 0 - -R M 2086 o - Ap 14 3 -1 - -R M 2086 o - May 19 2 0 - -R M 2087 o - Mar 30 3 -1 - -R M 2087 o - May 11 2 0 - R NA 1994 o - Mar 21 0 -1 WAT R NA 1994 2017 - S Su>=1 2 0 CAT R NA 1995 2017 - Ap Su>=1 2 -1 WAT @@ -2106,7 +1980,8 @@ Z Africa/Casablanca -0:30:20 - LMT 1913 O 26 0 M %z 1984 Mar 16 1 - %z 1986 0 M %z 2018 O 28 3 -1 M %z +1 M %z 2026 S 20 2 +0 - %z Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u 0 - WET 1918 May 6 23 0 1 WEST 1918 O 7 23 @@ -2119,7 +1994,8 @@ Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u Z Africa/El_Aaiun -0:52:48 - LMT 1934 -1 - %z 1976 Ap 14 0 M %z 2018 O 28 3 -1 M %z +1 M %z 2026 S 20 2 +0 - %z Z Africa/Johannesburg 1:52 - LMT 1892 F 8 1:30 - SAST 1903 Mar 2 SA SAST @@ -2483,7 +2359,9 @@ Z America/Detroit -5:32:11 - LMT 1905 -5 u E%sT Z America/Edmonton -7:33:52 - LMT 1906 S -7 Ed M%sT 1987 --7 C M%sT +-7 C M%sT 2026 Jun 18 +-7 1 MDT 2026 N 1 2 +-6 - CST Z America/Eirunepe -4:39:28 - LMT 1914 -5 B %z 1988 S 12 -5 - %z 1993 S 28 diff --git a/src/tools/pg_bsd_indent/indent.c b/src/tools/pg_bsd_indent/indent.c index 2622cc6227a..040894463fb 100644 --- a/src/tools/pg_bsd_indent/indent.c +++ b/src/tools/pg_bsd_indent/indent.c @@ -535,7 +535,7 @@ main(int argc, char **argv) case lparen: /* got a '(' or '[' */ /* count parens to make Healy happy */ if (++ps.p_l_follow == nitems(ps.paren_indents)) { - diag3(0, "Reached internal limit of %d unclosed parens", + diag3(0, "Reached internal limit of %zu unclosed parens", nitems(ps.paren_indents)); ps.p_l_follow--; } @@ -808,7 +808,7 @@ main(int argc, char **argv) * declaration or an init */ di_stack[ps.dec_nest] = dec_ind; if (++ps.dec_nest == nitems(di_stack)) { - diag3(0, "Reached internal limit of %d struct levels", + diag3(0, "Reached internal limit of %zu struct levels", nitems(di_stack)); ps.dec_nest--; } diff --git a/src/tools/pg_bsd_indent/indent.h b/src/tools/pg_bsd_indent/indent.h index e9e71d667d8..974ffe1ac27 100644 --- a/src/tools/pg_bsd_indent/indent.h +++ b/src/tools/pg_bsd_indent/indent.h @@ -39,9 +39,7 @@ int compute_label_target(void); int count_spaces(int, char *); int count_spaces_until(int, char *, char *); int lexi(struct parser_state *); -void diag2(int, const char *); -void diag3(int, const char *, int); -void diag4(int, const char *, int, int); +void diag(int level, const char *msg, ...) pg_attribute_printf(2, 3); void dump_line(void); int lookahead(void); void lookahead_reset(void); @@ -51,3 +49,8 @@ void pr_comment(void); void set_defaults(void); void set_option(char *); void set_profile(const char *); + +/* backwards-compatibility macros */ +#define diag2(level, msg) diag(level, msg) +#define diag3(level, msg, a) diag(level, msg, a) +#define diag4(level, msg, a, b) diag(level, msg, a, b) diff --git a/src/tools/pg_bsd_indent/io.c b/src/tools/pg_bsd_indent/io.c index 9d64ca1ee56..364d5744063 100644 --- a/src/tools/pg_bsd_indent/io.c +++ b/src/tools/pg_bsd_indent/io.c @@ -553,53 +553,22 @@ count_spaces(int cur, char *buffer) } void -diag4(int level, const char *msg, int a, int b) +diag(int level, const char *msg, ...) { - if (level) - found_err = 1; - if (output == stdout) { - fprintf(stdout, "/**INDENT** %s@%d: ", level == 0 ? "Warning" : "Error", line_no); - fprintf(stdout, msg, a, b); - fprintf(stdout, " */\n"); - } - else { - fprintf(stderr, "%s@%d: ", level == 0 ? "Warning" : "Error", line_no); - fprintf(stderr, msg, a, b); - fprintf(stderr, "\n"); - } -} - -void -diag3(int level, const char *msg, int a) -{ - if (level) - found_err = 1; - if (output == stdout) { - fprintf(stdout, "/**INDENT** %s@%d: ", level == 0 ? "Warning" : "Error", line_no); - fprintf(stdout, msg, a); - fprintf(stdout, " */\n"); - } - else { - fprintf(stderr, "%s@%d: ", level == 0 ? "Warning" : "Error", line_no); - fprintf(stderr, msg, a); - fprintf(stderr, "\n"); - } -} + va_list ap; -void -diag2(int level, const char *msg) -{ + va_start(ap, msg); if (level) found_err = 1; if (output == stdout) { fprintf(stdout, "/**INDENT** %s@%d: ", level == 0 ? "Warning" : "Error", line_no); - fprintf(stdout, "%s", msg); + vfprintf(stdout, msg, ap); fprintf(stdout, " */\n"); } else { fprintf(stderr, "%s@%d: ", level == 0 ? "Warning" : "Error", line_no); - fprintf(stderr, "%s", msg); + vfprintf(stderr, msg, ap); fprintf(stderr, "\n"); } + va_end(ap); } - diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 8cd74c4e5b6..b6f0897dc84 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -2344,6 +2344,7 @@ PsqlScanQuoteType PsqlScanResult PsqlScanState PsqlScanStateData +PsqlScanStateSave PsqlSettings Publication PublicationActions @@ -3667,7 +3668,9 @@ gistxlogPageDelete gistxlogPageReuse gistxlogPageSplit gistxlogPageUpdate +grouping_eqop_callback grouping_sets_data +grouping_walker_ctx growable_trgm_array gseg_picksplit_item gss_OID_set @@ -3680,7 +3683,7 @@ gss_key_value_set_desc gss_name_t gtrgm_consistent_cache gzFile -having_collation_ctx +having_grouping_ctx hbaPort heap_page_items_state help_handler @@ -3972,6 +3975,7 @@ pthread_mutex_t pthread_once_t pthread_t ptrdiff_t +publication_tables_state published_rel pull_var_clause_context pull_varattnos_context