Version in base suite: 17.10-0+deb13u1 Base version: postgresql-17_17.10-0+deb13u1 Target version: postgresql-17_17.11-0+deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/p/postgresql-17/postgresql-17_17.10-0+deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/p/postgresql-17/postgresql-17_17.11-0+deb13u1.dsc .abi-compliance-history | 24 .cirrus.tasks.yml | 2 configure | 18 configure.ac | 2 contrib/amcheck/expected/check_btree.out | 17 contrib/amcheck/sql/check_btree.sql | 18 contrib/amcheck/verify_nbtree.c | 2 contrib/btree_gist/btree_float4.c | 59 contrib/btree_gist/btree_float8.c | 51 contrib/btree_gist/btree_utils_num.c | 15 contrib/btree_gist/btree_utils_num.h | 131 contrib/btree_gist/btree_utils_var.c | 23 contrib/btree_gist/data/float4.data | 3 contrib/btree_gist/data/float8.data | 3 contrib/btree_gist/expected/float4.out | 51 contrib/btree_gist/expected/float8.out | 51 contrib/btree_gist/expected/numeric.out | 48 contrib/btree_gist/sql/float4.sql | 17 contrib/btree_gist/sql/float8.sql | 17 contrib/fuzzystrmatch/expected/fuzzystrmatch.out | 14 contrib/fuzzystrmatch/sql/fuzzystrmatch.sql | 3 contrib/hstore_plperl/hstore_plperl.c | 20 contrib/hstore_plpython/expected/hstore_plpython.out | 65 contrib/hstore_plpython/hstore_plpython.c | 16 contrib/hstore_plpython/sql/hstore_plpython.sql | 65 contrib/intarray/_int_selfuncs.c | 3 contrib/intarray/expected/_int.out | 15 contrib/intarray/sql/_int.sql | 13 contrib/jsonb_plperl/jsonb_plperl.c | 15 contrib/jsonb_plpython/expected/jsonb_plpython.out | 89 contrib/jsonb_plpython/jsonb_plpython.c | 28 contrib/jsonb_plpython/sql/jsonb_plpython.sql | 77 contrib/ltree/expected/ltree.out | 34 contrib/ltree/ltree.h | 1 contrib/ltree/ltree_gist.c | 6 contrib/ltree/ltree_op.c | 49 contrib/ltree/sql/ltree.sql | 26 contrib/pg_surgery/expected/heap_surgery.out | 17 contrib/pg_surgery/heap_surgery.c | 52 contrib/pg_surgery/sql/heap_surgery.sql | 8 contrib/pg_trgm/trgm_gist.c | 4 contrib/pgcrypto/expected/pgp-decrypt.out | 26 contrib/pgcrypto/expected/pgp-decrypt_1.out | 32 contrib/pgcrypto/expected/pgp-encrypt_1.out | 192 contrib/pgcrypto/expected/pgp-info.out | 3 contrib/pgcrypto/expected/pgp-pubkey-decrypt.out | 30 contrib/pgcrypto/expected/pgp-pubkey-decrypt_1.out | 30 contrib/pgcrypto/openssl.c | 5 contrib/pgcrypto/pgp-cfb.c | 27 contrib/pgcrypto/pgp-decrypt.c | 9 contrib/pgcrypto/pgp-encrypt.c | 6 contrib/pgcrypto/pgp-pgsql.c | 2 contrib/pgcrypto/pgp-pubkey.c | 9 contrib/pgcrypto/pgp.c | 9 contrib/pgcrypto/pgp.h | 7 contrib/pgcrypto/sql/pgp-decrypt.sql | 26 contrib/pgcrypto/sql/pgp-pubkey-decrypt.sql | 27 contrib/postgres_fdw/expected/postgres_fdw.out | 70 contrib/postgres_fdw/postgres_fdw.c | 13 contrib/postgres_fdw/sql/postgres_fdw.sql | 14 contrib/seg/expected/seg.out | 45 contrib/seg/seg.c | 2 contrib/seg/sql/seg.sql | 11 contrib/spi/refint.c | 343 - contrib/sslinfo/sslinfo.c | 26 contrib/test_decoding/expected/permissions.out | 11 contrib/test_decoding/expected/slot.out | 3 contrib/test_decoding/expected/twophase.out | 25 contrib/test_decoding/sql/permissions.sql | 8 contrib/test_decoding/sql/slot.sql | 3 contrib/test_decoding/sql/twophase.sql | 12 contrib/xml2/expected/xml2.out | 8 contrib/xml2/expected/xml2_1.out | 8 contrib/xml2/sql/xml2.sql | 4 contrib/xml2/xpath.c | 15 debian/changelog | 361 + debian/patches/extension_destdir | 18 debian/patches/series | 1 debian/patches/v2-0001-psql-count-every-COPY-FROM-STDIN-when-scanning-a-.patch | 119 doc/src/sgml/config.sgml | 78 doc/src/sgml/contrib-spi.sgml | 61 doc/src/sgml/ddl.sgml | 10 doc/src/sgml/ecpg.sgml | 6 doc/src/sgml/func.sgml | 14 doc/src/sgml/logical-replication.sgml | 9 doc/src/sgml/maintenance.sgml | 14 doc/src/sgml/pgcrypto.sgml | 32 doc/src/sgml/ref/alter_table.sgml | 9 doc/src/sgml/ref/copy.sgml | 9 doc/src/sgml/ref/create_type.sgml | 5 doc/src/sgml/ref/drop_subscription.sgml | 14 doc/src/sgml/ref/pg_recvlogical.sgml | 2 doc/src/sgml/ref/pgupgrade.sgml | 6 doc/src/sgml/ref/psql-ref.sgml | 10 doc/src/sgml/release-17.sgml | 2955 +++++++++- doc/src/sgml/rules.sgml | 2 doc/src/sgml/stylesheet-speedup-xhtml.xsl | 52 meson.build | 8 src/backend/access/gin/ginvacuum.c | 7 src/backend/access/hash/hash_xlog.c | 29 src/backend/access/heap/heapam.c | 753 +- src/backend/access/heap/hio.c | 2 src/backend/access/heap/pruneheap.c | 4 src/backend/access/heap/visibilitymap.c | 34 src/backend/access/nbtree/nbtsearch.c | 18 src/backend/access/transam/multixact.c | 12 src/backend/access/transam/xlog.c | 4 src/backend/access/transam/xlogutils.c | 38 src/backend/backup/basebackup.c | 2 src/backend/backup/basebackup_progress.c | 16 src/backend/backup/basebackup_server.c | 8 src/backend/catalog/dependency.c | 84 src/backend/catalog/heap.c | 25 src/backend/catalog/index.c | 39 src/backend/catalog/namespace.c | 6 src/backend/catalog/objectaddress.c | 2 src/backend/catalog/pg_attrdef.c | 3 src/backend/catalog/pg_constraint.c | 3 src/backend/catalog/pg_depend.c | 133 src/backend/catalog/pg_proc.c | 6 src/backend/catalog/pg_publication.c | 56 src/backend/catalog/pg_type.c | 6 src/backend/commands/event_trigger.c | 10 src/backend/commands/indexcmds.c | 18 src/backend/commands/policy.c | 8 src/backend/commands/sequence.c | 1 src/backend/commands/statscmds.c | 53 src/backend/commands/subscriptioncmds.c | 30 src/backend/commands/tablecmds.c | 91 src/backend/commands/trigger.c | 5 src/backend/commands/typecmds.c | 37 src/backend/commands/vacuum.c | 2 src/backend/executor/execExprInterp.c | 50 src/backend/executor/execTuples.c | 6 src/backend/executor/nodeAppend.c | 97 src/backend/executor/nodeHashjoin.c | 2 src/backend/executor/nodeIndexonlyscan.c | 113 src/backend/executor/nodeWindowAgg.c | 33 src/backend/jit/llvm/llvmjit.c | 24 src/backend/libpq/auth-scram.c | 2 src/backend/libpq/be-secure-openssl.c | 26 src/backend/nodes/makefuncs.c | 2 src/backend/optimizer/path/allpaths.c | 2 src/backend/optimizer/plan/subselect.c | 4 src/backend/optimizer/prep/prepjointree.c | 69 src/backend/optimizer/util/clauses.c | 85 src/backend/parser/parse_agg.c | 18 src/backend/parser/parse_coerce.c | 8 src/backend/parser/parse_expr.c | 21 src/backend/parser/parse_func.c | 55 src/backend/parser/parse_oper.c | 22 src/backend/parser/parse_utilcmd.c | 10 src/backend/partitioning/partbounds.c | 14 src/backend/partitioning/partprune.c | 10 src/backend/po/de.po | 2353 ++++--- src/backend/po/ja.po | 2401 ++++---- src/backend/po/ru.po | 2337 ++++--- src/backend/postmaster/autovacuum.c | 4 src/backend/postmaster/walsummarizer.c | 175 src/backend/replication/libpqwalreceiver/libpqwalreceiver.c | 110 src/backend/replication/logical/logical.c | 73 src/backend/replication/logical/reorderbuffer.c | 40 src/backend/replication/logical/slotsync.c | 25 src/backend/replication/logical/tablesync.c | 1 src/backend/replication/logical/worker.c | 27 src/backend/replication/repl_scanner.l | 4 src/backend/replication/slot.c | 76 src/backend/replication/walreceiver.c | 79 src/backend/replication/walreceiverfuncs.c | 14 src/backend/replication/walsender.c | 24 src/backend/rewrite/rewriteDefine.c | 38 src/backend/statistics/dependencies.c | 2 src/backend/storage/aio/read_stream.c | 17 src/backend/storage/buffer/bufmgr.c | 55 src/backend/storage/ipc/procsignal.c | 13 src/backend/storage/lmgr/proc.c | 107 src/backend/tcop/backend_startup.c | 9 src/backend/tcop/postgres.c | 22 src/backend/tcop/pquery.c | 4 src/backend/tcop/utility.c | 22 src/backend/tsearch/dict_synonym.c | 4 src/backend/tsearch/spell.c | 18 src/backend/tsearch/to_tsany.c | 23 src/backend/tsearch/ts_parse.c | 27 src/backend/utils/activity/backend_progress.c | 2 src/backend/utils/activity/pgstat.c | 15 src/backend/utils/activity/pgstat_function.c | 4 src/backend/utils/activity/pgstat_replslot.c | 4 src/backend/utils/activity/pgstat_shmem.c | 47 src/backend/utils/activity/pgstat_xact.c | 8 src/backend/utils/activity/wait_event_names.txt | 1 src/backend/utils/adt/acl.c | 2 src/backend/utils/adt/cash.c | 16 src/backend/utils/adt/formatting.c | 182 src/backend/utils/adt/int8.c | 36 src/backend/utils/adt/jsonpath_exec.c | 24 src/backend/utils/adt/levenshtein.c | 89 src/backend/utils/adt/numeric.c | 76 src/backend/utils/adt/oracle_compat.c | 27 src/backend/utils/adt/pg_locale.c | 12 src/backend/utils/adt/regexp.c | 25 src/backend/utils/adt/rowtypes.c | 2 src/backend/utils/adt/ruleutils.c | 35 src/backend/utils/adt/selfuncs.c | 3 src/backend/utils/adt/timestamp.c | 8 src/backend/utils/adt/tsquery_util.c | 13 src/backend/utils/adt/tsvector.c | 28 src/backend/utils/adt/tsvector_op.c | 127 src/backend/utils/adt/varlena.c | 16 src/backend/utils/adt/xml.c | 4 src/backend/utils/cache/catcache.c | 2 src/backend/utils/cache/lsyscache.c | 85 src/backend/utils/cache/plancache.c | 60 src/backend/utils/cache/relcache.c | 2 src/backend/utils/cache/ts_cache.c | 29 src/backend/utils/cache/typcache.c | 25 src/backend/utils/fmgr/funcapi.c | 6 src/backend/utils/init/usercontext.c | 6 src/backend/utils/misc/guc_tables.c | 13 src/backend/utils/misc/postgresql.conf.sample | 3 src/backend/utils/mmgr/mcxt.c | 7 src/backend/utils/resowner/resowner.c | 20 src/bin/initdb/po/de.po | 22 src/bin/initdb/po/ja.po | 392 - src/bin/initdb/po/ru.po | 22 src/bin/pg_amcheck/po/de.po | 22 src/bin/pg_amcheck/po/ru.po | 22 src/bin/pg_archivecleanup/po/de.po | 18 src/bin/pg_archivecleanup/po/ru.po | 22 src/bin/pg_basebackup/pg_createsubscriber.c | 2 src/bin/pg_basebackup/pg_recvlogical.c | 16 src/bin/pg_basebackup/po/de.po | 324 - src/bin/pg_basebackup/po/ja.po | 208 src/bin/pg_basebackup/po/ru.po | 311 - src/bin/pg_basebackup/receivelog.c | 28 src/bin/pg_basebackup/streamutil.c | 57 src/bin/pg_basebackup/streamutil.h | 11 src/bin/pg_checksums/po/de.po | 18 src/bin/pg_checksums/po/ru.po | 22 src/bin/pg_combinebackup/Makefile | 2 src/bin/pg_combinebackup/meson.build | 1 src/bin/pg_combinebackup/po/de.po | 81 src/bin/pg_combinebackup/po/ja.po | 232 src/bin/pg_combinebackup/po/ru.po | 42 src/bin/pg_combinebackup/reconstruct.c | 3 src/bin/pg_combinebackup/t/012_vm_consistency.pl | 258 src/bin/pg_config/po/de.po | 18 src/bin/pg_config/po/ru.po | 22 src/bin/pg_controldata/po/de.po | 151 src/bin/pg_controldata/po/ru.po | 22 src/bin/pg_ctl/po/de.po | 22 src/bin/pg_ctl/po/ja.po | 309 - src/bin/pg_ctl/po/ru.po | 26 src/bin/pg_dump/common.c | 142 src/bin/pg_dump/dumputils.c | 110 src/bin/pg_dump/dumputils.h | 3 src/bin/pg_dump/parallel.c | 2 src/bin/pg_dump/pg_backup_archiver.c | 4 src/bin/pg_dump/pg_dump.c | 30 src/bin/pg_dump/pg_dump.h | 5 src/bin/pg_dump/po/de.po | 95 src/bin/pg_dump/po/ja.po | 194 src/bin/pg_dump/po/ru.po | 97 src/bin/pg_resetwal/po/de.po | 18 src/bin/pg_resetwal/po/ru.po | 20 src/bin/pg_rewind/po/de.po | 243 src/bin/pg_rewind/po/ja.po | 155 src/bin/pg_rewind/po/ru.po | 97 src/bin/pg_test_fsync/po/de.po | 18 src/bin/pg_test_fsync/po/ru.po | 22 src/bin/pg_test_timing/po/de.po | 18 src/bin/pg_test_timing/po/ja.po | 31 src/bin/pg_test_timing/po/ru.po | 20 src/bin/pg_upgrade/check.c | 85 src/bin/pg_upgrade/po/de.po | 62 src/bin/pg_upgrade/po/ru.po | 22 src/bin/pg_upgrade/t/003_logical_slots.pl | 49 src/bin/pg_verifybackup/po/de.po | 136 src/bin/pg_verifybackup/po/ru.po | 20 src/bin/pg_waldump/po/de.po | 76 src/bin/pg_waldump/po/ru.po | 22 src/bin/pg_walsummary/meson.build | 1 src/bin/pg_walsummary/po/de.po | 18 src/bin/pg_walsummary/po/ru.po | 22 src/bin/pg_walsummary/t/002_blocks.pl | 7 src/bin/pg_walsummary/t/003_tli_switch.pl | 149 src/bin/pgbench/pgbench.c | 29 src/bin/pgbench/t/002_pgbench_no_server.pl | 2 src/bin/psql/command.c | 26 src/bin/psql/common.c | 109 src/bin/psql/common.h | 2 src/bin/psql/copy.c | 48 src/bin/psql/describe.c | 4 src/bin/psql/mainloop.c | 15 src/bin/psql/po/de.po | 682 +- src/bin/psql/po/ru.po | 684 +- src/bin/psql/psqlscanslash.h | 5 src/bin/psql/psqlscanslash.l | 40 src/bin/psql/startup.c | 2 src/bin/psql/t/001_basic.pl | 7 src/bin/psql/tab-complete.c | 2 src/bin/scripts/po/de.po | 332 - src/bin/scripts/po/ru.po | 32 src/common/blkreftable.c | 22 src/common/unicode/case_test.c | 9 src/common/unicode_case.c | 33 src/common/unicode_norm.c | 2 src/fe_utils/conditional.c | 34 src/fe_utils/print.c | 7 src/fe_utils/psqlscan.l | 243 src/fe_utils/string_utils.c | 110 src/include/access/heapam_xlog.h | 46 src/include/access/visibilitymap.h | 2 src/include/access/xlogutils.h | 2 src/include/c.h | 9 src/include/catalog/dependency.h | 4 src/include/catalog/index.h | 1 src/include/catalog/pg_operator.dat | 4 src/include/commands/defrem.h | 2 src/include/commands/typecmds.h | 3 src/include/fe_utils/conditional.h | 17 src/include/fe_utils/psqlscan.h | 5 src/include/fe_utils/psqlscan_int.h | 28 src/include/fe_utils/string_utils.h | 2 src/include/nodes/parsenodes.h | 1 src/include/replication/logical.h | 3 src/include/replication/walreceiver.h | 7 src/include/tsearch/ts_type.h | 44 src/include/utils/acl.h | 3 src/include/utils/lsyscache.h | 2 src/include/utils/numeric.h | 5 src/include/utils/pgstat_internal.h | 2 src/include/utils/rel.h | 9 src/interfaces/ecpg/ecpglib/data.c | 7 src/interfaces/ecpg/ecpglib/error.c | 7 src/interfaces/ecpg/include/ecpgerrno.h | 1 src/interfaces/ecpg/preproc/ecpg.trailer | 12 src/interfaces/ecpg/preproc/po/ru.po | 12 src/interfaces/ecpg/test/expected/sql-bytea.c | 27 src/interfaces/ecpg/test/expected/sql-bytea.stderr | 24 src/interfaces/ecpg/test/sql/bytea.pgc | 5 src/interfaces/libpq/fe-misc.c | 156 src/interfaces/libpq/fe-protocol3.c | 3 src/interfaces/libpq/fe-secure-gssapi.c | 7 src/interfaces/libpq/fe-secure-openssl.c | 50 src/interfaces/libpq/fe-secure.c | 24 src/interfaces/libpq/libpq-int.h | 6 src/interfaces/libpq/po/de.po | 284 src/interfaces/libpq/po/ja.po | 157 src/interfaces/libpq/po/ru.po | 287 src/pl/plperl/SPI.xs | 6 src/pl/plperl/expected/plperl_array.out | 7 src/pl/plperl/plperl.c | 46 src/pl/plperl/sql/plperl_array.sql | 7 src/pl/plpgsql/src/pl_comp.c | 14 src/pl/plpgsql/src/pl_exec.c | 12 src/pl/plpython/expected/plpython_composite.out | 16 src/pl/plpython/expected/plpython_spi.out | 51 src/pl/plpython/expected/plpython_types.out | 16 src/pl/plpython/plpy_cursorobject.c | 5 src/pl/plpython/plpy_spi.c | 10 src/pl/plpython/plpy_typeio.c | 9 src/pl/plpython/po/de.po | 106 src/pl/plpython/po/ja.po | 295 src/pl/plpython/po/ru.po | 56 src/pl/plpython/sql/plpython_composite.sql | 12 src/pl/plpython/sql/plpython_spi.sql | 39 src/pl/plpython/sql/plpython_types.sql | 13 src/pl/tcl/pltcl.c | 42 src/port/pgmkdirp.c | 49 src/test/isolation/expected/ddl-dependency-locking.out | 137 src/test/isolation/expected/drop-owned-grant.out | 8 src/test/isolation/expected/pub-concurrent-drop.out | 16 src/test/isolation/isolation_schedule | 3 src/test/isolation/specs/ddl-dependency-locking.spec | 104 src/test/isolation/specs/drop-owned-grant.spec | 30 src/test/isolation/specs/pub-concurrent-drop.spec | 36 src/test/modules/injection_points/Makefile | 2 src/test/modules/injection_points/expected/reindex_concurrently_deferred.out | 41 src/test/modules/injection_points/expected/wait_cleanup.out | 87 src/test/modules/injection_points/injection_points.c | 66 src/test/modules/injection_points/injection_points.h | 33 src/test/modules/injection_points/meson.build | 2 src/test/modules/injection_points/specs/reindex_concurrently_deferred.spec | 50 src/test/modules/injection_points/specs/wait_cleanup.spec | 50 src/test/modules/test_misc/meson.build | 1 src/test/modules/test_misc/t/013_temp_obj_multisession.pl | 271 src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm | 8 src/test/perl/PostgreSQL/Test/Cluster.pm | 1 src/test/recovery/meson.build | 5 src/test/recovery/t/004_timeline_switch.pl | 19 src/test/recovery/t/053_standby_login_event_trigger.pl | 125 src/test/recovery/t/054_unlogged_sequence_promotion.pl | 34 src/test/recovery/t/055_cascade_reconnect.pl | 148 src/test/regress/expected/alter_table.out | 11 src/test/regress/expected/collate.linux.utf8.out | 18 src/test/regress/expected/compression_pglz.out | 12 src/test/regress/expected/copy.out | 4 src/test/regress/expected/encoding.out | 19 src/test/regress/expected/generated.out | 50 src/test/regress/expected/gist.out | 36 src/test/regress/expected/hash_part.out | 7 src/test/regress/expected/indexing.out | 15 src/test/regress/expected/join.out | 27 src/test/regress/expected/jsonb_jsonpath.out | 32 src/test/regress/expected/money.out | 8 src/test/regress/expected/object_address.out | 4 src/test/regress/expected/partition_prune.out | 46 src/test/regress/expected/privileges.out | 52 src/test/regress/expected/psql.out | 47 src/test/regress/expected/rangetypes.out | 15 src/test/regress/expected/rules.out | 2 src/test/regress/expected/sqljson.out | 134 src/test/regress/expected/sqljson_jsontable.out | 16 src/test/regress/expected/sqljson_queryfuncs.out | 21 src/test/regress/expected/stats_ext.out | 29 src/test/regress/expected/triggers.out | 37 src/test/regress/expected/unicode.out | 78 src/test/regress/expected/window.out | 204 src/test/regress/expected/xml.out | 62 src/test/regress/expected/xml_1.out | 1485 ----- src/test/regress/expected/xml_2.out | 1866 ------ src/test/regress/sql/alter_table.sql | 2 src/test/regress/sql/collate.linux.utf8.sql | 3 src/test/regress/sql/compression_pglz.sql | 10 src/test/regress/sql/copy.sql | 1 src/test/regress/sql/copy2.sql | 44 src/test/regress/sql/copyselect.sql | 1 src/test/regress/sql/encoding.sql | 12 src/test/regress/sql/generated.sql | 19 src/test/regress/sql/gist.sql | 29 src/test/regress/sql/hash_part.sql | 3 src/test/regress/sql/indexing.sql | 14 src/test/regress/sql/join.sql | 10 src/test/regress/sql/jsonb_jsonpath.sql | 7 src/test/regress/sql/money.sql | 4 src/test/regress/sql/object_address.sql | 4 src/test/regress/sql/partition_prune.sql | 20 src/test/regress/sql/privileges.sql | 51 src/test/regress/sql/psql.sql | 31 src/test/regress/sql/rangetypes.sql | 14 src/test/regress/sql/rowsecurity.sql | 4 src/test/regress/sql/rules.sql | 1 src/test/regress/sql/sqljson.sql | 63 src/test/regress/sql/sqljson_jsontable.sql | 9 src/test/regress/sql/sqljson_queryfuncs.sql | 8 src/test/regress/sql/stats_ext.sql | 20 src/test/regress/sql/triggers.sql | 10 src/test/regress/sql/unicode.sql | 20 src/test/regress/sql/window.sql | 115 src/test/regress/sql/xml.sql | 22 src/test/ssl/t/001_ssltests.pl | 4 src/test/subscription/t/021_twophase.pl | 41 src/test/subscription/t/023_twophase_stream.pl | 4 src/test/subscription/t/100_bugs.pl | 73 src/timezone/data/tzdata.zi | 138 src/tools/pg_bsd_indent/indent.c | 4 src/tools/pg_bsd_indent/indent.h | 9 src/tools/pg_bsd_indent/io.c | 43 src/tools/pgindent/typedefs.list | 2 460 files changed, 21155 insertions(+), 12003 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp6ybvdegh/postgresql-17_17.10-0+deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp6ybvdegh/postgresql-17_17.11-0+deb13u1.dsc: no acceptable signature found diff -Nru postgresql-17-17.10/.abi-compliance-history postgresql-17-17.11/.abi-compliance-history --- postgresql-17-17.10/.abi-compliance-history 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/.abi-compliance-history 2026-08-10 20:54:09.000000000 +0000 @@ -18,6 +18,30 @@ # Be sure to replace "" with details of your change and # why it is deemed acceptable. +d1c8aa0b09f18bba1343ce2e4aa537a17a8a972f +# +# Check for USAGE privilege on types used by stored expressions. +# 2026-08-10 06:38:19 -0700 +# +# The addition of a parameter to AlterDomainAddConstraint() breaks ABI +# compatibility, but we are unaware of any impacted third-party code. + +01992176e08169b7aedf2d61be9e22518b5c6640 +# +# Add an output_plugin_libraries GUC to bless trusted output plugins +# 2026-08-10 06:38:18 -0700 +# +# Addition of a new GUC enlarges ConfigureNamesString[], +# but that is not harmful. + +75a03c569c761fa27ba15975f342b72ab0d28946 +# +# Preserve the owner of extended statistics rebuilt by ALTER TABLE. +# 2026-08-10 06:38:18 -0700 +# +# CreateStatistics()'s signature changes and CreateStatsStmt gains a field, +# but no known third-party code calls the former or constructs the latter. + 586f4266fb4945f6ea3564b9c1bab093eb74bee4 # # Fix ABI break by moving PROCSIG_SLOTSYNC_MESSAGE in ProcSignalReason diff -Nru postgresql-17-17.10/.cirrus.tasks.yml postgresql-17-17.11/.cirrus.tasks.yml --- postgresql-17-17.10/.cirrus.tasks.yml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/.cirrus.tasks.yml 2026-08-10 20:54:09.000000000 +0000 @@ -273,7 +273,7 @@ # 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 -Nru postgresql-17-17.10/configure postgresql-17-17.11/configure --- postgresql-17-17.10/configure 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/configure 2026-08-10 20:54:09.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for PostgreSQL 17.10. +# Generated by GNU Autoconf 2.69 for PostgreSQL 17.11. # # Report bugs to . # @@ -582,8 +582,8 @@ # Identity of this package. PACKAGE_NAME='PostgreSQL' PACKAGE_TARNAME='postgresql' -PACKAGE_VERSION='17.10' -PACKAGE_STRING='PostgreSQL 17.10' +PACKAGE_VERSION='17.11' +PACKAGE_STRING='PostgreSQL 17.11' PACKAGE_BUGREPORT='pgsql-bugs@lists.postgresql.org' PACKAGE_URL='https://www.postgresql.org/' @@ -1450,7 +1450,7 @@ # 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 17.10 to adapt to many kinds of systems. +\`configure' configures PostgreSQL 17.11 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1515,7 +1515,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of PostgreSQL 17.10:";; + short | recursive ) echo "Configuration of PostgreSQL 17.11:";; esac cat <<\_ACEOF @@ -1690,7 +1690,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -PostgreSQL configure 17.10 +PostgreSQL configure 17.11 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2443,7 +2443,7 @@ 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 17.10, which was +It was created by PostgreSQL $as_me 17.11, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -19979,7 +19979,7 @@ # 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 17.10, which was +This file was extended by PostgreSQL $as_me 17.11, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20050,7 +20050,7 @@ 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 17.10 +PostgreSQL config.status 17.11 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -Nru postgresql-17-17.10/configure.ac postgresql-17-17.11/configure.ac --- postgresql-17-17.10/configure.ac 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/configure.ac 2026-08-10 20:54:09.000000000 +0000 @@ -17,7 +17,7 @@ dnl m4_pattern_forbid(^PGAC_)dnl to catch undefined macros -AC_INIT([PostgreSQL], [17.10], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/]) +AC_INIT([PostgreSQL], [17.11], [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 -Nru postgresql-17-17.10/contrib/amcheck/expected/check_btree.out postgresql-17-17.11/contrib/amcheck/expected/check_btree.out --- postgresql-17-17.10/contrib/amcheck/expected/check_btree.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/amcheck/expected/check_btree.out 2026-08-10 20:54:09.000000000 +0000 @@ -178,7 +178,8 @@ (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 @@ -- 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 -Nru postgresql-17-17.10/contrib/amcheck/sql/check_btree.sql postgresql-17-17.11/contrib/amcheck/sql/check_btree.sql --- postgresql-17-17.10/contrib/amcheck/sql/check_btree.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/amcheck/sql/check_btree.sql 2026-08-10 20:54:09.000000000 +0000 @@ -116,7 +116,8 @@ 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 @@ -- 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 @@ 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 -Nru postgresql-17-17.10/contrib/amcheck/verify_nbtree.c postgresql-17-17.11/contrib/amcheck/verify_nbtree.c --- postgresql-17-17.10/contrib/amcheck/verify_nbtree.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/amcheck/verify_nbtree.c 2026-08-10 20:54:09.000000000 +0000 @@ -2988,7 +2988,7 @@ 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 -Nru postgresql-17-17.10/contrib/btree_gist/btree_float4.c postgresql-17-17.11/contrib/btree_gist/btree_float4.c --- postgresql-17-17.10/contrib/btree_gist/btree_float4.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/btree_float4.c 2026-08-10 20:54:09.000000000 +0000 @@ -25,30 +25,36 @@ PG_FUNCTION_INFO_V1(gbt_float4_penalty); PG_FUNCTION_INFO_V1(gbt_float4_same); +/* + * 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 @@ { 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 @@ 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)); } @@ -187,7 +212,7 @@ 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 -Nru postgresql-17-17.10/contrib/btree_gist/btree_float8.c postgresql-17-17.11/contrib/btree_gist/btree_float8.c --- postgresql-17-17.10/contrib/btree_gist/btree_float8.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/btree_float8.c 2026-08-10 20:54:09.000000000 +0000 @@ -26,30 +26,36 @@ PG_FUNCTION_INFO_V1(gbt_float8_same); +/* + * 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 @@ { 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 @@ 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 @@ 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)); } @@ -194,7 +213,7 @@ 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 -Nru postgresql-17-17.10/contrib/btree_gist/btree_utils_num.c postgresql-17-17.11/contrib/btree_gist/btree_utils_num.c --- postgresql-17-17.10/contrib/btree_gist/btree_utils_num.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/btree_utils_num.c 2026-08-10 20:54:09.000000000 +0000 @@ -297,8 +297,19 @@ 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 -Nru postgresql-17-17.10/contrib/btree_gist/btree_utils_num.h postgresql-17-17.11/contrib/btree_gist/btree_utils_num.h --- postgresql-17-17.10/contrib/btree_gist/btree_utils_num.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/btree_utils_num.h 2026-08-10 20:54:09.000000000 +0000 @@ -9,6 +9,7 @@ #include "access/gist.h" #include "btree_gist.h" +#include "utils/float.h" #include "utils/rel.h" typedef char GBT_NUMKEY; @@ -59,21 +60,124 @@ /* - * 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) @@ -87,6 +191,7 @@ (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 -Nru postgresql-17-17.10/contrib/btree_gist/btree_utils_var.c postgresql-17-17.11/contrib/btree_gist/btree_utils_var.c --- postgresql-17-17.10/contrib/btree_gist/btree_utils_var.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/btree_utils_var.c 2026-08-10 20:54:09.000000000 +0000 @@ -572,6 +572,13 @@ { 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: @@ -612,8 +619,20 @@ || 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 -Nru postgresql-17-17.10/contrib/btree_gist/data/float4.data postgresql-17-17.11/contrib/btree_gist/data/float4.data --- postgresql-17-17.10/contrib/btree_gist/data/float4.data 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/data/float4.data 2026-08-10 20:54:09.000000000 +0000 @@ -298,6 +298,9 @@ \N 2972.381398 220.199877 +Infinity +-Infinity +NaN 3542.561032 -2168.024176 -3305.714558 diff -Nru postgresql-17-17.10/contrib/btree_gist/data/float8.data postgresql-17-17.11/contrib/btree_gist/data/float8.data --- postgresql-17-17.10/contrib/btree_gist/data/float8.data 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/data/float8.data 2026-08-10 20:54:09.000000000 +0000 @@ -298,6 +298,9 @@ 27770.539968 13275.355549 -4267.695804 +Infinity +-Infinity +NaN \N \N 38915.525185 diff -Nru postgresql-17-17.10/contrib/btree_gist/expected/float4.out postgresql-17-17.11/contrib/btree_gist/expected/float4.out --- postgresql-17-17.10/contrib/btree_gist/expected/float4.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/expected/float4.out 2026-08-10 20:54:09.000000000 +0000 @@ -5,13 +5,13 @@ 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; 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 @@ 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; 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 @@ -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 -Nru postgresql-17-17.10/contrib/btree_gist/expected/float8.out postgresql-17-17.11/contrib/btree_gist/expected/float8.out --- postgresql-17-17.10/contrib/btree_gist/expected/float8.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/expected/float8.out 2026-08-10 20:54:09.000000000 +0000 @@ -5,13 +5,13 @@ 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; 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 @@ 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; 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 @@ -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 -Nru postgresql-17-17.10/contrib/btree_gist/expected/numeric.out postgresql-17-17.11/contrib/btree_gist/expected/numeric.out --- postgresql-17-17.10/contrib/btree_gist/expected/numeric.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/expected/numeric.out 2026-08-10 20:54:09.000000000 +0000 @@ -7,13 +7,13 @@ 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; 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 < 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 ; 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 @@ 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; 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 < 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 ; count ------- - 579 + 581 (1 row) SELECT count(*) FROM numerictmp WHERE a > 0 ; count ------- - 576 + 578 (1 row) -- Test index-only scans diff -Nru postgresql-17-17.10/contrib/btree_gist/sql/float4.sql postgresql-17-17.11/contrib/btree_gist/sql/float4.sql --- postgresql-17-17.10/contrib/btree_gist/sql/float4.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/sql/float4.sql 2026-08-10 20:54:09.000000000 +0000 @@ -35,3 +35,20 @@ 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 -Nru postgresql-17-17.10/contrib/btree_gist/sql/float8.sql postgresql-17-17.11/contrib/btree_gist/sql/float8.sql --- postgresql-17-17.10/contrib/btree_gist/sql/float8.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/btree_gist/sql/float8.sql 2026-08-10 20:54:09.000000000 +0000 @@ -35,3 +35,20 @@ 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 -Nru postgresql-17-17.10/contrib/fuzzystrmatch/expected/fuzzystrmatch.out postgresql-17-17.11/contrib/fuzzystrmatch/expected/fuzzystrmatch.out --- postgresql-17-17.10/contrib/fuzzystrmatch/expected/fuzzystrmatch.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/fuzzystrmatch/expected/fuzzystrmatch.out 2026-08-10 20:54:09.000000000 +0000 @@ -41,6 +41,14 @@ 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 @@ 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 -Nru postgresql-17-17.10/contrib/fuzzystrmatch/sql/fuzzystrmatch.sql postgresql-17-17.11/contrib/fuzzystrmatch/sql/fuzzystrmatch.sql --- postgresql-17-17.10/contrib/fuzzystrmatch/sql/fuzzystrmatch.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/fuzzystrmatch/sql/fuzzystrmatch.sql 2026-08-10 20:54:09.000000000 +0000 @@ -11,8 +11,11 @@ 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 -Nru postgresql-17-17.10/contrib/hstore_plperl/hstore_plperl.c postgresql-17-17.11/contrib/hstore_plperl/hstore_plperl.c --- postgresql-17-17.10/contrib/hstore_plperl/hstore_plperl.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/hstore_plperl/hstore_plperl.c 2026-08-10 20:54:09.000000000 +0000 @@ -2,6 +2,7 @@ #include "fmgr.h" #include "hstore/hstore.h" +#include "miscadmin.h" #include "plperl.h" PG_MODULE_MAGIC; @@ -107,7 +108,15 @@ /* 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) @@ -116,8 +125,9 @@ 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; @@ -126,6 +136,12 @@ 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; @@ -146,7 +162,7 @@ i++; } - pcount = hstoreUniquePairs(pairs, pcount, &buflen); + pcount = hstoreUniquePairs(pairs, i, &buflen); out = hstorePairs(pairs, pcount, buflen); PG_RETURN_POINTER(out); } diff -Nru postgresql-17-17.10/contrib/hstore_plpython/expected/hstore_plpython.out postgresql-17-17.11/contrib/hstore_plpython/expected/hstore_plpython.out --- postgresql-17-17.10/contrib/hstore_plpython/expected/hstore_plpython.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/hstore_plpython/expected/hstore_plpython.out 2026-08-10 20:54:09.000000000 +0000 @@ -43,6 +43,71 @@ 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 -Nru postgresql-17-17.10/contrib/hstore_plpython/hstore_plpython.c postgresql-17-17.11/contrib/hstore_plpython/hstore_plpython.c --- postgresql-17-17.10/contrib/hstore_plpython/hstore_plpython.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/hstore_plpython/hstore_plpython.c 2026-08-10 20:54:09.000000000 +0000 @@ -139,7 +139,16 @@ 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(); { @@ -156,6 +165,13 @@ 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 -Nru postgresql-17-17.10/contrib/hstore_plpython/sql/hstore_plpython.sql postgresql-17-17.11/contrib/hstore_plpython/sql/hstore_plpython.sql --- postgresql-17-17.10/contrib/hstore_plpython/sql/hstore_plpython.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/hstore_plpython/sql/hstore_plpython.sql 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/contrib/intarray/_int_selfuncs.c postgresql-17-17.11/contrib/intarray/_int_selfuncs.c --- postgresql-17-17.10/contrib/intarray/_int_selfuncs.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/intarray/_int_selfuncs.c 2026-08-10 20:54:09.000000000 +0000 @@ -152,7 +152,10 @@ * 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 -Nru postgresql-17-17.10/contrib/intarray/expected/_int.out postgresql-17-17.11/contrib/intarray/expected/_int.out --- postgresql-17-17.10/contrib/intarray/expected/_int.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/intarray/expected/_int.out 2026-08-10 20:54:09.000000000 +0000 @@ -398,6 +398,21 @@ 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 -Nru postgresql-17-17.10/contrib/intarray/sql/_int.sql postgresql-17-17.11/contrib/intarray/sql/_int.sql --- postgresql-17-17.10/contrib/intarray/sql/_int.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/intarray/sql/_int.sql 2026-08-10 20:54:09.000000000 +0000 @@ -75,6 +75,19 @@ 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 -Nru postgresql-17-17.10/contrib/jsonb_plperl/jsonb_plperl.c postgresql-17-17.11/contrib/jsonb_plperl/jsonb_plperl.c --- postgresql-17-17.10/contrib/jsonb_plperl/jsonb_plperl.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/jsonb_plperl/jsonb_plperl.c 2026-08-10 20:54:09.000000000 +0000 @@ -3,6 +3,7 @@ #include #include "fmgr.h" +#include "miscadmin.h" #include "plperl.h" #include "utils/fmgrprotos.h" #include "utils/jsonb.h" @@ -63,6 +64,9 @@ JsonbIterator *it; JsonbIteratorToken r; + /* this can recurse via JsonbValue_to_SV() */ + check_stack_depth(); + it = JsonbIteratorInit(jsonb); r = JsonbIteratorNext(&it, &v, true); @@ -176,9 +180,20 @@ 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 -Nru postgresql-17-17.10/contrib/jsonb_plpython/expected/jsonb_plpython.out postgresql-17-17.11/contrib/jsonb_plpython/expected/jsonb_plpython.out --- postgresql-17-17.10/contrib/jsonb_plpython/expected/jsonb_plpython.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/jsonb_plpython/expected/jsonb_plpython.out 2026-08-10 20:54:09.000000000 +0000 @@ -304,3 +304,92 @@ {"": 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 -Nru postgresql-17-17.10/contrib/jsonb_plpython/jsonb_plpython.c postgresql-17-17.11/contrib/jsonb_plpython/jsonb_plpython.c --- postgresql-17-17.10/contrib/jsonb_plpython/jsonb_plpython.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/jsonb_plpython/jsonb_plpython.c 2026-08-10 20:54:09.000000000 +0000 @@ -1,5 +1,6 @@ #include "postgres.h" +#include "miscadmin.h" #include "plpy_elog.h" #include "plpy_typeio.h" #include "plpython.h" @@ -138,6 +139,9 @@ JsonbIterator *it; PyObject *result; + /* this can recurse via PLyObject_FromJsonbValue() */ + check_stack_depth(); + it = JsonbIteratorInit(jsonb); r = JsonbIteratorNext(&it, &v, true); @@ -266,7 +270,12 @@ 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(); { @@ -278,8 +287,15 @@ { 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) @@ -331,7 +347,10 @@ 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); @@ -408,6 +427,9 @@ { JsonbValue *out; + /* this can recurse via PLyMapping_ToJsonbValue() */ + check_stack_depth(); + if (!PyUnicode_Check(obj)) { if (PySequence_Check(obj)) diff -Nru postgresql-17-17.10/contrib/jsonb_plpython/sql/jsonb_plpython.sql postgresql-17-17.11/contrib/jsonb_plpython/sql/jsonb_plpython.sql --- postgresql-17-17.10/contrib/jsonb_plpython/sql/jsonb_plpython.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/jsonb_plpython/sql/jsonb_plpython.sql 2026-08-10 20:54:09.000000000 +0000 @@ -181,3 +181,80 @@ $$; 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 -Nru postgresql-17-17.10/contrib/ltree/expected/ltree.out postgresql-17-17.11/contrib/ltree/expected/ltree.out --- postgresql-17-17.10/contrib/ltree/expected/ltree.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/ltree/expected/ltree.out 2026-08-10 20:54:09.000000000 +0000 @@ -1281,6 +1281,21 @@ 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 @@ !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 -Nru postgresql-17-17.10/contrib/ltree/ltree.h postgresql-17-17.11/contrib/ltree/ltree.h --- postgresql-17-17.10/contrib/ltree/ltree.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/ltree/ltree.h 2026-08-10 20:54:09.000000000 +0000 @@ -206,6 +206,7 @@ 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 -Nru postgresql-17-17.10/contrib/ltree/ltree_gist.c postgresql-17-17.11/contrib/ltree/ltree_gist.c --- postgresql-17-17.10/contrib/ltree/ltree_gist.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/ltree/ltree_gist.c 2026-08-10 20:54:09.000000000 +0000 @@ -264,11 +264,11 @@ 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 -Nru postgresql-17-17.10/contrib/ltree/ltree_op.c postgresql-17-17.11/contrib/ltree/ltree_op.c --- postgresql-17-17.10/contrib/ltree/ltree_op.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/ltree/ltree_op.c 2026-08-10 20:54:09.000000000 +0000 @@ -41,6 +41,9 @@ PG_FUNCTION_INFO_V1(text2ltree); PG_FUNCTION_INFO_V1(ltreeparentsel); +/* + * btree-comparison function. + */ int ltree_compare(const ltree *a, const ltree *b) { @@ -53,18 +56,52 @@ { 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 (al->len - bl->len) * 10 * (an + 1); + 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 (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--; @@ -73,7 +110,7 @@ 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 -Nru postgresql-17-17.10/contrib/ltree/sql/ltree.sql postgresql-17-17.11/contrib/ltree/sql/ltree.sql --- postgresql-17-17.10/contrib/ltree/sql/ltree.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/ltree/sql/ltree.sql 2026-08-10 20:54:09.000000000 +0000 @@ -252,6 +252,19 @@ 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 @@ ('!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 -Nru postgresql-17-17.10/contrib/pg_surgery/expected/heap_surgery.out postgresql-17-17.11/contrib/pg_surgery/expected/heap_surgery.out --- postgresql-17-17.10/contrib/pg_surgery/expected/heap_surgery.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pg_surgery/expected/heap_surgery.out 2026-08-10 20:54:09.000000000 +0000 @@ -134,6 +134,23 @@ (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 -Nru postgresql-17-17.10/contrib/pg_surgery/heap_surgery.c postgresql-17-17.11/contrib/pg_surgery/heap_surgery.c --- postgresql-17-17.10/contrib/pg_surgery/heap_surgery.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pg_surgery/heap_surgery.c 2026-08-10 20:54:09.000000000 +0000 @@ -17,6 +17,7 @@ #include "access/xloginsert.h" #include "catalog/pg_am_d.h" #include "catalog/pg_proc_d.h" +#include "catalog/pg_control.h" #include "miscadmin.h" #include "storage/bufmgr.h" #include "utils/acl.h" @@ -40,7 +41,7 @@ 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() @@ -87,7 +88,7 @@ int ntids, nblocks; Relation rel; - OffsetNumber curr_start_ptr, + int curr_start_ptr, next_start_ptr; bool include_this_tid[MaxHeapTuplesPerPage]; @@ -143,6 +144,7 @@ { Buffer buf; Buffer vmbuf = InvalidBuffer; + bool unlock_vmbuf = false; Page page; BlockNumber blkno; OffsetNumber curoff; @@ -225,16 +227,20 @@ } /* 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(); @@ -244,7 +250,7 @@ { ItemId itemid; - if (!include_this_tid[curoff]) + if (!include_this_tid[curoff - 1]) continue; itemid = PageGetItemId(page, curoff); @@ -263,10 +269,11 @@ */ 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 @@ -317,18 +324,29 @@ /* XLOG stuff */ if (RelationNeedsWAL(rel)) - log_newpage_buffer(buf, true); - } + { + XLogRecPtr recptr; - /* WAL log the VM page if it was modified. */ - if (did_modify_vm && RelationNeedsWAL(rel)) - log_newpage_buffer(vmbuf, false); + 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); + } + } 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. */ @@ -392,7 +410,7 @@ * ------------------------------------------------------------------------ */ 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 -Nru postgresql-17-17.10/contrib/pg_surgery/sql/heap_surgery.sql postgresql-17-17.11/contrib/pg_surgery/sql/heap_surgery.sql --- postgresql-17-17.10/contrib/pg_surgery/sql/heap_surgery.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pg_surgery/sql/heap_surgery.sql 2026-08-10 20:54:09.000000000 +0000 @@ -65,6 +65,14 @@ -- 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 -Nru postgresql-17-17.10/contrib/pg_trgm/trgm_gist.c postgresql-17-17.11/contrib/pg_trgm/trgm_gist.c --- postgresql-17-17.10/contrib/pg_trgm/trgm_gist.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pg_trgm/trgm_gist.c 2026-08-10 20:54:09.000000000 +0000 @@ -900,7 +900,7 @@ 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 @@ else size_beta = SIGLENBIT(siglen) - sizebitvec((cache[j].allistrue) ? GETSIGN(datum_r) : - GETSIGN(cache[j].sign), + cache[j].sign, siglen); } else diff -Nru postgresql-17-17.10/contrib/pgcrypto/expected/pgp-decrypt.out postgresql-17-17.11/contrib/pgcrypto/expected/pgp-decrypt.out --- postgresql-17-17.10/contrib/pgcrypto/expected/pgp-decrypt.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/expected/pgp-decrypt.out 2026-08-10 20:54:09.000000000 +0000 @@ -439,3 +439,29 @@ '), '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 -Nru postgresql-17-17.10/contrib/pgcrypto/expected/pgp-decrypt_1.out postgresql-17-17.11/contrib/pgcrypto/expected/pgp-decrypt_1.out --- postgresql-17-17.10/contrib/pgcrypto/expected/pgp-decrypt_1.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/expected/pgp-decrypt_1.out 2026-08-10 20:54:09.000000000 +0000 @@ -11,7 +11,7 @@ =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 @@ '), '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 -Nru postgresql-17-17.10/contrib/pgcrypto/expected/pgp-encrypt_1.out postgresql-17-17.11/contrib/pgcrypto/expected/pgp-encrypt_1.out --- postgresql-17-17.10/contrib/pgcrypto/expected/pgp-encrypt_1.out 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/expected/pgp-encrypt_1.out 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/contrib/pgcrypto/expected/pgp-info.out postgresql-17-17.11/contrib/pgcrypto/expected/pgp-info.out --- postgresql-17-17.10/contrib/pgcrypto/expected/pgp-info.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/expected/pgp-info.out 2026-08-10 20:54:09.000000000 +0000 @@ -75,5 +75,6 @@ B68504FD128E1FF9 FD0206C409B74875 FD0206C409B74875 -(5 rows) + D936CF64BB73F466 +(6 rows) diff -Nru postgresql-17-17.10/contrib/pgcrypto/expected/pgp-pubkey-decrypt.out postgresql-17-17.11/contrib/pgcrypto/expected/pgp-pubkey-decrypt.out --- postgresql-17-17.10/contrib/pgcrypto/expected/pgp-pubkey-decrypt.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/expected/pgp-pubkey-decrypt.out 2026-08-10 20:54:09.000000000 +0000 @@ -585,6 +585,20 @@ =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 @@ 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 @@ 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 -Nru postgresql-17-17.10/contrib/pgcrypto/expected/pgp-pubkey-decrypt_1.out postgresql-17-17.11/contrib/pgcrypto/expected/pgp-pubkey-decrypt_1.out --- postgresql-17-17.10/contrib/pgcrypto/expected/pgp-pubkey-decrypt_1.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/expected/pgp-pubkey-decrypt_1.out 2026-08-10 20:54:09.000000000 +0000 @@ -585,6 +585,20 @@ =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 @@ 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 @@ 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 -Nru postgresql-17-17.10/contrib/pgcrypto/openssl.c postgresql-17-17.11/contrib/pgcrypto/openssl.c --- postgresql-17-17.10/contrib/pgcrypto/openssl.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/openssl.c 2026-08-10 20:54:09.000000000 +0000 @@ -800,5 +800,8 @@ static void ResOwnerReleaseOSSLCipher(Datum res) { - free_openssl_cipher((OSSLCipher *) DatumGetPointer(res)); + OSSLCipher *cipher = (OSSLCipher *) DatumGetPointer(res); + + cipher->owner = NULL; + free_openssl_cipher(cipher); } diff -Nru postgresql-17-17.10/contrib/pgcrypto/pgp-cfb.c postgresql-17-17.11/contrib/pgcrypto/pgp-cfb.c --- postgresql-17-17.10/contrib/pgcrypto/pgp-cfb.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/pgp-cfb.c 2026-08-10 20:54:09.000000000 +0000 @@ -43,6 +43,7 @@ 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 @@ 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 @@ 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 @@ */ 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 @@ 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 @@ { 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 @@ { 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 -Nru postgresql-17-17.10/contrib/pgcrypto/pgp-decrypt.c postgresql-17-17.11/contrib/pgcrypto/pgp-decrypt.c --- postgresql-17-17.10/contrib/pgcrypto/pgp-decrypt.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/pgp-decrypt.c 2026-08-10 20:54:09.000000000 +0000 @@ -595,7 +595,8 @@ 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 @@ 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 @@ } 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 -Nru postgresql-17-17.10/contrib/pgcrypto/pgp-encrypt.c postgresql-17-17.11/contrib/pgcrypto/pgp-encrypt.c --- postgresql-17-17.10/contrib/pgcrypto/pgp-encrypt.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/pgp-encrypt.c 2026-08-10 20:54:09.000000000 +0000 @@ -174,7 +174,8 @@ 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 @@ 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 -Nru postgresql-17-17.10/contrib/pgcrypto/pgp-pgsql.c postgresql-17-17.11/contrib/pgcrypto/pgp-pgsql.c --- postgresql-17-17.10/contrib/pgcrypto/pgp-pgsql.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/pgp-pgsql.c 2026-08-10 20:54:09.000000000 +0000 @@ -192,6 +192,8 @@ 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 -Nru postgresql-17-17.10/contrib/pgcrypto/pgp-pubkey.c postgresql-17-17.11/contrib/pgcrypto/pgp-pubkey.c --- postgresql-17-17.10/contrib/pgcrypto/pgp-pubkey.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/pgp-pubkey.c 2026-08-10 20:54:09.000000000 +0000 @@ -382,8 +382,15 @@ /* * 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 -Nru postgresql-17-17.10/contrib/pgcrypto/pgp.c postgresql-17-17.11/contrib/pgcrypto/pgp.c --- postgresql-17-17.10/contrib/pgcrypto/pgp.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/pgp.c 2026-08-10 20:54:09.000000000 +0000 @@ -49,6 +49,7 @@ 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 @@ 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 @@ 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 -Nru postgresql-17-17.10/contrib/pgcrypto/pgp.h postgresql-17-17.11/contrib/pgcrypto/pgp.h --- postgresql-17-17.10/contrib/pgcrypto/pgp.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/pgp.h 2026-08-10 20:54:09.000000000 +0000 @@ -150,6 +150,9 @@ 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_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 @@ 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 -Nru postgresql-17-17.10/contrib/pgcrypto/sql/pgp-decrypt.sql postgresql-17-17.11/contrib/pgcrypto/sql/pgp-decrypt.sql --- postgresql-17-17.10/contrib/pgcrypto/sql/pgp-decrypt.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/sql/pgp-decrypt.sql 2026-08-10 20:54:09.000000000 +0000 @@ -328,3 +328,29 @@ =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 -Nru postgresql-17-17.10/contrib/pgcrypto/sql/pgp-pubkey-decrypt.sql postgresql-17-17.11/contrib/pgcrypto/sql/pgp-pubkey-decrypt.sql --- postgresql-17-17.10/contrib/pgcrypto/sql/pgp-pubkey-decrypt.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/pgcrypto/sql/pgp-pubkey-decrypt.sql 2026-08-10 20:54:09.000000000 +0000 @@ -601,6 +601,21 @@ -----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 @@ 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 @@ -- 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 -Nru postgresql-17-17.10/contrib/postgres_fdw/expected/postgres_fdw.out postgresql-17-17.11/contrib/postgres_fdw/expected/postgres_fdw.out --- postgresql-17-17.10/contrib/postgres_fdw/expected/postgres_fdw.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/postgres_fdw/expected/postgres_fdw.out 2026-08-10 20:54:09.000000000 +0000 @@ -11392,6 +11392,72 @@ (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 @@ -12172,8 +12238,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) diff -Nru postgresql-17-17.10/contrib/postgres_fdw/postgres_fdw.c postgresql-17-17.11/contrib/postgres_fdw/postgres_fdw.c --- postgresql-17-17.10/contrib/postgres_fdw/postgres_fdw.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/postgres_fdw/postgres_fdw.c 2026-08-10 20:54:09.000000000 +0000 @@ -1650,16 +1650,11 @@ 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 the node is async-capable, any asynchronous fetch made for it should + * have been processed before we get here (see ExecAppendAsyncReset()). */ - if (fsstate->async_capable && - fsstate->conn_state->pendingAreq && - fsstate->conn_state->pendingAreq->requestee == (PlanState *) node) - fetch_more_data(node); + 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 -Nru postgresql-17-17.10/contrib/postgres_fdw/sql/postgres_fdw.sql postgresql-17-17.11/contrib/postgres_fdw/sql/postgres_fdw.sql --- postgresql-17-17.10/contrib/postgres_fdw/sql/postgres_fdw.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/postgres_fdw/sql/postgres_fdw.sql 2026-08-10 20:54:09.000000000 +0000 @@ -3911,6 +3911,16 @@ 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; @@ -4147,8 +4157,8 @@ 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) diff -Nru postgresql-17-17.10/contrib/seg/expected/seg.out postgresql-17-17.11/contrib/seg/expected/seg.out --- postgresql-17-17.10/contrib/seg/expected/seg.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/seg/expected/seg.out 2026-08-10 20:54:09.000000000 +0000 @@ -263,7 +263,8 @@ 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 @@ >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 -Nru postgresql-17-17.10/contrib/seg/seg.c postgresql-17-17.11/contrib/seg/seg.c --- postgresql-17-17.10/contrib/seg/seg.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/seg/seg.c 2026-08-10 20:54:09.000000000 +0000 @@ -148,7 +148,7 @@ { /* 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 -Nru postgresql-17-17.10/contrib/seg/sql/seg.sql postgresql-17-17.11/contrib/seg/sql/seg.sql --- postgresql-17-17.10/contrib/seg/sql/seg.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/seg/sql/seg.sql 2026-08-10 20:54:09.000000000 +0000 @@ -63,7 +63,8 @@ -- 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 '~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 -Nru postgresql-17-17.10/contrib/spi/refint.c postgresql-17-17.11/contrib/spi/refint.c --- postgresql-17-17.10/contrib/spi/refint.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/spi/refint.c 2026-08-10 20:54:09.000000000 +0000 @@ -12,25 +12,10 @@ #include "commands/trigger.h" #include "executor/spi.h" #include "utils/builtins.h" -#include "utils/memutils.h" #include "utils/rel.h" PG_MODULE_MAGIC; -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. @@ -56,12 +41,12 @@ 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"); @@ -118,16 +103,8 @@ */ 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++) @@ -156,57 +133,36 @@ 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) @@ -258,15 +214,15 @@ 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"); @@ -343,24 +299,8 @@ */ kvals = (Datum *) palloc(nkeys * sizeof(Datum)); - /* - * Construct ident string as TriggerName $ TriggeredRelationId and try to - * find prepared execution plan(s). - */ - snprintf(ident, sizeof(ident), "%s$%u", trigger->tgname, rel->rd_id); - 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++) @@ -408,140 +348,124 @@ 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++) - { - StringInfoData sql; + relname = args2[0]; - initStringInfo(&sql); + /*--------- + * 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); - relname = args2[0]; + /*--------- + * For 'C'ascade action we construct DELETE query + * + * DELETE + * FROM _referencing_relation_ + * WHERE Fkey1 = $1 [AND Fkey2 = $2 [...]] + * + * to delete all referencing tuples. + *--------- + */ - /*--------- - * 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 - */ + /* + * Max : Cascade with UPDATE query i create update query that updates + * new key values in referenced tables + */ - else if (action == 'c') + 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); } /* @@ -566,9 +490,7 @@ relname = args[0]; - snprintf(ident, sizeof(ident), "%s$%u", trigger->tgname, rel->rd_id); - plan = find_plan(ident, &FPlans, &nFPlans); - 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) @@ -601,46 +523,3 @@ 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 -Nru postgresql-17-17.10/contrib/sslinfo/sslinfo.c postgresql-17-17.11/contrib/sslinfo/sslinfo.c --- postgresql-17-17.10/contrib/sslinfo/sslinfo.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/sslinfo/sslinfo.c 2026-08-10 20:54:09.000000000 +0000 @@ -32,8 +32,8 @@ PG_MODULE_MAGIC; -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. @@ -156,7 +156,7 @@ * function. */ static Datum -ASN1_STRING_to_text(ASN1_STRING *str) +ASN1_STRING_to_text(const ASN1_STRING *str) { BIO *membuf; size_t size; @@ -171,7 +171,7 @@ (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("could not create OpenSSL BIO structure"))); (void) BIO_set_close(membuf, BIO_CLOSE); - ASN1_STRING_print_ex(membuf, str, + ASN1_STRING_print_ex(membuf, unconstify(ASN1_STRING *, str), ((ASN1_STRFLGS_RFC2253 & ~ASN1_STRFLGS_ESC_MSB) | ASN1_STRFLGS_UTF8_CONVERT)); /* ensure null termination of the BIO's content */ @@ -202,12 +202,12 @@ * 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); @@ -217,10 +217,10 @@ 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)); + data = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(unconstify(X509_NAME *, name), index)); return ASN1_STRING_to_text(data); } @@ -429,8 +429,8 @@ HeapTuple tuple; Datum result; BIO *membuf; - X509_EXTENSION *ext; - ASN1_OBJECT *obj; + const X509_EXTENSION *ext; + const ASN1_OBJECT *obj; int nid; int len; @@ -443,7 +443,7 @@ /* 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); @@ -456,7 +456,7 @@ 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", @@ -466,7 +466,7 @@ nulls[1] = false; /* Get critical status */ - values[2] = BoolGetDatum(X509_EXTENSION_get_critical(ext)); + values[2] = BoolGetDatum(X509_EXTENSION_get_critical(unconstify(X509_EXTENSION *, ext))); nulls[2] = false; /* Build tuple */ diff -Nru postgresql-17-17.10/contrib/test_decoding/expected/permissions.out postgresql-17-17.11/contrib/test_decoding/expected/permissions.out --- postgresql-17-17.10/contrib/test_decoding/expected/permissions.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/test_decoding/expected/permissions.out 2026-08-10 20:54:09.000000000 +0000 @@ -29,6 +29,17 @@ (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 -Nru postgresql-17-17.10/contrib/test_decoding/expected/slot.out postgresql-17-17.11/contrib/test_decoding/expected/slot.out --- postgresql-17-17.10/contrib/test_decoding/expected/slot.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/test_decoding/expected/slot.out 2026-08-10 20:54:09.000000000 +0000 @@ -30,8 +30,11 @@ 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 -Nru postgresql-17-17.10/contrib/test_decoding/expected/twophase.out postgresql-17-17.11/contrib/test_decoding/expected/twophase.out --- postgresql-17-17.10/contrib/test_decoding/expected/twophase.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/test_decoding/expected/twophase.out 2026-08-10 20:54:09.000000000 +0000 @@ -227,6 +227,31 @@ 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 -Nru postgresql-17-17.10/contrib/test_decoding/sql/permissions.sql postgresql-17-17.11/contrib/test_decoding/sql/permissions.sql --- postgresql-17-17.10/contrib/test_decoding/sql/permissions.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/test_decoding/sql/permissions.sql 2026-08-10 20:54:09.000000000 +0000 @@ -15,6 +15,14 @@ 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 -Nru postgresql-17-17.10/contrib/test_decoding/sql/slot.sql postgresql-17-17.11/contrib/test_decoding/sql/slot.sql --- postgresql-17-17.10/contrib/test_decoding/sql/slot.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/test_decoding/sql/slot.sql 2026-08-10 20:54:09.000000000 +0000 @@ -9,7 +9,10 @@ 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 -Nru postgresql-17-17.10/contrib/test_decoding/sql/twophase.sql postgresql-17-17.11/contrib/test_decoding/sql/twophase.sql --- postgresql-17-17.10/contrib/test_decoding/sql/twophase.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/test_decoding/sql/twophase.sql 2026-08-10 20:54:09.000000000 +0000 @@ -125,6 +125,18 @@ -- 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 -Nru postgresql-17-17.10/contrib/xml2/expected/xml2.out postgresql-17-17.11/contrib/xml2/expected/xml2.out --- postgresql-17-17.10/contrib/xml2/expected/xml2.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/contrib/xml2/expected/xml2.out 2026-08-10 20:54:09.000000000 +0000 @@ -207,6 +207,14 @@ (1 row) +-- xpath_nodeset() with namespace node +SELECT xpath_nodeset('', + '//namespace::foo'); + xpath_nodeset +---------------------- + http://icl.com/saxon +(1 row) + -- possible security exploit SELECT xslt_process('Hello from XML', $$ $$::text, 'n1="v1",n2="v2",n3="v3",n4="v4",n5="v5",n6="v6",n7="v7",n8="v8",n9="v9",n10="v10",n11="v11",n12="v12"'::text); ERROR: xslt_process() is not available without libxslt +-- xpath_nodeset() with namespace node +SELECT xpath_nodeset('', + '//namespace::foo'); + xpath_nodeset +---------------------- + http://icl.com/saxon +(1 row) + -- possible security exploit SELECT xslt_process('Hello from XML', $$ $$::text, 'n1="v1",n2="v2",n3="v3",n4="v4",n5="v5",n6="v6",n7="v7",n8="v8",n9="v9",n10="v10",n11="v11",n12="v12"'::text); +-- xpath_nodeset() with namespace node +SELECT xpath_nodeset('', + '//namespace::foo'); + -- possible security exploit SELECT xslt_process('Hello from XML', $$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 -Nru postgresql-17-17.10/debian/changelog postgresql-17-17.11/debian/changelog --- postgresql-17-17.10/debian/changelog 2026-05-11 20:57:44.000000000 +0000 +++ postgresql-17-17.11/debian/changelog 2026-08-11 21:32:38.000000000 +0000 @@ -1,3 +1,364 @@ +postgresql-17 (17.11-0+deb13u1) trixie-security; urgency=medium + + * New upstream version 17.11. + + + Restrict logical decoding output plugins to the set specified by + a new server parameter `output_plugin_libraries` (Jacob + Champion) + + Previously, a replication user could select any loadable library + for logical decoding, allowing exploits of various sorts. To + allow locking this down without breaking setups that worked + before, introduce a whitelist of allowed output plugins. + + By default, only the output plugins shipped as part of + PostgreSQL (`pgoutput` and `test_decoding`) are included in + `output_plugin_libraries`. Installations that rely on other + output plugins must add them after updating the server, for + example + + output_plugin_libraries = 'pgoutput, test_decoding, my_trusted_decoder' + + Additionally, pg_upgrade --check will fail if the + `output_plugin_libraries` parameter on the new cluster does not + permit the plugins of logical replication slots on the old + cluster, when migrating from versions 17 and later. Make + necessary additions to the new cluster's setting before + performing pg_upgrade. + + The PostgreSQL Project thanks Vladimir Tokarev and Yu Kunpeng + for reporting this problem. (CVE-2026-6471) + + + Fix contrib/pgcrypto's PGP encryption to detect unsupported + ciphers (Daniel Gustafsson) + + Previously, if OpenSSL rejected the requested cipher (for + example, because it is running in FIPS mode, or the legacy + provider hasn't been loaded), pgcrypto failed to notice the + failure and simply XOR'd the non-encrypted block with the + plaintext, rendering the "encryption" trivially breakable. This + will typically occur with deprecated or non-FIPS cipher + algorithms (cipher-algo=blowfish/bf, twofish, cast5, or 3des). + + By default, pgcrypto will now fail to decrypt any messages that + were affected in this way. To allow retrieval of such data, a + new option `ignore-cipher-failure` has been added to + pgp_pub_decrypt() and pgp_sym_decrypt(). Setting + `ignore-cipher-failure=1` will restore their previous behavior, + allowing the faulty encryption wrapper to be stripped off: + + pgp_sym_decrypt(encrypted_column, any key, 'ignore-cipher-failure=1') + + Once the affected messages are identified and stripped of their + wrappers, they can then be re-encrypted with a modern algorithm. + It is important however that the behavior of OpenSSL be the same + as it was when the faulty messages were created: if the set of + unsupported algorithms is not the same, this approach will not + work. See the documentation for `ignore-cipher-failure`. + + The PostgreSQL Project thanks Shishir Sharma for reporting this + problem. (CVE-2026-14663) + + + Fix psql to skip in-line data following a scripted COPY ... FROM + STDIN command, even if the COPY fails before sending + `PGRES_COPY_IN` (Tom Lane) + + Previously, if a `COPY` command failed at startup (for instance, + because the target table doesn't exist) psql would not realize + that and would proceed to read the following in-line data as SQL + commands. In the best case that's wrong and in the worst case + it's a SQL-injection hazard. Teach psql to recognize + syntactically-valid COPY ... FROM STDIN commands and to skip + data on its own authority if the server doesn't respond with + `PGRES_COPY_IN`. + + While this fix is unlikely to affect any production SQL scripts, + test scripts might intentionally exercise failing COPY ... FROM + STDIN commands. Those will need to gain a `\.` data terminator + line after each such command. + + The PostgreSQL Project thanks Alexander Lakhin for reporting + this problem. (CVE-2026-6464) + + + Cross-check the output row type of a portal running EXECUTE or + FETCH (Robert Haas) + + EXECUTE and FETCH use two portals: an outer one for the + statement itself, and an inner one running the query being + executed on its behalf. It was previously possible to make the + declared row types of the two portals diverge, leading to server + memory disclosure and arbitrary code execution. + + The PostgreSQL Project thanks Ben Morris (in collaboration with + Claude and Anthropic Research) and Peter Geoghegan for reporting + this problem. (CVE-2026-16239) + + + Fix buffer overrun with long time zone abbreviation in to_char() + (Tom Lane) + + This can easily crash the server, and exploits leading to + arbitrary code execution have been reported. + + The PostgreSQL Project thanks Hcamael, Amjad Shahzad, Tan Zhen + of AntAISecurityLab, Tomer Fichman, Zheng Yu, Amy Burnett + (OpenAI Codex Security), Rick de Jager, Heewon Song, Sylvie + Mayer, Aleksander Alekseev, and Hillai Ben Sasson for reporting + this problem. (CVE-2026-14669) + + + Fix buffer overrun in regexp match/split functions (Masahiko + Sawada) + + If passed invalidly-encoded data, these functions could write + past the end of their conversion buffer. + + The PostgreSQL Project thanks Francesco Verardi for reporting + this problem. (CVE-2026-14664) + + + Harden the ascii() function against invalid input (Michael + Paquier) + + By supplying invalidly-encoded input, this function could be + coaxed to read and return a few bytes of data that it shouldn't. + In assert-enabled builds, its assertions could be triggered too. + + The PostgreSQL Project thanks Hcamael for reporting this + problem. (CVE-2026-18024) + + + Fix multirange type handling in pg_restore_attribute_stats() + (OpenAI Security Research Team) + + pg_restore_attribute_stats() treated multirange types just like + their underlying range type. This works correctly for the bounds + histogram, but it was wrong for all the other statistics kinds. + + The PostgreSQL Project thanks Amy Burnett (OpenAI Codex + Security) for reporting this problem. (CVE-2026-16238) + + + Make scalarineqsel() check that a constant it expects to be of + type tid actually is (Tom Lane) + + This expectation will hold for all the built-in operators that + use this estimator, but a maliciously-constructed operator could + violate it, leading to a crash or server memory disclosure. + + The PostgreSQL Project thanks Hcamael for reporting this + problem. (CVE-2026-14668) + + + Harden tsvector and tsquery code against overly long values + (both individual lexemes and total vector/query length) (Tom + Lane) + + The documented limits were not enforced in all code paths. + + The PostgreSQL Project thanks Yuhang Wu, Zhenpeng Lin, Zheng Yu, + and Hcamael for reporting these problems. (CVE-2026-14662) + + + Fix various places that mistakenly assumed they would not have + to deal with more than `FUNC_MAX_ARGS` function arguments (Tom + Lane) + + Notably, the server's actual limit on the number of arguments to + an aggregate function is `FUNC_MAX_ARGS - 1`, but the parser + failed to enforce that, creating hazards downstream. + + The PostgreSQL Project thanks Zheng Yu, ylwangtju, and Masahiko + Sawada for reporting these problems. (CVE-2026-14679) + + + Reject calls from SQL to functions that take or return type + internal (Tom Lane) + + The existing defenses against doing this have been shown to be + insufficient, so add more explicit checks. + + The PostgreSQL Project thanks Amy Burnett (OpenAI Codex + Security) for reporting this problem. (CVE-2026-14680) + + + Preserve the ownership of extended statistics objects when they + are rebuilt by ALTER TABLE (Masahiko Sawada) + + Previously, the role running ALTER TABLE gained ownership of + such objects, but that seems inappropriate. + + The PostgreSQL Project thanks Noah Misch for reporting this + problem. (CVE-2026-6469) + + + When deparsing an EXTRACT() function call, quote the field name + if needed (Nathan Bossart) + + The parser accepts any string literal as a field name in + EXTRACT(), deferring validation to execution. If the call is + stored and deparsed (for example during pg_dump), the string + body was regurgitated verbatim, allowing SQL injection. + + The PostgreSQL Project thanks Ben Morris (in collaboration with + Claude and Anthropic Research) for reporting this problem. + (CVE-2026-15741) + + + Check for `USAGE` privilege on data types in places that + formerly failed to check that (Nathan Bossart) + + CREATE TYPE AS RANGE did not check, nor did ALTER TABLE OF, nor + did commands that create stored expressions. These omissions + allowed roles without `USAGE` privilege to nonetheless create + objects depending on the type, possibly blocking the type's + owner from changing the type later. + + The PostgreSQL Project thanks Jingzhou Fu for reporting this + problem. (CVE-2026-6470) + + + Invalidate role-dependent cached plans after role changes (Ilya + Staroverov, Shinya Kato, Nathan Bossart) + + Role membership, role attribute, and database ownership changes + may impact the expected behavior of row-level security policies, + but previously we'd continue to use cached plans that were made + according to the old state of affairs. + + The PostgreSQL Project thanks Ilya Staroverov and Shinya Kato + for reporting this problem. (CVE-2026-14666) + + + Reject GSSEncRequest after direct SSL connection (Michael + Paquier) + + After establishing a TLS-encrypted connection, the server would + still accept a request for GSSAPI encryption. If that succeeded, + the connection would proceed using TLS encryption, but it would + look like a GSS connection to the pg_hba rules. Thus, a pg_hba + policy intending to disallow TLS would not be enforced + correctly. + + The PostgreSQL Project thanks p4p3r for reporting this problem. + (CVE-2026-14681) + + + Make mock SCRAM authentication secrets more plausible (Nathan + Bossart) + + If a SCRAM login is attempted against a role that doesn't exist + or doesn't have a SCRAM secret, we generate a mock secret and + carry out the authentication handshake anyway, to avoid + revealing these facts to an attacker. But the mock secret was + made with a fixed iteration count, which in itself can be an + observable response discrepancy. Use the configuration setting + `scram_iterations` instead, to make the mock secret look more + like the installation's real secrets. + + The PostgreSQL Project thanks Radim Marek for reporting this + problem. (CVE-2026-14672) + + + Fix out-of-bounds writes in ecpg applications caused by invalid + bytea data received from the server (Michael Paquier) + + ecpg assumed without checking that any bytea value must begin + with `\x`. A broken or malicious server might send a string + shorter than 2 bytes, resulting in memory clobber in the + application. + + The PostgreSQL Project thanks ylwangtju for reporting this + problem. (CVE-2026-16241) + + + Do not do backquote expansion on the argument of psql's + \unrestrict command (Nathan Bossart) + + This oversight in the fix for CVE-2025-8714 allows a malicious + server to inject shell commands into plain-text dump output that + will be run at restore time on the machine running psql, the + exact scenario that CVE-2025-8714 intended to prevent. + + The PostgreSQL Project thanks Lucas Velgus, Filip Janus, and + Daniel Bakker for reporting this problem. (CVE-2026-18408) + + + Remove pg_dump's assumption that pg_proc.protrftypes cannot have + more than `FUNC_MAX_ARGS` entries (Tom Lane) + + Since there could be entries for both input and output + arguments, it's feasible for this array's length to exceed + `FUNC_MAX_ARGS` (which constrains only input arguments). Even if + that were not so, pg_dump cannot assume that the server was + built with the same value of `FUNC_MAX_ARGS` that it has. An + overrun would lead to a memory clobber inside pg_dump. + + The PostgreSQL Project thanks Masahiko Sawada for reporting this + problem. (CVE-2026-19385) + + + Harden PL/Perl against "tied" Perl arrays and hashes (Tom Lane) + + A tied object that doesn't behave like a regular one could lead + to memory overwrite, or to constructing a corrupt result array + (which would likely cause problems later). + + The PostgreSQL Project thanks Hcamael for reporting this + problem. (CVE-2026-14670) + + + Fix integer overflows in memory-allocation calculations in + PL/Perl and PL/Tcl (Heikki Linnakangas) + + This is the same type of problem as CVE-2026-6473, just in a + different part of the code, and is fixed in the same way. + + The PostgreSQL Project thanks the Tulya Project (Team Dhiutsa, + Bitecope Technologies Private Ltd) for reporting this problem. + (CVE-2026-14677) + + + Ensure that contrib/amcheck functions restrict `search_path` + before executing index expressions (Noah Misch) + + Because amcheck will run such index expressions as the owner of + their tables, a caller could potentially hijack + `search_path`-dependent functions to run arbitrary code as the + table owner. By default this is not a vulnerability because only + superusers are allowed to call amcheck functions; but if that + privilege was granted out, it created a larger hazard than the + documentation suggests. + + The PostgreSQL Project thanks Yuelin Wang and Jacob Brazeal for + reporting this problem. (CVE-2026-14673) + + + Fix integer overflows in contrib/fuzzystrmatch's levenshtein() + and levenshtein_less_equal() functions (Nathan Bossart) + + Passing large cost values to these functions could cause integer + overflows, thereby producing nonsensical results, and even + causing out-of-bounds writes in some cases. + + The PostgreSQL Project thanks Ben Morris (in collaboration with + Claude and Anthropic Research) for reporting this problem. + (CVE-2026-15742) + + + Fix buffer overrun in contrib/pg_stat_statements (Álvaro + Herrera) + + Query normalization didn't accurately account for the amount of + space the normalized string would require. + + The PostgreSQL Project thanks Sajeeb Lohani (with TrendAI Zero + Day Initiative) and Yuelin Wang for reporting this problem. + (CVE-2026-14676) + + + Fix datatype error in contrib/pg_trgm's GiST picksplit function + (Heikki Linnakangas) + + This mistake resulted in reading past the end of the buffer, + typically causing bad split decisions; but a crash could ensue + if you're very unlucky. + + The PostgreSQL Project thanks Mehmet D. Ince for reporting this + problem. (CVE-2026-14678) + + + Remove the plan cache in contrib/refint (Ayush Tiwari) + + This caching behavior has several serious bugs, notably that + check_foreign_key() embeds the new key values in its + cascade-UPDATE queries, so a cached plan reuses the + originally-needed values rather than the key values that should + be used. The simplest solution is to remove it. + + The PostgreSQL Project thanks Hcamael for reporting this + problem. (CVE-2026-14671) + + * Fix psql -c 'truncate/create table; copy from stdin'. + + -- Christoph Berg Tue, 11 Aug 2026 23:32:38 +0200 + postgresql-17 (17.10-0+deb13u1) trixie-security; urgency=medium * New upstream version 17.10. diff -Nru postgresql-17-17.10/debian/patches/extension_destdir postgresql-17-17.11/debian/patches/extension_destdir --- postgresql-17-17.10/debian/patches/extension_destdir 2024-01-22 10:28:46.000000000 +0000 +++ postgresql-17-17.11/debian/patches/extension_destdir 2026-08-11 21:32:38.000000000 +0000 @@ -1,6 +1,6 @@ --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c -@@ -392,6 +392,16 @@ get_extension_control_filename(const cha +@@ -523,6 +523,16 @@ get_extension_control_filename(const cha get_share_path(my_exec_path, sharepath); result = (char *) palloc(MAXPGPATH); @@ -17,7 +17,7 @@ snprintf(result, MAXPGPATH, "%s/extension/%s.control", sharepath, extname); -@@ -431,6 +441,16 @@ get_extension_aux_control_filename(Exten +@@ -562,6 +572,16 @@ get_extension_aux_control_filename(Exten scriptdir = get_extension_script_directory(control); result = (char *) palloc(MAXPGPATH); @@ -34,7 +34,7 @@ snprintf(result, MAXPGPATH, "%s/%s--%s.control", scriptdir, control->name, version); -@@ -449,6 +469,23 @@ get_extension_script_filename(ExtensionC +@@ -580,6 +600,23 @@ get_extension_script_filename(ExtensionC scriptdir = get_extension_script_directory(control); result = (char *) palloc(MAXPGPATH); @@ -58,7 +58,7 @@ if (from_version) snprintf(result, MAXPGPATH, "%s/%s--%s--%s.sql", scriptdir, control->name, from_version, version); -@@ -1208,6 +1245,59 @@ get_ext_ver_list(ExtensionControlFile *c +@@ -1339,6 +1376,59 @@ get_ext_ver_list(ExtensionControlFile *c DIR *dir; struct dirent *de; @@ -120,7 +120,7 @@ while ((de = ReadDir(dir, location)) != NULL) --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h -@@ -277,6 +277,7 @@ extern PGDLLIMPORT char *ConfigFileName; +@@ -278,6 +278,7 @@ extern PGDLLIMPORT char *ConfigFileName; extern PGDLLIMPORT char *HbaFileName; extern PGDLLIMPORT char *IdentFileName; extern PGDLLIMPORT char *external_pid_file; @@ -189,18 +189,18 @@ pfree(full); --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample -@@ -757,6 +757,8 @@ +@@ -776,6 +776,8 @@ # - Other Defaults - #dynamic_library_path = '$libdir' +#extension_destdir = '' # prepend path when loading extensions + # and shared objects (added by Debian) #gin_fuzzy_search_limit = 0 - + #output_plugin_libraries = 'pgoutput, test_decoding' # approved plugins for logical decoding --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c -@@ -538,6 +538,7 @@ char *ConfigFileName; +@@ -551,6 +551,7 @@ char *ConfigFileName; char *HbaFileName; char *IdentFileName; char *external_pid_file; @@ -208,7 +208,7 @@ char *application_name; -@@ -4415,6 +4416,17 @@ struct config_string ConfigureNamesStrin +@@ -4504,6 +4505,17 @@ struct config_string ConfigureNamesStrin }, { diff -Nru postgresql-17-17.10/debian/patches/series postgresql-17-17.11/debian/patches/series --- postgresql-17-17.10/debian/patches/series 2026-05-11 20:57:44.000000000 +0000 +++ postgresql-17-17.11/debian/patches/series 2026-08-11 21:32:38.000000000 +0000 @@ -11,3 +11,4 @@ focal-arm64-outline-atomics jit-s390x pgstat-report-conflicts-immediately.patch +v2-0001-psql-count-every-COPY-FROM-STDIN-when-scanning-a-.patch diff -Nru postgresql-17-17.10/debian/patches/v2-0001-psql-count-every-COPY-FROM-STDIN-when-scanning-a-.patch postgresql-17-17.11/debian/patches/v2-0001-psql-count-every-COPY-FROM-STDIN-when-scanning-a-.patch --- postgresql-17-17.10/debian/patches/v2-0001-psql-count-every-COPY-FROM-STDIN-when-scanning-a-.patch 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/debian/patches/v2-0001-psql-count-every-COPY-FROM-STDIN-when-scanning-a-.patch 2026-08-11 21:32:38.000000000 +0000 @@ -0,0 +1,119 @@ +From 2636c7ca9ae3b921b4078e4735597a8d053e1974 Mon Sep 17 00:00:00 2001 +From: Zsolt Parragi +Date: Tue, 11 Aug 2026 18:16:28 +0000 +Subject: [PATCH v2] psql: count every COPY FROM STDIN when scanning a query + string + +When SendQuery() is not told how many COPY FROM STDIN commands the query +string contains (num_copy_from_stdin < 0, as for -c, \gexec and forced +sends), it scanned the string to count them itself. But it called +psql_scan() only once, which stops at the first semicolon, so any COPY +FROM STDIN past the first sub-command was not counted. psql then treated +the server's COPY_IN response as unexpected and closed the connection +with "unexpected COPY_IN result, aborting connection", e.g. for + + psql -c "SELECT 1; COPY tab FROM STDIN" < data + +which worked before the counting was added. + +Loop psql_scan() over the whole string so the count accumulates across +all sub-commands. Add a TAP test covering a lone COPY, a COPY after +another command, and two COPYs in one string. + +Oversight in commit 3045a25ba81. +--- + src/bin/psql/common.c | 17 ++++++++++++- + src/bin/psql/t/001_basic.pl | 50 +++++++++++++++++++++++++++++++++++++ + 2 files changed, 66 insertions(+), 1 deletion(-) + +--- a/src/bin/psql/common.c ++++ b/src/bin/psql/common.c +@@ -1537,13 +1537,28 @@ ExecQueryAndProcessResults(const char *q + PsqlScanState scan_state; + PQExpBuffer query_buf; + promptStatus_t prompt_tmp; ++ PsqlScanResult scan_result; + + 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); ++ /* ++ * A semicolon ends only one sub-command; keep scanning so that COPY ++ * FROM STDIN commands past the first semicolon are counted too. The ++ * count accumulates in scan_state across the psql_scan() calls. ++ * ++ * The scan stops early if it hits a backslash command, leaving the ++ * rest of the string uncounted. That's fine: backslash commands are ++ * not supported in query strings sent through this path, so the ++ * server will fail to parse such a string before any COPY data ++ * transfer can start. ++ */ ++ do ++ { ++ scan_result = psql_scan(scan_state, query_buf, &prompt_tmp); ++ } while (scan_result == PSCAN_SEMICOLON); + + num_copy_from_stdin = psql_scan_count_copy_from_stdin(scan_state); + +--- a/src/bin/psql/t/001_basic.pl ++++ b/src/bin/psql/t/001_basic.pl +@@ -450,6 +450,56 @@ psql_fails_like( + qr/backslash commands are restricted; only \\unrestrict is allowed/, + 'meta-command in restrict mode fails'); + ++# Test that psql counts every COPY FROM STDIN in a query string when it has ++# to scan the string itself (as for -c). A COPY that is not the first ++# sub-command must still be recognized, otherwise psql treats the server's ++# COPY_IN response as unexpected and aborts the connection. ++$node->safe_psql('postgres', 'CREATE TABLE copy_stdin_count (a int)'); ++ ++my @copy_stdin_cases = ( ++ { ++ name => 'single COPY FROM STDIN', ++ sql => 'COPY copy_stdin_count FROM STDIN', ++ data => "10\n20\n\\.\n", ++ rows => 2, ++ }, ++ { ++ name => 'COPY FROM STDIN after another command', ++ sql => 'SELECT 1; COPY copy_stdin_count FROM STDIN', ++ data => "30\n40\n\\.\n", ++ rows => 2, ++ }, ++ { ++ name => 'two COPY FROM STDIN in one string', ++ sql => 'COPY copy_stdin_count FROM STDIN; COPY copy_stdin_count FROM STDIN', ++ data => "50\n\\.\n60\n\\.\n", ++ rows => 2, ++ }); ++ ++foreach my $c (@copy_stdin_cases) ++{ ++ $node->safe_psql('postgres', 'TRUNCATE copy_stdin_count'); ++ ++ my ($stdout, $stderr) = ('', ''); ++ my $ret = IPC::Run::run( ++ [ ++ 'psql', '-X', '-v' => 'ON_ERROR_STOP=1', ++ '-d' => $node->connstr('postgres'), ++ '-c' => $c->{sql} ++ ], ++ '<' => \$c->{data}, ++ '>' => \$stdout, ++ '2>' => \$stderr); ++ ++ ok($ret, "$c->{name}: psql exits 0"); ++ unlike($stderr, qr/unexpected COPY_IN result/, ++ "$c->{name}: connection not aborted"); ++ ++ my $count = ++ $node->safe_psql('postgres', 'SELECT count(*) FROM copy_stdin_count'); ++ is($count, $c->{rows}, "$c->{name}: all rows loaded"); ++} ++ + psql_fails_like( + $node, + qq{\\restrict test diff -Nru postgresql-17-17.10/doc/src/sgml/config.sgml postgresql-17-17.11/doc/src/sgml/config.sgml --- postgresql-17-17.10/doc/src/sgml/config.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/config.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -1144,6 +1144,19 @@ time of encryption. In order to make use of a changed value, a new password must be set. + + + If a role password was created with a different iteration count than + the value of scram_iterations specified in the + postgresql.conf file or on the server command + line, an unauthenticated user can discern the existence of the role by + observing discrepancies in the server's responses to connection + attempts. If you find this concerning, ensure that all role passwords + are created with scram_iterations set to the value + specified in the postgresql.conf file or on the + server command line. + + @@ -3372,6 +3385,7 @@ 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. @@ -4521,6 +4535,63 @@ + + output_plugin_libraries (string) + + output_plugin_libraries configuration parameter + + + + + Lists the libraries installed in + that are also trusted for use as logical output plugins by replication + clients. Any logical decoding + or replication requests for + other libraries will be refused. All users are subject to this + restriction. The default is 'pgoutput, test_decoding', + which are the two logical output plugins included in the standard + PostgreSQL distribution. + + + The format is a comma-separated list of library names, where each name + is interpreted as for the LOAD + command (but logical decoding clients must specify a plugin name that + exactly matches an entry in the list, without + variations in case or path structure). Whitespace between entries is + ignored; surround a library name with double quotes if you need to + include whitespace or commas in the name. + + + It is the responsibility of the server administrator to ensure that + libraries added to this list do not unintentionally give additional + privileges to non-superusers when they are loaded into the server. + + + + When updating the server from a version that does not have the + output_plugin_libraries parameter, the following + query can help construct the list of plugins that are required by all + persistent logical replication slots: + +SELECT DISTINCT plugin FROM pg_replication_slots WHERE plugin IS NOT NULL; + + Review the list carefully for safety before adjusting + output_plugin_libraries. + + + The above query can only display plugins which were successfully + added to replication slots at some point in the past. Newly refused + requests will appear in the logs with a message similar to + +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) @@ -7774,9 +7845,10 @@ This setting only affects log messages printed as a result of , - , and related settings. Non-zero - values of this setting add some overhead, particularly if parameters - are sent in binary form, since then conversion to text is required. + , and related settings. + Non-zero values of this setting add some overhead, particularly + if parameters are sent in binary form, since then conversion to + text is required. diff -Nru postgresql-17-17.10/doc/src/sgml/contrib-spi.sgml postgresql-17-17.11/doc/src/sgml/contrib-spi.sgml --- postgresql-17-17.10/doc/src/sgml/contrib-spi.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/contrib-spi.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -31,9 +31,18 @@ check_primary_key() and check_foreign_key() are used to check foreign key constraints. (This functionality is long since superseded by the built-in foreign - key mechanism, of course, but the module is still useful as an example.) + key mechanism, of course, but the module is still useful as an example. + This module will be removed in PostgreSQL 20.) + + + refint requires a + secure schema usage pattern and + data types where the equality operator is named =. + + + check_primary_key() checks the referencing table. To use, create a BEFORE INSERT OR UPDATE trigger using this @@ -44,6 +53,29 @@ keys, create a trigger for each reference. + + + The referenced table name and column name arguments to + check_primary_key() are copied as-is into internally + generated SQL statements and therefore must be double-quoted by the user as + necessary in the CREATE TRIGGER command. See + for more information about quoting + SQL identifiers. Conversely, the referencing table + column name arguments should not be double quoted. See the following mock + example of proper use of check_primary_key(): + +CREATE TRIGGER mytrigger +BEFORE 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() checks the referenced table. To use, create a BEFORE DELETE OR UPDATE trigger using this @@ -53,13 +85,38 @@ (cascade — to delete the referencing row, restrict — to abort transaction if referencing keys exist, setnull — to set referencing key fields to null), - the triggered table's column names which form the primary/unique key, then + the referenced table's column names which form the primary/unique key, then the referencing table name and column names (repeated for as many referencing tables as were specified by first argument). Note that the primary/unique key columns should be marked NOT NULL and should have a unique index. + + + The referencing table name and column name arguments + to check_foreign_key() are copied as-is into + internally generated SQL statements and therefore must be double-quoted by + the user as necessary in the CREATE TRIGGER command. + See for more information about + quoting SQL identifiers. Conversely, the referenced + table column name arguments should not be double quoted. See the following + mock example of proper use of check_foreign_key(): + +CREATE TRIGGER mytrigger +BEFORE 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 +); + + + + There are examples in refint.example. diff -Nru postgresql-17-17.10/doc/src/sgml/ddl.sgml postgresql-17-17.11/doc/src/sgml/ddl.sgml --- postgresql-17-17.10/doc/src/sgml/ddl.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/ddl.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -1996,7 +1996,11 @@ Allows creation of a foreign key constraint referencing a - table, or specific column(s) of a table. + 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. @@ -2005,7 +2009,9 @@ TRIGGER - Allows creation of a trigger on a table, view, etc. + Allows creation of a trigger on a table, view, etc. Great care should be + taken when granting this privilege, since any triggers added to a table + or view will be executed with the privileges of users who modify it. diff -Nru postgresql-17-17.10/doc/src/sgml/ecpg.sgml postgresql-17-17.11/doc/src/sgml/ecpg.sgml --- postgresql-17-17.10/doc/src/sgml/ecpg.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/ecpg.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -7314,7 +7314,7 @@ -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 [, ... ] @@ -7333,7 +7333,7 @@ This command has two forms: The first form retrieves - descriptor header items, which apply to the result + descriptor header item, which applies to the result set in its entirety. One example is the row count. The second form, which requires the column number as additional parameter, retrieves information about a particular column. Examples are @@ -7809,7 +7809,7 @@ -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 -Nru postgresql-17-17.10/doc/src/sgml/func.sgml postgresql-17-17.11/doc/src/sgml/func.sgml --- postgresql-17-17.10/doc/src/sgml/func.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/func.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -25321,20 +25321,6 @@ t - - - - aclitem[] ~ aclitem - boolean - - - This is a deprecated alias for @>. - - - '{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*/hobbes'::aclitem - t - - diff -Nru postgresql-17-17.10/doc/src/sgml/logical-replication.sgml postgresql-17-17.11/doc/src/sgml/logical-replication.sgml --- postgresql-17-17.10/doc/src/sgml/logical-replication.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/logical-replication.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -1904,6 +1904,15 @@ + The name of the output plugin used by the replication connection must be + included in the server's . (For + subscriptions, the plugin name that is used is pgoutput.) + Superusers may modify the trusted list per-connection, by including + options=-coutput_plugin_libraries=... in the connection + string. + + + In order to be able to copy the initial table data, the role used for the replication connection must have the SELECT privilege on a published table (or be a superuser). diff -Nru postgresql-17-17.10/doc/src/sgml/maintenance.sgml postgresql-17-17.11/doc/src/sgml/maintenance.sgml --- postgresql-17-17.10/doc/src/sgml/maintenance.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/maintenance.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -667,7 +667,7 @@ there are fewer than three million transactions left until wraparound: -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. @@ -683,20 +683,20 @@ Resolve old prepared transactions. You can find these by checking - pg_prepared_xacts for rows where + pg_prepared_xacts for rows where age(transactionid) is large. Such transactions should be committed or rolled back. End long-running open transactions. You can find these by checking - pg_stat_activity for rows where + pg_stat_activity for rows where age(backend_xid) or age(backend_xmin) is large. Such transactions should be committed or rolled back, or the session can be terminated using pg_terminate_backend. Drop any old replication slots. Use - pg_stat_replication to + pg_replication_slots to find slots where age(xmin) or age(catalog_xmin) is large. In many cases, such slots were created for replication to servers that no longer exist, or that have been down for a long time. If you drop a slot for a server @@ -822,6 +822,12 @@ is no chance that they might appear in a multixact. + Unlike transaction ID wraparound, replication slots do not + directly hold back multixact cleanup. Dropping stale replication + slots is therefore not usually relevant to resolving multixact ID + wraparound problems. + + MXID information is not directly visible in system views such as pg_stat_activity; however, looking for old XIDs is still a good way of determining which transactions are causing MXID wraparound problems. diff -Nru postgresql-17-17.10/doc/src/sgml/pgcrypto.sgml postgresql-17-17.11/doc/src/sgml/pgcrypto.sgml --- postgresql-17-17.10/doc/src/sgml/pgcrypto.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/pgcrypto.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -923,6 +923,38 @@ Applies to: pgp_sym_encrypt, pgp_pub_encrypt + + + ignore-cipher-failure + + + Dangerous! Instructs pgcrypto to use an incorrect decryption algorithm + matching the historical behavior prior to the fix for CVE-2026-14663, by + completely ignoring failures from the OpenSSL cipher in use. This is + intended only for users who need to recover incorrectly-encrypted messages + created when the cipher-algo was unavailable under the + OpenSSL configuration in use. Such faulty messages do not require the + correct decryption key when ignore-cipher-failure is + enabled, so there is no guarantee that the decrypted plaintext actually + originated from a holder of the key. + + + Contrast the case of a message which was correctly encrypted, but the cipher + that produced it is unavailable under the current OpenSSL + configuration. Recovering such plaintext via pgcrypto + requires making the actual cipher available to OpenSSL by, for example, + enabling the appropriate provider. ignore-cipher-failure + is not necessary or helpful for that scenario. If decryption + of a correctly encrypted message with this option happens to pass PGP + integrity checks, that result is coincidental and does not make the + recovered plaintext trustworthy. + + +Values: 0, 1 +Default: 0 +Applies to: pgp_sym_decrypt, pgp_pub_decrypt + + diff -Nru postgresql-17-17.10/doc/src/sgml/ref/alter_table.sgml postgresql-17-17.11/doc/src/sgml/ref/alter_table.sgml --- postgresql-17-17.10/doc/src/sgml/ref/alter_table.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/ref/alter_table.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -1000,10 +1000,11 @@ 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 diff -Nru postgresql-17-17.10/doc/src/sgml/ref/copy.sgml postgresql-17-17.11/doc/src/sgml/ref/copy.sgml --- postgresql-17-17.10/doc/src/sgml/ref/copy.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/ref/copy.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -456,10 +456,11 @@ - Currently, subqueries 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). + 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). diff -Nru postgresql-17-17.10/doc/src/sgml/ref/create_type.sgml postgresql-17-17.11/doc/src/sgml/ref/create_type.sgml --- postgresql-17-17.10/doc/src/sgml/ref/create_type.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/ref/create_type.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -186,6 +186,11 @@ type name. Otherwise, the multirange type name is formed by appending a _multirange suffix to the range type name. + + + To be able to create a range type, you must have USAGE + privilege on the subtype. + diff -Nru postgresql-17-17.10/doc/src/sgml/ref/drop_subscription.sgml postgresql-17-17.11/doc/src/sgml/ref/drop_subscription.sgml --- postgresql-17-17.10/doc/src/sgml/ref/drop_subscription.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/ref/drop_subscription.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -102,12 +102,14 @@ it from the replication slot by executing 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 . + 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 + . diff -Nru postgresql-17-17.10/doc/src/sgml/ref/pg_recvlogical.sgml postgresql-17-17.11/doc/src/sgml/ref/pg_recvlogical.sgml --- postgresql-17-17.10/doc/src/sgml/ref/pg_recvlogical.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/ref/pg_recvlogical.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -457,7 +457,7 @@ pg_recvlogical will preserve group permissions on - the received WAL files if group permissions are enabled on the source + the output files if group permissions are enabled on the source cluster. diff -Nru postgresql-17-17.10/doc/src/sgml/ref/pgupgrade.sgml postgresql-17-17.11/doc/src/sgml/ref/pgupgrade.sgml --- postgresql-17-17.10/doc/src/sgml/ref/pgupgrade.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/ref/pgupgrade.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -447,8 +447,10 @@ - The output plugins referenced by the slots on the old cluster must be - installed in the new PostgreSQL executable directory. + The output plugins referenced by the slots in the old cluster must be + installed in the new PostgreSQL executable directory. They must also be + included in the new cluster's ; + see that parameter's documentation for safety information. diff -Nru postgresql-17-17.10/doc/src/sgml/ref/psql-ref.sgml postgresql-17-17.11/doc/src/sgml/ref/psql-ref.sgml --- postgresql-17-17.10/doc/src/sgml/ref/psql-ref.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/ref/psql-ref.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -2635,8 +2635,9 @@ only databases whose names match the pattern are listed. 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. @@ -3546,6 +3547,11 @@ pg_dumpall, and pg_restore, but it may be useful elsewhere. + + Unlike most other meta-commands, the entire remainder of the line is + always taken to be the argument of \unrestrict, and + neither variable interpolation nor backquote expansion are performed. + diff -Nru postgresql-17-17.10/doc/src/sgml/release-17.sgml postgresql-17-17.11/doc/src/sgml/release-17.sgml --- postgresql-17-17.10/doc/src/sgml/release-17.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/release-17.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -1,6 +1,2959 @@ + + Release 17.11 + + + Release date: + 2026-08-13 + + + + This release contains a variety of fixes from 17.10. + For information about new features in major release 17, see + . + + + + Migration to Version 17.11 + + + A dump/restore is not required for those running 17.X. + + + + However, the first three security entries below describe configuration + adjustments and data cleanups that you may need to make after updating. + + + + Also, if you use contrib/btree_gist + or contrib/ltree, you may need to reindex indexes + made with those extensions; see the relevant entries below. + + + + Also, if you are upgrading from a version earlier than 17.6, + see . + + + + + Changes + + + + + + + Restrict logical decoding output plugins to the set specified by a + new server parameter output_plugin_libraries + (Jacob Champion) + § + § + + + + Previously, a replication user could select any loadable library for + logical decoding, allowing exploits of various sorts. To allow + locking this down without breaking setups that worked before, + introduce a whitelist of allowed output plugins. + + + + By default, only the output plugins shipped as part + of PostgreSQL + (pgoutput and test_decoding) + are included in output_plugin_libraries. + Installations that rely on other output plugins must add them + after updating the server, for example + +output_plugin_libraries = 'pgoutput, test_decoding, my_trusted_decoder' + + + + + Additionally, pg_upgrade --check will fail if the + output_plugin_libraries parameter on the new + cluster does not permit the plugins of logical replication slots + on the old cluster, when migrating from versions 17 and later. + Make necessary additions to the new cluster's setting before + performing pg_upgrade. + + + + The PostgreSQL Project thanks + Vladimir Tokarev and Yu Kunpeng + for reporting this problem. + (CVE-2026-6471) + + + + + + + Fix contrib/pgcrypto's PGP encryption to detect + unsupported ciphers (Daniel Gustafsson) + § + § + + + + Previously, if OpenSSL rejected the requested cipher (for example, + because it is running in FIPS mode, or the legacy provider hasn't + been loaded), pgcrypto failed to notice + the failure and simply XOR'd the non-encrypted block with the + plaintext, rendering the encryption trivially + breakable. This will typically occur with deprecated or non-FIPS + cipher algorithms (cipher-algo=blowfish/bf, twofish, cast5, or + 3des). + + + + By default, pgcrypto will now fail to + decrypt any messages that were affected in this way. To allow + retrieval of such data, a new + option ignore-cipher-failure has been added + to pgp_pub_decrypt() + and pgp_sym_decrypt(). + Setting ignore-cipher-failure=1 will restore + their previous behavior, allowing the faulty encryption wrapper to + be stripped off: + +pgp_sym_decrypt(encrypted_column, any key, 'ignore-cipher-failure=1') + + Once the affected messages are identified and stripped of their + wrappers, they can then be re-encrypted with a modern algorithm. It + is important however that the behavior of OpenSSL be the same as it + was when the faulty messages were created: if the set of unsupported + algorithms is not the same, this approach will not work. See the + documentation for ignore-cipher-failure. + + + + The PostgreSQL Project thanks + Shishir Sharma + for reporting this problem. + (CVE-2026-14663) + + + + + + + Fix psql to skip in-line data following a + scripted COPY ... FROM STDIN command, even if + the COPY fails before + sending PGRES_COPY_IN (Tom Lane) + § + § + + + + Previously, if a COPY command failed at startup + (for instance, because the target table doesn't exist) + psql would not realize that and would + proceed to read the following in-line data as SQL commands. In the + best case that's wrong and in the worst case it's a SQL-injection + hazard. Teach psql to recognize + syntactically-valid COPY ... FROM STDIN commands + and to skip data on its own authority if the server doesn't respond + with PGRES_COPY_IN. + + + + While this fix is unlikely to affect any production SQL scripts, + test scripts might intentionally exercise failing COPY + ... FROM STDIN commands. Those will need to gain + a \. data terminator line after each such + command. + + + + The PostgreSQL Project thanks + Alexander Lakhin + for reporting this problem. + (CVE-2026-6464) + + + + + + + Cross-check the output row type of a portal + running EXECUTE or FETCH + (Robert Haas) + § + + + + EXECUTE and FETCH use two + portals: an outer one for the statement itself, and an inner one + running the query being executed on its behalf. It was previously + possible to make the declared row types of the two portals diverge, + leading to server memory disclosure and arbitrary code execution. + + + + The PostgreSQL Project thanks + Ben Morris (in collaboration with Claude and Anthropic Research) + and Peter Geoghegan + for reporting this problem. + (CVE-2026-16239) + + + + + + + Fix buffer overrun with long time zone abbreviation in + to_char() (Tom Lane) + § + + + + This can easily crash the server, and exploits leading to arbitrary + code execution have been reported. + + + + The PostgreSQL Project thanks + Hcamael, Amjad Shahzad, Tan Zhen of AntAISecurityLab, Tomer Fichman, + Zheng Yu, Amy Burnett (OpenAI Codex Security), Rick de Jager, Heewon + Song, Sylvie Mayer, Aleksander Alekseev, and Hillai Ben Sasson + for reporting this problem. + (CVE-2026-14669) + + + + + + + Fix buffer overrun in regexp match/split functions (Masahiko Sawada) + § + + + + If passed invalidly-encoded data, these functions could write past + the end of their conversion buffer. + + + + The PostgreSQL Project thanks + Francesco Verardi + for reporting this problem. + (CVE-2026-14664) + + + + + + + Harden the ascii() function against invalid + input (Michael Paquier) + § + + + + By supplying invalidly-encoded input, this function could be coaxed + to read and return a few bytes of data that it shouldn't. In + assert-enabled builds, its assertions could be triggered too. + + + + The PostgreSQL Project thanks + Hcamael + for reporting this problem. + (CVE-2026-18024) + + + + + + + Fix multirange type handling + in pg_restore_attribute_stats() + (OpenAI Security Research Team) + + + + pg_restore_attribute_stats() treated multirange + types just like their underlying range type. This works correctly + for the bounds histogram, but it was wrong for all the other + statistics kinds. + + + + The PostgreSQL Project thanks + Amy Burnett (OpenAI Codex Security) + for reporting this problem. + (CVE-2026-16238) + + + + + + + Make scalarineqsel() check that a constant it + expects to be of type tid actually is (Tom Lane) + § + + + + This expectation will hold for all the built-in operators that use + this estimator, but a maliciously-constructed operator could violate + it, leading to a crash or server memory disclosure. + + + + The PostgreSQL Project thanks + Hcamael + for reporting this problem. + (CVE-2026-14668) + + + + + + + Harden tsvector and tsquery code against + overly long values (both individual lexemes and total vector/query + length) (Tom Lane) + § + § + + + + The documented limits were not enforced in all code paths. + + + + The PostgreSQL Project thanks + Yuhang Wu, Zhenpeng Lin, Zheng Yu, and Hcamael + for reporting these problems. + (CVE-2026-14662) + + + + + + + Fix various places that mistakenly assumed they would not have to + deal with more than FUNC_MAX_ARGS function + arguments (Tom Lane) + § + § + + + + Notably, the server's actual limit on the number of arguments to an + aggregate function is FUNC_MAX_ARGS - 1, but the + parser failed to enforce that, creating hazards downstream. + + + + The PostgreSQL Project thanks + Zheng Yu, ylwangtju, and Masahiko Sawada + for reporting these problems. + (CVE-2026-14679) + + + + + + + Reject calls from SQL to functions that take or return + type internal (Tom Lane) + § + § + + + + The existing defenses against doing this have been shown to be + insufficient, so add more explicit checks. + + + + The PostgreSQL Project thanks + Amy Burnett (OpenAI Codex Security) + for reporting this problem. + (CVE-2026-14680) + + + + + + + Preserve the ownership of extended statistics objects when they are + rebuilt by ALTER TABLE (Masahiko Sawada) + § + + + + Previously, the role running ALTER TABLE gained + ownership of such objects, but that seems inappropriate. + + + + The PostgreSQL Project thanks + Noah Misch + for reporting this problem. + (CVE-2026-6469) + + + + + + + When deparsing an EXTRACT() function call, + quote the field name if needed (Nathan Bossart) + § + + + + The parser accepts any string literal as a field name + in EXTRACT(), deferring validation to + execution. If the call is stored and deparsed (for example + during pg_dump), the string body was + regurgitated verbatim, allowing SQL injection. + + + + The PostgreSQL Project thanks + Ben Morris (in collaboration with Claude and Anthropic Research) + for reporting this problem. + (CVE-2026-15741) + + + + + + + Check for USAGE privilege on data types in places + that formerly failed to check that (Nathan Bossart) + § + § + § + + + + CREATE TYPE AS RANGE did not check, nor + did ALTER TABLE OF, nor did commands that create + stored expressions. These omissions allowed roles + without USAGE privilege to nonetheless create + objects depending on the type, possibly blocking the type's owner + from changing the type later. + + + + The PostgreSQL Project thanks + Jingzhou Fu + for reporting this problem. + (CVE-2026-6470) + + + + + + + Invalidate role-dependent cached plans after role changes + (Ilya Staroverov, Shinya Kato, Nathan Bossart) + § + + + + Role membership, role attribute, and database ownership changes may + impact the expected behavior of row-level security policies, but + previously we'd continue to use cached plans that were made + according to the old state of affairs. + + + + The PostgreSQL Project thanks + Ilya Staroverov and Shinya Kato + for reporting this problem. + (CVE-2026-14666) + + + + + + + Reject GSSEncRequest after direct SSL connection (Michael Paquier) + § + + + + After establishing a TLS-encrypted connection, the server would + still accept a request for GSSAPI encryption. If that succeeded, + the connection would proceed using TLS encryption, but it would look + like a GSS connection to the pg_hba rules. + Thus, a pg_hba policy intending to disallow TLS + would not be enforced correctly. + + + + The PostgreSQL Project thanks + p4p3r + for reporting this problem. + (CVE-2026-14681) + + + + + + + Make mock SCRAM authentication secrets more plausible (Nathan Bossart) + § + + + + If a SCRAM login is attempted against a role that doesn't exist or + doesn't have a SCRAM secret, we generate a mock secret and carry out + the authentication handshake anyway, to avoid revealing these facts + to an attacker. But the mock secret was made with a fixed iteration + count, which in itself can be an observable response discrepancy. + Use the configuration setting scram_iterations + instead, to make the mock secret look more like the installation's + real secrets. + + + + The PostgreSQL Project thanks + Radim Marek + for reporting this problem. + (CVE-2026-14672) + + + + + + + Fix out-of-bounds writes in ecpg + applications caused by invalid bytea data received from + the server (Michael Paquier) + § + + + + ecpg assumed without checking that + any bytea value must begin with \x. + A broken or malicious server might send a string shorter than 2 + bytes, resulting in memory clobber in the application. + + + + The PostgreSQL Project thanks + ylwangtju + for reporting this problem. + (CVE-2026-16241) + + + + + + + Do not do backquote expansion on the argument + of psql's \unrestrict + command (Nathan Bossart) + § + + + + This oversight in the fix for CVE-2025-8714 allows a malicious + server to inject shell commands into plain-text dump output that + will be run at restore time on the machine + running psql, the exact scenario that + CVE-2025-8714 intended to prevent. + + + + The PostgreSQL Project thanks + Lucas Velgus, Filip Janus, and Daniel Bakker + for reporting this problem. + (CVE-2026-18408) + + + + + + + Remove pg_dump's assumption that + pg_proc.protrftypes + cannot have more than FUNC_MAX_ARGS entries + (Tom Lane) + § + + + + Since there could be entries for both input and output arguments, + it's feasible for this array's length to exceed + FUNC_MAX_ARGS (which constrains only input + arguments). Even if that were not so, + pg_dump cannot assume that the server was + built with the same value of FUNC_MAX_ARGS that + it has. An overrun would lead to a memory clobber + inside pg_dump. + + + + The PostgreSQL Project thanks + Masahiko Sawada + for reporting this problem. + (CVE-2026-19385) + + + + + + + Harden PL/Perl + against tied Perl arrays and hashes (Tom Lane) + § + + + + A tied object that doesn't behave like a regular one could lead to + memory overwrite, or to constructing a corrupt result array (which + would likely cause problems later). + + + + The PostgreSQL Project thanks + Hcamael + for reporting this problem. + (CVE-2026-14670) + + + + + + + Fix integer overflows in memory-allocation calculations + in PL/Perl + and PL/Tcl (Heikki Linnakangas) + § + + + + This is the same type of problem as CVE-2026-6473, just in a + different part of the code, and is fixed in the same way. + + + + The PostgreSQL Project thanks + the Tulya Project (Team Dhiutsa, Bitecope Technologies Private Ltd) + for reporting this problem. + (CVE-2026-14677) + + + + + + + Ensure that contrib/amcheck functions + restrict search_path before executing index + expressions (Noah Misch) + § + + + + Because amcheck will run such index expressions as the owner of + their tables, a caller could potentially + hijack search_path-dependent functions to run + arbitrary code as the table owner. By default this is not a + vulnerability because only superusers are allowed to call amcheck + functions; but if that privilege was granted out, it created a + larger hazard than the documentation suggests. + + + + The PostgreSQL Project thanks + Yuelin Wang and Jacob Brazeal + for reporting this problem. + (CVE-2026-14673) + + + + + + + Fix integer overflows in contrib/fuzzystrmatch's + levenshtein() + and levenshtein_less_equal() functions + (Nathan Bossart) + § + + + + Passing large cost values to these functions could cause integer + overflows, thereby producing nonsensical results, and even causing + out-of-bounds writes in some cases. + + + + The PostgreSQL Project thanks + Ben Morris (in collaboration with Claude and Anthropic Research) + for reporting this problem. + (CVE-2026-15742) + + + + + + + Fix buffer overrun + in contrib/pg_stat_statements (Álvaro Herrera) + + + + Query normalization didn't accurately account for the amount of + space the normalized string would require. + + + + The PostgreSQL Project thanks + Sajeeb Lohani (with TrendAI Zero Day Initiative) and Yuelin Wang + for reporting this problem. + (CVE-2026-14676) + + + + + + + Fix datatype error in contrib/pg_trgm's GiST + picksplit function (Heikki Linnakangas) + § + + + + This mistake resulted in reading past the end of the buffer, + typically causing bad split decisions; but a crash could ensue + if you're very unlucky. + + + + The PostgreSQL Project thanks + Mehmet D. Ince + for reporting this problem. + (CVE-2026-14678) + + + + + + + Remove the plan cache in contrib/refint + (Ayush Tiwari) + § + + + + This caching behavior has several serious bugs, notably that + check_foreign_key() embeds the new key values + in its cascade-UPDATE queries, so a cached plan reuses the + originally-needed values rather than the key values that should be + used. The simplest solution is to remove it. + + + + The PostgreSQL Project thanks + Hcamael + for reporting this problem. + (CVE-2026-14671) + + + + + + + Fix mis-handling of asynchronous reads when rescanning an + asynchronous Append plan node (Alexander Korotkov, Gleb Kashkin, + Etsuro Fujita) + § + + + + When an upper plan node rescans an Append before having read the + entire Append output, we need to discard any in-flight requests sent + to external servers (by postgres_fdw for + example). This was not done correctly in cases where a subplan has + parameter changes or is discarded by partition pruning in the next + scan. The outcome could be incorrect query results, an infinite + loop, or an assertion failure. + + + + + + + Fix error in partition pruning for RANGE-partitioned tables + (David Rowley) + § + + + + In some cases the DEFAULT partition would be skipped when it should + not be, which could lead to rows missing from query results. + + + + + + + Fix planner's nullability and strictness checks + for value IN + (array) expressions + (Ayush Tiwari) + § + + + + These checks should only succeed if the array operand is known to be + non-empty, but that consideration was missed, allowing optimizations + to be applied that should not be. This could result in wrong query + answers if the array actually was empty. + + + + + + + Fix incorrect join removal logic (Matheus Alcantara, Richard Guo) + § + § + + + + In edge cases, it was possible for a constant output value coming + from within the nullable side of an outer join to not be replaced by + NULL when it should be. + + + + + + + Add missed checks for hashability of equality comparisons on + container datatypes (arrays, composites, ranges) (Andrei Lepikhov, + Tom Lane) + § + + + + The planner must verify hashability of the container's component + type(s) before deciding it can use a hash-based plan type. This + step was missed in some places, leading to could not identify + a hash function failures at execution. + + + + + + + Fix mis-optimization of COUNT window functions + that have an EXCLUDE clause or + lack ORDER BY (Chengpeng Yan, David Rowley) + § + + + + These window functions were treated as monotonic when they should + not be, allowing wrong answers to be computed. + + + + + + + Fix ALTER COLUMN ... DROP EXPRESSION to work when + there are multiple levels of partitions (Alberto Piai) + § + + + + + + + Fix attaching partitions of indexes that are exclusion constraints + (Japin Li) + § + + + + Notably, this oversight broke dump/restore of partitioned exclusion + constraints. + + + + + + + Disallow renaming a rule to _RETURN (Tom Lane) + § + + + + That name is reserved for a view's ON SELECT + rule, but ALTER RULE allowed renaming other rules + to _RETURN, causing trouble later. + + + + + + + Fix missing lock release for role membership grants in DROP + OWNED BY (Jeff Davis) + § + + + + This oversight resulted in a warning message, followed by retaining + a lock on the membership grant until the end of the transaction. + + + + + + + Fix failure of EXPLAIN when + deparsing SQL/JSON aggregates (Richard Guo) + § + + + + Some plan structures resulted in invalid + JsonConstructorExpr underlying node type errors. + + + + + + + Fix use of REINDEX CONCURRENTLY with + a deferred uniqueness constraint (Nitin Motiani) + § + + + + The transient index copy created during REINDEX + CONCURRENTLY was incorrectly marked as enforcing immediate + uniqueness, causing spurious reports of constraint violation. + + + + + + + Fix matching of localized month/day names + in to_date() (Heikki Linnakangas) + § + + + + The matching logic misbehaved in cases where case-folding changes + the byte length of the string. + + + + + + + Fix incorrect NFC recomposition for Hangul U+11A7 (TBASE) + (Diego Frias, Michael Paquier) + § + + + + This character was treated as a valid T syllable, which it is not, + and hence silently swallowed during normalization. + + + + + + + Avoid possible truncation of output lexemes in case-insensitive + synonym dictionaries (Jeff Davis) + § + + + + If folding to lower case increased the byte length of a lexeme, it + was incorrectly truncated to its original byte length when emitted. + + + + + + + Defend against truncated UTF-8 characters in case-conversion logic + (Jeff Davis) + § + + + + + + + Fix typo in hash_record_extended() (Man Zeng) + § + + + + The code failed to initialize the second isnull argument passed to + FunctionCallInvoke(). This is harmless for existing in-core + extended hash support functions, which will not examine that value. + However, extension-provided hash functions could be affected if they + inspect PG_ARGISNULL(1). + + + + + + + Fix pg_get_publication_tables() to not fail if + a publishable table is dropped concurrently (Bharath Rupireddy) + § + + + + + + + Prevent satisfies_hash_partition() from + crashing with VARIADIC NULL (Robert Haas) + § + + + + + + + Report invalid-weight errors more cleanly and consistently + in tsvector_filter() and allied functions + (Ewan Young) + § + + + + In particular, report weight characters that are not printable ASCII + in octal form (\nnn), + as charout() would render them. This avoids + possibly producing an invalidly-encoded error message. + + + + + + + Fix mishandling of namespace nodes in xpath() + (Michael Paquier) + § + § + + + + This fix avoids an unexpected could not copy node + error. + + + + + + + Fix jsonpath's .decimal method to + not throw a hard error for incorrect precision or scale (Ewan Young) + § + § + + + + Silent mode should suppress these errors, but failed to. + + + + + + + Fix NULL-pointer crash when IS JSON or similar + constructs have an argument that is of string category but lacks a + cast to type text (Ayush Tiwari) + § + + + + There are no such data types in + core PostgreSQL, but the problem is + reachable with some extension types. + + + + + + + Ensure that SQL/JSON ON EMPTY / ON ERROR + DEFAULT values are coerced to the correct typmod (Ewan Young) + § + + + + For example, the declared precision and scale of + a numeric target column were not applied to the default + value. + + + + + + + Avoid machine-dependent behavior when dividing the smallest + possible money value by -1 (Andrey Rachitskiy) + § + + + + + + + Fix crash after out-of-memory failure partway through creation of a + cache entry for a text search dictionary (Tom Lane) + § + + + + + + + Fix memory-safety bugs in processing of incorrect ispell/hunspell + dictionary files (Andrey Rachitskiy) + § + + + + + + + Prevent access to other sessions' temporary tables (Jim Jones, + Daniil Davydov, Alexander Korotkov) + § + § + + + + Some code paths failed to prevent this, leading to silently wrong + (inconsistent) results. + + + + + + + Fix the order in which autovacuum processes databases + (Rustam Khamidullin) + § + + + + It was unintentionally processing databases from lowest to highest + score, when it should be doing the reverse. + + + + + + + Fix memory leak in parallel vacuum worker processes (Baji Shaik) + § + + + + Progress reports from a parallel worker leaked about 1kB per report, + with the waste accumulating for the life of the worker process. + + + + + + + Honor query cancel and vacuum delay during GIN index posting-tree + cleanup (Paul Kim, Alexander Korotkov) + § + + + + The posting tree for a common value can be large, so that this + missed check could allow vacuum to run for a long time before + noticing an interrupt. + + + + + + + Fix possible mis-decoding of index tuples during GiST and SP-GiST + index-only scans (Peter Geoghegan) + § + + + + This error could lead to emitting corrupted data from an index-only + scan plan. The only affected core opclass is GiST's range_ops, and + it could only fail if the range column were not the first index + column. + + + + + + + Ensure that the new last block of a bulk-extended table is added to + its free space map promptly (Jingtang Zhang) + § + + + + An off-by-one error caused the last block of a multi-block table + extension to not be marked as free in the map. This would + eventually get corrected by vacuum, but meanwhile the space wouldn't + be used. + + + + + + + Avoid possible double-free or infinite error recovery loop in + resource cleanup during transaction abort (Tom Lane) + § + + + + + + + When creating directories, tolerate concurrent creation of the same + directory (Andrew Dunstan, Tom Lane) + § + + + + + + + Prevent creation of dangling object dependencies by acquiring a + shared lock on any object being depended on (Bertrand Drouvot) + § + § + + + + The shared lock will conflict with any attempt to drop the + depended-on object, eliminating the race condition that formerly + existed. For example, if one session drops a schema (that appears + empty to it) concurrently with some other session creating a + function in that schema, previously both transactions could commit, + leaving an invalid function definition behind. Now, one transaction + or the other will fail. + + + + + + + Fix race condition in conflict detection + for SERIALIZABLE isolation mode + (Peter Geoghegan) + § + + + + A conflict could be missed when examining an initially-empty btree + index, allowing failure of serializability due to improperly + allowing conflicting transactions to commit. + + + + + + + Fix race condition in ProcSignalBarrier code (Masahiko Sawada) + § + + + + This error could result in processes getting stuck, typically after + reporting still waiting for backend with + PID nnnn to accept + ProcSignalBarrier. + + + + + + + Fix race conditions when a set of processes that belong to the same + lock group exit at the same time (Vlad Lesin) + § + § + + + + These errors could lead to PANIC aborts, with messages such + as latch already owned. The issue does not normally + arise in regular parallel query, since the leader won't exit before + seeing its workers finish; but some extensions reach the problem. + + + + + + + Fix WAL logging of operations that clear bits in tables' visibility + maps (Melanie Plageman, Andres Freund) + § + § + § + + + + Such VM changes were missed by the WAL summarizer, potentially + leading to incorrect incremental backups. We also failed to log + full-page images of such VM pages when needed, potentially allowing + torn page writes to go uncorrected. This could lead to misbehavior + later, such as wrong results from index-only scans. + + + + + + + Prevent WAL summarizer process from getting stuck at a timeline + switch (Robert Haas) + § + § + + + + + + + Fix race with timeline selection in logical decoding during standby + promotion (Bertrand Drouvot) + § + § + + + + Logical decoding being performed on the standby could fail with + a requested WAL segment has already been removed + error. A repeat attempt would succeed, so there was no permanent + problem but there was an availability hazard. + + + + + + + Avoid exposing a WAL receiver's full connection string during timeline + jumps (Chao Li) + § + + + + The pg_stat_wal_receiver view should show a + sanitized version of the connection string, without sensitive data. + But it transiently showed the full string when we re-use an existing + WAL receiver. + + + + + + + Use run-time checks, not just Asserts, to verify the correct number + of columns in tuples received during logical replication (Varik + Matevosyan) + § + + + + A malicious or buggy publisher could send inconsistent numbers of + columns. While we could not find a scenario in which this would + have serious ill effects, extra caution seems warranted. + + + + + + + Clean up quoting of string parameters within constructed replication + commands (Tom Lane) + § + + + + Various places that generate replication commands were not being + adequately careful about quoting replication slot names and other + parameters that need to be inserted into those commands. This could + result in unexpected syntax errors in those commands. In principle, + a crafted replication slot name could result in SQL injection; but + such a scenario seems very unlikely to occur in practice, since + replication operations can only be invoked by highly-privileged + users and there is no reason for them to use a slot name coming from + an untrustworthy source. + + + + + + + Fix logical decoding of empty prepared transactions (Masahiko Sawada) + § + + + + A prepared transaction that did not cause any decodable updates could + result in sending COMMIT/ROLLBACK PREPARED to the + output plugin with no preceding PREPARE. For the + built-in subscriber this breaks replication, and other plugins will + probably not like it either. + + + + + + + Fix corruption of unlogged sequences after standby promotion + (Fujii Masao) + § + + + + Previously, if an unlogged sequence was created on the primary and + replicated to a standby, accessing the sequence after promoting the + standby could fail with bad magic number in sequence + or related errors. + + + + + + + Fix cascading standby reconnect failure after archive fallback + (Marco Nenciarini) + § + + + + A cascading standby could fail to reconnect to its upstream standby + with requested starting point ... is ahead of the WAL flush + position after falling back to archive recovery. + + + + + + + Do not try to clear + pg_database.dathasloginevt + locally on a standby server (Ayush Tiwari) + § + + + + Event trigger cleanup tried to perform that action on standby + servers as well as the primary. That can't work on a standby, + and there's no need anyway since replay of the primary's database + change will soon fix it. + + + + + + + Avoid race condition while dropping obsolete replication slots + (Xuneng Zhou) + § + + + + An incorrect unlock and log message could occur if another session + immediately re-used the dropped slot's shared-memory entry. + + + + + + + Avoid race condition while dropping ephemeral replication slots + (Zhijie Hou) + § + + + + The slot-releasing code performed some additional updates to the + replication slot's shared-memory entry after releasing the slot. + This is unsafe since another session could immediately re-use the + dropped slot's shared-memory entry. Skip those updates in the case + of an ephemeral slot. + + + + + + + Fix stale progress reports during logical replication table + synchronization (Shinya Kato) + § + + + + Previously, the pg_stat_progress_copy view + in the subscriber would continue to show the + initial COPY operation as active even after the + data copy had finished. The stale entry remained visible until + synchronization caught up with the publisher. + + + + + + + Clear base backup progress on backup failure (Chao Li) + § + § + + + + Previously the pg_stat_progress_basebackup + view would continue to show a stale progress entry after a failure, + until the replication client + disconnected. pg_basebackup normally + disconnects immediately, but other clients might not. + + + + + + + Fix possible PANIC due to concurrent drop of pgstats entries + when track_functions is enabled (Sami Imseih, + Michael Paquier) + § + § + § + + + + + + + Clean up broken local pgstats entry after failing to obtain space for + the corresponding shared hashtable entry (Niall Newman) + § + + + + Failure to do this led to a null-pointer dereference the next time + the local entry was used. + + + + + + + In PL/Perl, avoid NULL pointer + dereference crash when working with an + invalid PostgreSQL::InServer::ARRAY object (Xing Guo) + § + + + + + + + In PL/Python, properly check for errors + when working with sequence and mapping objects (Richard Guo) + § + + + + Previously, a broken object or an unhandled exception could result + in a NULL pointer dereference crash. + + + + + + + In libpq, always drain all pending bytes + from the SSL or GSS decryption buffer + during pqReadData() (Jacob Champion) + § + § + § + § + + + + This avoids edge cases where libpq or its + calling application waits for more data to arrive on the socket, but + actually all the data has already arrived. + + + + + + + Allow libpq to accept + ParameterDescription messages exceeding 30000 bytes (Ning Sun) + § + + + + Previously, this message type was not among those + that libpq's validity heuristics believed + could be long. The limit resulted in failure for prepared queries + having more than 7498 parameters, which is unlikely but supported. + + + + + + + Reject multiple descriptor header items + in ecpg's GET/SET + DESCRIPTOR statements (Masashi Kamura) + § + + + + Previously the grammar allowed this syntax, but broken C code was + generated. Adjust the grammar and the documentation to allow only + one header item. + + + + + + + Make line widths match in psql's expanded + aligned output format (Pavel Stehule) + § + + + + When the table's data rows are narrower than the record header lines, + widen the data rows to match the headers, avoiding unsightly output. + + + + + + + Fix psql's privilege check for showing + database size in \l+ (Christoph Berg) + § + + + + The underlying server function permits users who + have pg_read_all_stats privileges to see the + sizes of all databases, even if they lack CONNECT + privilege. But psql was unaware of that + provision and would not call the function unless the user + has CONNECT privilege. + + + + + + + Fix psql's tab completion + for \df to consider procedures too + (Erik Wienhold) + § + + + + + + + Fix thread-safety bug in pgbench + (Fujii Masao) + § + + + + When pgbench runs with multiple threads + and the option, different threads + could attempt to use the same buffer to construct error messages, + leading to corrupted log output. + + + + + + + In pg_combinebackup, prevent infinite + loop if the source file is shorter than expected (Peter Eisentraut) + § + + + + + + + Fix cleanup of publisher-side objects after errors + in pg_createsubscriber (Nisha Moond) + § + + + + When pg_createsubscriber fails after + creating logical replication objects, it should remove the + publication and replication slot that it created on the publisher. + Some error cases failed to do so. + + + + + + + Use the source cluster's group-read file permissions + for pg_recvlogical output files + (Fujii Masao) + § + + + + pg_recvlogical was documented to behave + this way, but it never actually enabled group-read. + + + + + + + In contrib/amcheck, handle short-header varlena + datums correctly (Andrey Borodin) + § + + + + This error could result in doing excess work while verifying a btree + index, but seems not to have had any worse consequences. + + + + + + + In contrib/btree_gist, + fix NaN handling in the float4 + and float8 opclasses (Bill Kim, Tom Lane) + § + + + + Comparisons, as well as the GiST penalty and distance functions, did + not account for NaN and would give the wrong + answer when handed one. It is recommended to + reindex btree_gist indexes on float columns + after installing this update, if there is any possibility that there + are NaN entries in those columns. + + + + + + + In contrib/btree_gist, fix searches using a + not-equal operator (Ayush Tiwari) + § + + + + For variable-length data types, the code for scanning non-leaf index + pages applied the wrong comparison function, leading to wrong + results and potentially crashes. + + + + + + + Fix unguarded recursion and loops in + contrib/hstore_plperl, + contrib/jsonb_plperl, and + contrib/jsonb_plpython + (Aleksander Alekseev) + § + § + + + + Prevent stack overflow when dealing with deeply + nested jsonb values, and allow interruption of the infinite + loop caused when attempting to dereference circular chains of Perl + object references. + + + + + + + Fix missed release of statistics catcache entry + in contrib/intarray (Man Zeng) + § + + + + This oversight led to warnings like resource was not closed: + cache pg_statistic. + + + + + + + In contrib/ltree, fix integer overflow in + comparisons (Ayush Tiwari) + § + + + + ltree values containing more than about 14,653 labels + resulted in wrong comparison answers due to overflow. If a btree + index contains such values, it is probably corrupt and should be + reindexed after installing this update. + + + + + + + In contrib/pgcrypto, avoid double-free crash + after encountering an error while using an OSSLCipher object + (Yuelin Wang) + § + + + + + + + Fix array overrun in contrib/pg_surgery's + heap_force_kill and + heap_force_freeze functions (Michael Paquier) + § + + + + Attempting to change a TID whose offset number equals + MaxHeapTuplesPerPage wrote one byte past the end of the allocated + array, potentially crashing the server. + + + + + + + In contrib/pg_surgery, avoid infinite loop with + TID arrays having more than 64K elements (Andrey Rachitskiy) + § + + + + + + + Avoid NULL-pointer dereference + in contrib/refint's + check_foreign_key() (Ayush Tiwari) + § + + + + In the on-update-cascade case, a null value of a referenced column + led to a crash. This is an oversight in the fix for CVE-2026-6637, + but the code that was there before that wasn't really right either. + + + + + + + Fix contrib/seg to print segments + with ~ certainty indicators correctly + (Ewan Young) + § + + + + Due to a typo, seg_out() did not print + a ~ certainty indicator attached to a segment's + upper boundary. Worse, if the lower boundary + had ~ while the upper boundary had no indicator, + the upper boundary was not printed at all, incorrectly converting + the value into an open interval. + + + + + + + Fix crash with namespace nodes in contrib/xml2's + xpath_nodeset() function (Andrey Chernyy, + Michael Paquier) + § + + + + + + + Support building PostgreSQL with + OpenSSL 4 (Daniel Gustafsson) + § + + + + + + + Update time zone data files to tzdata + release 2026c (Tom Lane) + § + + + + Alberta (America/Edmonton) will be on year-round UTC-06 + (effectively, permanent DST) beginning in November 2026. This + release assumes that their TZ abbreviation will + be CST from that time forward. That seems likely + to change, but it's unclear what new abbreviation will be used. + + + + Morocco (Africa/Casablanca) will move to permanent UTC+00, + without daylight saving time transitions, on 2026-09-20. + + + + + + + + Release 17.10 @@ -347,7 +3300,7 @@ Use timingsafe_bcmp() instead - of memcpy() or strcmp() + of memcmp() or strcmp() when checking passwords, hashes, etc. It is not known whether the data dependency of those functions is usefully exploitable in any of these places, but in the interests of safety, replace them. diff -Nru postgresql-17-17.10/doc/src/sgml/rules.sgml postgresql-17-17.11/doc/src/sgml/rules.sgml --- postgresql-17-17.10/doc/src/sgml/rules.sgml 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/rules.sgml 2026-08-10 20:54:09.000000000 +0000 @@ -630,7 +630,7 @@ 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 -Nru postgresql-17-17.10/doc/src/sgml/stylesheet-speedup-xhtml.xsl postgresql-17-17.11/doc/src/sgml/stylesheet-speedup-xhtml.xsl --- postgresql-17-17.10/doc/src/sgml/stylesheet-speedup-xhtml.xsl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/doc/src/sgml/stylesheet-speedup-xhtml.xsl 2026-08-10 20:54:09.000000000 +0000 @@ -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()]"/> SizeOfHeapHeader && newlen <= MaxHeapTupleSize); @@ -9824,7 +10148,8 @@ */ 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) && @@ -9833,27 +10158,26 @@ /* * 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; @@ -9861,7 +10185,7 @@ 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); @@ -9956,6 +10280,8 @@ Buffer obuffer, nbuffer; Page page; + bool new_cleared, + old_cleared; OffsetNumber offnum; ItemId lp = NULL; HeapTupleData oldtup; @@ -9978,8 +10304,10 @@ 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); @@ -9993,14 +10321,95 @@ * 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); } @@ -10008,14 +10417,17 @@ * 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) { @@ -10048,7 +10460,7 @@ /* 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); @@ -10065,28 +10477,14 @@ } 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) @@ -10096,7 +10494,8 @@ 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); @@ -10183,7 +10582,7 @@ 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 */ @@ -10269,22 +10668,18 @@ */ 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); @@ -10342,22 +10737,18 @@ */ 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 -Nru postgresql-17-17.10/src/backend/access/heap/hio.c postgresql-17-17.11/src/backend/access/heap/hio.c --- postgresql-17-17.10/src/backend/access/heap/hio.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/access/heap/hio.c 2026-08-10 20:54:09.000000000 +0000 @@ -403,7 +403,7 @@ { 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 -Nru postgresql-17-17.10/src/backend/access/heap/pruneheap.c postgresql-17-17.11/src/backend/access/heap/pruneheap.c --- postgresql-17-17.10/src/backend/access/heap/pruneheap.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/access/heap/pruneheap.c 2026-08-10 20:54:09.000000000 +0000 @@ -1848,14 +1848,14 @@ 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 -Nru postgresql-17-17.10/src/backend/access/heap/visibilitymap.c postgresql-17-17.11/src/backend/access/heap/visibilitymap.c --- postgresql-17-17.10/src/backend/access/heap/visibilitymap.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/access/heap/visibilitymap.c 2026-08-10 20:54:09.000000000 +0000 @@ -135,10 +135,39 @@ * 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); int mapOffset = HEAPBLK_TO_OFFSET(heapBlk); @@ -157,7 +186,8 @@ if (!BufferIsValid(vmbuf) || BufferGetBlockNumber(vmbuf) != mapBlock) elog(ERROR, "wrong buffer passed to visibilitymap_clear"); - LockBuffer(vmbuf, BUFFER_LOCK_EXCLUSIVE); + Assert(BufferIsLocal(vmbuf) || BufferIsExclusiveLocked(vmbuf)); + map = PageGetContents(BufferGetPage(vmbuf)); if (map[mapByte] & mask) @@ -168,8 +198,6 @@ cleared = true; } - LockBuffer(vmbuf, BUFFER_LOCK_UNLOCK); - return cleared; } diff -Nru postgresql-17-17.10/src/backend/access/nbtree/nbtsearch.c postgresql-17-17.11/src/backend/access/nbtree/nbtsearch.c --- postgresql-17-17.10/src/backend/access/nbtree/nbtsearch.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/access/nbtree/nbtsearch.c 2026-08-10 20:54:09.000000000 +0000 @@ -2590,12 +2590,20 @@ if (!BufferIsValid(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); - BTScanPosInvalidate(so->currPos); - return false; + if (IsolationIsSerializable()) + { + PredicateLockRelation(rel, scan->xs_snapshot); + buf = _bt_get_endpoint(rel, 0, ScanDirectionIsBackward(dir)); + } + + if (!BufferIsValid(buf)) + { + BTScanPosInvalidate(so->currPos); + return false; + } } PredicateLockPage(rel, BufferGetBlockNumber(buf), scan->xs_snapshot); diff -Nru postgresql-17-17.10/src/backend/access/transam/multixact.c postgresql-17-17.11/src/backend/access/transam/multixact.c --- postgresql-17-17.10/src/backend/access/transam/multixact.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/access/transam/multixact.c 2026-08-10 20:54:09.000000000 +0000 @@ -1260,14 +1260,14 @@ 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."))); } /* @@ -1291,7 +1291,7 @@ 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", @@ -1300,7 +1300,7 @@ 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 */ @@ -2647,7 +2647,7 @@ 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", @@ -2656,7 +2656,7 @@ 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 -Nru postgresql-17-17.10/src/backend/access/transam/xlog.c postgresql-17-17.11/src/backend/access/transam/xlog.c --- postgresql-17-17.10/src/backend/access/transam/xlog.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/access/transam/xlog.c 2026-08-10 20:54:09.000000000 +0000 @@ -1103,9 +1103,9 @@ * * 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) { diff -Nru postgresql-17-17.10/src/backend/access/transam/xlogutils.c postgresql-17-17.11/src/backend/access/transam/xlogutils.c --- postgresql-17-17.10/src/backend/access/transam/xlogutils.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/access/transam/xlogutils.c 2026-08-10 20:54:09.000000000 +0000 @@ -333,6 +333,28 @@ } /* + * 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. * @@ -409,7 +431,9 @@ * 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); @@ -905,7 +929,19 @@ 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 -Nru postgresql-17-17.10/src/backend/backup/basebackup.c postgresql-17-17.11/src/backend/backup/basebackup.c --- postgresql-17-17.10/src/backend/backup/basebackup.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/backup/basebackup.c 2026-08-10 20:54:09.000000000 +0000 @@ -672,8 +672,6 @@ /* clean up the resource owner we created */ WalSndResourceCleanup(true); - - basebackup_progress_done(); } /* diff -Nru postgresql-17-17.10/src/backend/backup/basebackup_progress.c postgresql-17-17.11/src/backend/backup/basebackup_progress.c --- postgresql-17-17.10/src/backend/backup/basebackup_progress.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/backup/basebackup_progress.c 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ .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 }; /* @@ -180,6 +181,16 @@ } /* + * 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. */ void @@ -234,6 +245,9 @@ /* * 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 -Nru postgresql-17-17.10/src/backend/backup/basebackup_server.c postgresql-17-17.11/src/backend/backup/basebackup_server.c --- postgresql-17-17.10/src/backend/backup/basebackup_server.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/backup/basebackup_server.c 2026-08-10 20:54:09.000000000 +0000 @@ -176,9 +176,9 @@ /* 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 @@ /* 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 -Nru postgresql-17-17.10/src/backend/catalog/dependency.c postgresql-17-17.11/src/backend/catalog/dependency.c --- postgresql-17-17.10/src/backend/catalog/dependency.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/dependency.c 2026-08-10 20:54:09.000000000 +0000 @@ -1529,6 +1529,9 @@ { 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 @@ 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 -Nru postgresql-17-17.10/src/backend/catalog/heap.c postgresql-17-17.11/src/backend/catalog/heap.c --- postgresql-17-17.10/src/backend/catalog/heap.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/heap.c 2026-08-10 20:54:09.000000000 +0000 @@ -854,6 +854,9 @@ /* add dependencies on their datatypes and collations */ for (int i = 0; i < natts; i++) { + if (tupdesc->attrs[i].attisdropped) + continue; + /* Add dependency info */ ObjectAddressSubSet(myself, RelationRelationId, new_rel_oid, i + 1); ObjectAddressSet(referenced, TypeRelationId, @@ -2139,6 +2142,9 @@ * 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, @@ -2399,6 +2405,13 @@ 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, false); @@ -2438,6 +2451,14 @@ */ 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 { @@ -3492,12 +3513,16 @@ * 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 -Nru postgresql-17-17.10/src/backend/catalog/index.c postgresql-17-17.11/src/backend/catalog/index.c --- postgresql-17-17.10/src/backend/catalog/index.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/index.c 2026-08-10 20:54:09.000000000 +0000 @@ -712,6 +712,10 @@ * 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 @@ -719,6 +723,9 @@ * 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, @@ -1044,7 +1051,8 @@ 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); @@ -1315,6 +1323,8 @@ 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); @@ -1334,6 +1344,13 @@ 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); @@ -1455,8 +1472,8 @@ 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); @@ -2619,9 +2636,21 @@ 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 -Nru postgresql-17-17.10/src/backend/catalog/namespace.c postgresql-17-17.11/src/backend/catalog/namespace.c --- postgresql-17-17.10/src/backend/catalog/namespace.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/namespace.c 2026-08-10 20:54:09.000000000 +0000 @@ -1592,7 +1592,7 @@ 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 @@ 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 -Nru postgresql-17-17.10/src/backend/catalog/objectaddress.c postgresql-17-17.11/src/backend/catalog/objectaddress.c --- postgresql-17-17.10/src/backend/catalog/objectaddress.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/objectaddress.c 2026-08-10 20:54:09.000000000 +0000 @@ -5502,7 +5502,7 @@ 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 -Nru postgresql-17-17.10/src/backend/catalog/pg_attrdef.c postgresql-17-17.11/src/backend/catalog/pg_attrdef.c --- postgresql-17-17.10/src/backend/catalog/pg_attrdef.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/pg_attrdef.c 2026-08-10 20:54:09.000000000 +0000 @@ -41,6 +41,9 @@ * for this is that the missing value must never be updated after it is set, * which can only be when a column is added to the table. Otherwise we would * in effect be changing existing tuples. + * + * NB: Caller is responsible for ensuring the user has USAGE on all types expr + * depends on. */ Oid StoreAttrDefault(Relation rel, AttrNumber attnum, diff -Nru postgresql-17-17.10/src/backend/catalog/pg_constraint.c postgresql-17-17.11/src/backend/catalog/pg_constraint.c --- postgresql-17-17.10/src/backend/catalog/pg_constraint.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/pg_constraint.c 2026-08-10 20:54:09.000000000 +0000 @@ -43,6 +43,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 -Nru postgresql-17-17.10/src/backend/catalog/pg_depend.c postgresql-17-17.11/src/backend/catalog/pg_depend.c --- postgresql-17-17.10/src/backend/catalog/pg_depend.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/pg_depend.c 2026-08-10 20:54:09.000000000 +0000 @@ -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/syscache.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 @@ 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 @@ 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. */ @@ -715,6 +733,119 @@ /* + * 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 -Nru postgresql-17-17.10/src/backend/catalog/pg_proc.c postgresql-17-17.11/src/backend/catalog/pg_proc.c --- postgresql-17-17.10/src/backend/catalog/pg_proc.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/pg_proc.c 2026-08-10 20:54:09.000000000 +0000 @@ -642,12 +642,18 @@ /* 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 -Nru postgresql-17-17.10/src/backend/catalog/pg_publication.c postgresql-17-17.11/src/backend/catalog/pg_publication.c --- postgresql-17-17.10/src/backend/catalog/pg_publication.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/pg_publication.c 2026-08-10 20:54:09.000000000 +0000 @@ -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" @@ -446,9 +447,12 @@ /* 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 */ for (int i = 0; i < natts; i++) @@ -1052,14 +1056,27 @@ 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, @@ -1158,26 +1175,47 @@ PG_NODE_TREEOID, -1, 0); funcctx->tuple_desc = BlessTupleDesc(tupdesc); - funcctx->user_fctx = (void *) 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. */ @@ -1191,6 +1229,7 @@ * 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), @@ -1220,7 +1259,6 @@ /* 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); @@ -1243,10 +1281,10 @@ 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 -Nru postgresql-17-17.10/src/backend/catalog/pg_type.c postgresql-17-17.11/src/backend/catalog/pg_type.c --- postgresql-17-17.10/src/backend/catalog/pg_type.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/catalog/pg_type.c 2026-08-10 20:54:09.000000000 +0000 @@ -189,6 +189,9 @@ * 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 @@ * 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 -Nru postgresql-17-17.10/src/backend/commands/event_trigger.c postgresql-17-17.11/src/backend/commands/event_trigger.c --- postgresql-17-17.10/src/backend/commands/event_trigger.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/event_trigger.c 2026-08-10 20:54:09.000000000 +0000 @@ -935,8 +935,16 @@ * 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 -Nru postgresql-17-17.10/src/backend/commands/indexcmds.c postgresql-17-17.11/src/backend/commands/indexcmds.c --- postgresql-17-17.10/src/backend/commands/indexcmds.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/indexcmds.c 2026-08-10 20:54:09.000000000 +0000 @@ -929,6 +929,22 @@ 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. */ if (stmt->primary) @@ -3996,6 +4012,8 @@ CommitTransactionCommand(); } + INJECTION_POINT("reindex-conc-index-built"); + StartTransactionCommand(); /* diff -Nru postgresql-17-17.10/src/backend/commands/policy.c postgresql-17-17.11/src/backend/commands/policy.c --- postgresql-17-17.10/src/backend/commands/policy.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/policy.c 2026-08-10 20:54:09.000000000 +0000 @@ -724,9 +724,12 @@ 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 @@ 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 -Nru postgresql-17-17.10/src/backend/commands/sequence.c postgresql-17-17.11/src/backend/commands/sequence.c --- postgresql-17-17.10/src/backend/commands/sequence.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/sequence.c 2026-08-10 20:54:09.000000000 +0000 @@ -1875,6 +1875,7 @@ memcpy(page, localpage, BufferGetPageSize(buffer)); MarkBufferDirty(buffer); + XLogFlushBufferForRedoIfInit(record, 0, buffer); UnlockReleaseBuffer(buffer); pfree(localpage); diff -Nru postgresql-17-17.10/src/backend/commands/statscmds.c postgresql-17-17.11/src/backend/commands/statscmds.c --- postgresql-17-17.10/src/backend/commands/statscmds.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/statscmds.c 2026-08-10 20:54:09.000000000 +0000 @@ -57,9 +57,15 @@ /* * 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 @@ 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 @@ 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 @@ 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 @@ * 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 @@ 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 @@ } Assert(rel); - relid = RelationGetRelid(rel); /* * If the node has a name, split it up and determine creation namespace. @@ -582,11 +578,16 @@ * 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 -Nru postgresql-17-17.10/src/backend/commands/subscriptioncmds.c postgresql-17-17.11/src/backend/commands/subscriptioncmds.c --- postgresql-17-17.10/src/backend/commands/subscriptioncmds.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/subscriptioncmds.c 2026-08-10 20:54:09.000000000 +0000 @@ -480,6 +480,32 @@ } /* + * 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. */ static void @@ -1850,7 +1876,9 @@ 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 -Nru postgresql-17-17.10/src/backend/commands/tablecmds.c postgresql-17-17.11/src/backend/commands/tablecmds.c --- postgresql-17-17.10/src/backend/commands/tablecmds.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/tablecmds.c 2026-08-10 20:54:09.000000000 +0000 @@ -205,6 +205,7 @@ 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 */ @@ -588,7 +589,7 @@ 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, @@ -895,6 +896,14 @@ &old_constraints); /* + * 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 not-null constraints, but not * default values or CHECK constraints; we handle those below. @@ -5337,7 +5346,7 @@ 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); @@ -7996,7 +8005,14 @@ { 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 @@ -8473,17 +8489,12 @@ 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"))); @@ -9249,7 +9260,11 @@ /* 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; } @@ -13821,11 +13836,25 @@ { /* 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); } } @@ -13843,6 +13872,7 @@ ObjectAddresses *objects; ListCell *def_item; ListCell *oid_item; + ListCell *owner_item; /* * Collect all the constraints and indexes to drop so we can process them @@ -13915,7 +13945,7 @@ if (relid != tab->relid) LockRelationOid(relid, AccessExclusiveLock); - ATPostAlterTypeParse(oldId, relid, confrelid, + ATPostAlterTypeParse(oldId, relid, confrelid, InvalidOid, (char *) lfirst(def_item), wqueue, lockmode, tab->rewrite); } @@ -13934,7 +13964,7 @@ if (relid != tab->relid) LockRelationOid(relid, AccessExclusiveLock); - ATPostAlterTypeParse(oldId, relid, InvalidOid, + ATPostAlterTypeParse(oldId, relid, InvalidOid, InvalidOid, (char *) lfirst(def_item), wqueue, lockmode, tab->rewrite); @@ -13943,8 +13973,9 @@ } /* 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; @@ -13964,7 +13995,7 @@ 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); @@ -14028,8 +14059,9 @@ * 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; @@ -14069,10 +14101,14 @@ 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); } @@ -16500,6 +16536,7 @@ ObjectAddress tableobj, typeobj; HeapTuple classtuple; + AclResult aclresult; /* Validate the type. */ typetuple = typenameType(NULL, ofTypename, NULL); @@ -16507,6 +16544,10 @@ 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 -Nru postgresql-17-17.10/src/backend/commands/trigger.c postgresql-17-17.11/src/backend/commands/trigger.c --- postgresql-17-17.10/src/backend/commands/trigger.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/trigger.c 2026-08-10 20:54:09.000000000 +0000 @@ -1126,8 +1126,13 @@ * 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 -Nru postgresql-17-17.10/src/backend/commands/typecmds.c postgresql-17-17.11/src/backend/commands/typecmds.c --- postgresql-17-17.10/src/backend/commands/typecmds.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/typecmds.c 2026-08-10 20:54:09.000000000 +0000 @@ -133,7 +133,8 @@ 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, @@ -1014,6 +1015,13 @@ } } + /* + * 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(); @@ -1111,7 +1119,7 @@ case CONSTR_CHECK: domainAddCheckConstraint(address.objectId, domainNamespace, basetypeoid, basetypeMod, - constr, domainName, NULL); + constr, domainName, NULL, false); break; case CONSTR_NOTNULL: @@ -1480,6 +1488,10 @@ 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); @@ -2647,6 +2659,12 @@ 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 * easier for pg_dump). @@ -2902,7 +2920,7 @@ */ ObjectAddress AlterDomainAddConstraint(List *names, Node *newConstraint, - ObjectAddress *constrAddr) + ObjectAddress *constrAddr, bool is_readd) { TypeName *typename; Oid domainoid; @@ -2989,7 +3007,8 @@ ccbin = domainAddCheckConstraint(domainoid, typTup->typnamespace, typTup->typbasetype, typTup->typtypmod, - constr, NameStr(typTup->typname), constrAddr); + constr, NameStr(typTup->typname), constrAddr, + is_readd); /* @@ -3516,7 +3535,8 @@ 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; @@ -3580,6 +3600,13 @@ 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 -Nru postgresql-17-17.10/src/backend/commands/vacuum.c postgresql-17-17.11/src/backend/commands/vacuum.c --- postgresql-17-17.10/src/backend/commands/vacuum.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/commands/vacuum.c 2026-08-10 20:54:09.000000000 +0000 @@ -1155,7 +1155,7 @@ 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 -Nru postgresql-17-17.10/src/backend/executor/execExprInterp.c postgresql-17-17.11/src/backend/executor/execExprInterp.c --- postgresql-17-17.10/src/backend/executor/execExprInterp.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/executor/execExprInterp.c 2026-08-10 20:54:09.000000000 +0000 @@ -170,24 +170,24 @@ static Datum ExecJustAssignScanVarVirt(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); /* @@ -2154,7 +2154,7 @@ */ /* 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]; @@ -2192,7 +2192,7 @@ } /* 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]; @@ -2287,7 +2287,7 @@ } /* 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]; @@ -2330,7 +2330,7 @@ } /* 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]; @@ -3549,7 +3549,7 @@ * 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) @@ -5304,7 +5304,7 @@ } /* 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) @@ -5336,7 +5336,7 @@ } /* 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 -Nru postgresql-17-17.10/src/backend/executor/execTuples.c postgresql-17-17.11/src/backend/executor/execTuples.c --- postgresql-17-17.10/src/backend/executor/execTuples.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/executor/execTuples.c 2026-08-10 20:54:09.000000000 +0000 @@ -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, @@ -1004,7 +1004,7 @@ * 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 -Nru postgresql-17-17.10/src/backend/executor/nodeAppend.c postgresql-17-17.11/src/backend/executor/nodeAppend.c --- postgresql-17-17.10/src/backend/executor/nodeAppend.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/executor/nodeAppend.c 2026-08-10 20:54:09.000000000 +0000 @@ -92,6 +92,7 @@ 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); /* ---------------------------------------------------------------- @@ -408,6 +409,10 @@ 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 @@ -443,25 +448,6 @@ 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; @@ -1118,6 +1104,79 @@ } /* ---------------------------------------------------------------- + * 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 * * Receive a response from an asynchronous request we made. diff -Nru postgresql-17-17.10/src/backend/executor/nodeHashjoin.c postgresql-17-17.11/src/backend/executor/nodeHashjoin.c --- postgresql-17-17.10/src/backend/executor/nodeHashjoin.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/executor/nodeHashjoin.c 2026-08-10 20:54:09.000000000 +0000 @@ -216,7 +216,7 @@ * 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 -Nru postgresql-17-17.10/src/backend/executor/nodeIndexonlyscan.c postgresql-17-17.11/src/backend/executor/nodeIndexonlyscan.c --- postgresql-17-17.10/src/backend/executor/nodeIndexonlyscan.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/executor/nodeIndexonlyscan.c 2026-08-10 20:54:09.000000000 +0000 @@ -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); /* ---------------------------------------------------------------- @@ -189,27 +190,8 @@ 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. @@ -259,56 +241,79 @@ /* * 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++) + 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); + + index_deform_tuple(scandesc->xs_itup, scandesc->xs_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. + */ + if (unlikely(node->ioss_NameCStringAttNums != NULL)) { - int attnum = node->ioss_NameCStringAttNums[idx]; - Name name; + int attcount = node->ioss_NameCStringCount; - /* skip null Datums */ - if (slot->tts_isnull[attnum]) - continue; + for (int idx = 0; idx < attcount; idx++) + { + int attnum = node->ioss_NameCStringAttNums[idx]; + Name name; - /* 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); + /* 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 -Nru postgresql-17-17.10/src/backend/executor/nodeWindowAgg.c postgresql-17-17.11/src/backend/executor/nodeWindowAgg.c --- postgresql-17-17.10/src/backend/executor/nodeWindowAgg.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/executor/nodeWindowAgg.c 2026-08-10 20:54:09.000000000 +0000 @@ -1040,6 +1040,20 @@ 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 * implementations to support varying numbers of arguments. The real info @@ -2818,6 +2832,25 @@ 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 -Nru postgresql-17-17.10/src/backend/jit/llvm/llvmjit.c postgresql-17-17.11/src/backend/jit/llvm/llvmjit.c --- postgresql-17-17.10/src/backend/jit/llvm/llvmjit.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/jit/llvm/llvmjit.c 2026-08-10 20:54:09.000000000 +0000 @@ -1148,9 +1148,6 @@ void llvm_split_symbol_name(const char *name, char **modname, char **funcname) { - *modname = NULL; - *funcname = NULL; - /* * Module function names are pgextern.$module.$funcname */ @@ -1160,14 +1157,21 @@ * 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 -Nru postgresql-17-17.10/src/backend/libpq/auth-scram.c postgresql-17-17.11/src/backend/libpq/auth-scram.c --- postgresql-17-17.10/src/backend/libpq/auth-scram.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/libpq/auth-scram.c 2026-08-10 20:54:09.000000000 +0000 @@ -715,7 +715,7 @@ 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 -Nru postgresql-17-17.10/src/backend/libpq/be-secure-openssl.c postgresql-17-17.11/src/backend/libpq/be-secure-openssl.c --- postgresql-17-17.10/src/backend/libpq/be-secure-openssl.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/libpq/be-secure-openssl.c 2026-08-10 20:54:09.000000000 +0000 @@ -77,7 +77,7 @@ static bool initialize_ecdh(SSL_CTX *context, bool isServerStart); 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 SSL_initialized = false; @@ -634,18 +634,18 @@ 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) @@ -689,7 +689,7 @@ * which make regular expression matching a bit easier. Also note that * it prints the Subject fields in reverse order. */ - if (X509_NAME_print_ex(bio, x509name, 0, XN_FLAG_RFC2253) == -1 || + if (X509_NAME_print_ex(bio, unconstify(X509_NAME *, x509name), 0, XN_FLAG_RFC2253) == -1 || BIO_get_mem_ptr(bio, &bio_buf) <= 0) { BIO_free(bio); @@ -1615,14 +1615,14 @@ * */ 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; + count = X509_NAME_entry_count(unconstify(X509_NAME *, name)); + const X509_NAME_ENTRY *e; + const ASN1_STRING *v; const char *field_name; size_t size; char nullterm; @@ -1638,13 +1638,13 @@ (void) BIO_set_close(membuf, BIO_CLOSE); for (i = 0; i < count; i++) { - e = X509_NAME_get_entry(name, i); - nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(e)); + e = X509_NAME_get_entry(unconstify(X509_NAME *, name), i); + nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(unconstify(X509_NAME_ENTRY *, e))); if (nid == NID_undef) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not get NID for ASN1_OBJECT object"))); - v = X509_NAME_ENTRY_get_data(e); + v = X509_NAME_ENTRY_get_data(unconstify(X509_NAME_ENTRY *, e)); field_name = OBJ_nid2sn(nid); if (field_name == NULL) field_name = OBJ_nid2ln(nid); @@ -1653,7 +1653,7 @@ (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not convert NID %d to an ASN1_OBJECT structure", nid))); BIO_printf(membuf, "/%s=", field_name); - ASN1_STRING_print_ex(membuf, v, + ASN1_STRING_print_ex(membuf, unconstify(ASN1_STRING *, v), ((ASN1_STRFLGS_RFC2253 & ~ASN1_STRFLGS_ESC_MSB) | ASN1_STRFLGS_UTF8_CONVERT)); } diff -Nru postgresql-17-17.10/src/backend/nodes/makefuncs.c postgresql-17-17.11/src/backend/nodes/makefuncs.c --- postgresql-17-17.10/src/backend/nodes/makefuncs.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/nodes/makefuncs.c 2026-08-10 20:54:09.000000000 +0000 @@ -960,6 +960,8 @@ { JsonIsPredicate *n = makeNode(JsonIsPredicate); + Assert(expr != NULL); + n->expr = expr; n->format = format; n->item_type = item_type; diff -Nru postgresql-17-17.10/src/backend/optimizer/path/allpaths.c postgresql-17-17.11/src/backend/optimizer/path/allpaths.c --- postgresql-17-17.10/src/backend/optimizer/path/allpaths.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/optimizer/path/allpaths.c 2026-08-10 20:54:09.000000000 +0000 @@ -3748,7 +3748,7 @@ /* 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 */ diff -Nru postgresql-17-17.10/src/backend/optimizer/plan/subselect.c postgresql-17-17.11/src/backend/optimizer/plan/subselect.c --- postgresql-17-17.10/src/backend/optimizer/plan/subselect.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/optimizer/plan/subselect.c 2026-08-10 20:54:09.000000000 +0000 @@ -837,7 +837,9 @@ 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 -Nru postgresql-17-17.10/src/backend/optimizer/prep/prepjointree.c postgresql-17-17.11/src/backend/optimizer/prep/prepjointree.c --- postgresql-17-17.10/src/backend/optimizer/prep/prepjointree.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/optimizer/prep/prepjointree.c 2026-08-10 20:54:09.000000000 +0000 @@ -143,13 +143,15 @@ 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, @@ -3426,15 +3428,26 @@ 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 */ @@ -3495,9 +3508,13 @@ * 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) { @@ -3528,6 +3545,7 @@ /* 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 */ @@ -3541,7 +3559,8 @@ */ 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); @@ -3610,12 +3629,14 @@ * 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, @@ -3643,7 +3664,8 @@ * 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) @@ -3698,7 +3720,7 @@ */ 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, @@ -3820,9 +3842,19 @@ /* - * 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 @@ -3832,8 +3864,9 @@ 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 @@ -3846,9 +3879,16 @@ { 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)) @@ -3873,7 +3913,7 @@ } static bool -find_dependent_phvs(PlannerInfo *root, int varno) +find_dependent_phvs(PlannerInfo *root, int varno, Relids baserels) { find_dependent_phvs_context context; @@ -3882,6 +3922,7 @@ return false; context.relids = bms_make_singleton(varno); + context.baserels = baserels; context.sublevels_up = 0; if (query_tree_walker(root->parse, @@ -3898,7 +3939,8 @@ } 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; @@ -3909,6 +3951,7 @@ return false; context.relids = bms_make_singleton(varno); + context.baserels = baserels; context.sublevels_up = 0; /* diff -Nru postgresql-17-17.10/src/backend/optimizer/util/clauses.c postgresql-17-17.11/src/backend/optimizer/util/clauses.c --- postgresql-17-17.10/src/backend/optimizer/util/clauses.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/optimizer/util/clauses.c 2026-08-10 20:54:09.000000000 +0000 @@ -1008,7 +1008,7 @@ /* 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 @@ -1016,12 +1016,12 @@ */ 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; @@ -1035,17 +1035,25 @@ 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; @@ -1059,28 +1067,26 @@ 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 @@ -1090,31 +1096,33 @@ 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); @@ -1509,7 +1517,7 @@ { 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)) @@ -1762,7 +1770,7 @@ { 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)) @@ -2297,7 +2305,8 @@ 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; @@ -2306,7 +2315,8 @@ { 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; @@ -2338,7 +2348,8 @@ * 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; @@ -4382,7 +4393,7 @@ { 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; diff -Nru postgresql-17-17.10/src/backend/parser/parse_agg.c postgresql-17-17.11/src/backend/parser/parse_agg.c --- postgresql-17-17.10/src/backend/parser/parse_agg.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/parser/parse_agg.c 2026-08-10 20:54:09.000000000 +0000 @@ -1961,7 +1961,23 @@ 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 -Nru postgresql-17-17.10/src/backend/parser/parse_coerce.c postgresql-17-17.11/src/backend/parser/parse_coerce.c --- postgresql-17-17.10/src/backend/parser/parse_coerce.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/parser/parse_coerce.c 2026-08-10 20:54:09.000000000 +0000 @@ -571,6 +571,10 @@ 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; @@ -3171,6 +3175,10 @@ 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 -Nru postgresql-17-17.10/src/backend/parser/parse_expr.c postgresql-17-17.11/src/backend/parser/parse_expr.c --- postgresql-17-17.10/src/backend/parser/parse_expr.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/parser/parse_expr.c 2026-08-10 20:54:09.000000000 +0000 @@ -4067,10 +4067,20 @@ 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; } @@ -4788,8 +4798,17 @@ * * 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 -Nru postgresql-17-17.10/src/backend/parser/parse_func.c postgresql-17-17.11/src/backend/parser/parse_func.c --- postgresql-17-17.10/src/backend/parser/parse_func.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/parser/parse_func.c 2026-08-10 20:54:09.000000000 +0000 @@ -672,6 +672,32 @@ 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); @@ -782,6 +808,22 @@ 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 ... */ @@ -847,6 +889,19 @@ 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 ... */ diff -Nru postgresql-17-17.10/src/backend/parser/parse_oper.c postgresql-17-17.11/src/backend/parser/parse_oper.c --- postgresql-17-17.10/src/backend/parser/parse_oper.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/parser/parse_oper.c 2026-08-10 20:54:09.000000000 +0000 @@ -736,6 +736,28 @@ 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 -Nru postgresql-17-17.10/src/backend/parser/parse_utilcmd.c postgresql-17-17.11/src/backend/parser/parse_utilcmd.c --- postgresql-17-17.10/src/backend/parser/parse_utilcmd.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/parser/parse_utilcmd.c 2026-08-10 20:54:09.000000000 +0000 @@ -1310,6 +1310,16 @@ 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 -Nru postgresql-17-17.10/src/backend/partitioning/partbounds.c postgresql-17-17.11/src/backend/partitioning/partbounds.c --- postgresql-17-17.10/src/backend/partitioning/partbounds.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/partitioning/partbounds.c 2026-08-10 20:54:09.000000000 +0000 @@ -4868,6 +4868,12 @@ 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 @@ } 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 -Nru postgresql-17-17.10/src/backend/partitioning/partprune.c postgresql-17-17.11/src/backend/partitioning/partprune.c --- postgresql-17-17.10/src/backend/partitioning/partprune.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/partitioning/partprune.c 2026-08-10 20:54:09.000000000 +0000 @@ -2989,15 +2989,9 @@ */ 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 -Nru postgresql-17-17.10/src/backend/po/de.po postgresql-17-17.11/src/backend/po/de.po --- postgresql-17-17.10/src/backend/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-05 10:21+0000\n" +"POT-Creation-Date: 2026-08-07 09:21+0000\n" "PO-Revision-Date: 2025-11-07 08:48+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -91,12 +91,12 @@ #: access/transam/twophase.c:1354 access/transam/xlog.c:3458 #: access/transam/xlog.c:4322 access/transam/xlogrecovery.c:1248 #: access/transam/xlogrecovery.c:1346 access/transam/xlogrecovery.c:1383 -#: access/transam/xlogrecovery.c:1450 backup/basebackup.c:2123 +#: access/transam/xlogrecovery.c:1450 backup/basebackup.c:2121 #: backup/walsummary.c:283 commands/extension.c:3678 libpq/hba.c:764 #: replication/logical/origin.c:745 replication/logical/origin.c:781 -#: replication/logical/reorderbuffer.c:5243 -#: replication/logical/snapbuild.c:2099 replication/slot.c:2281 -#: replication/slot.c:2322 replication/walsender.c:673 +#: replication/logical/reorderbuffer.c:5259 +#: replication/logical/snapbuild.c:2099 replication/slot.c:2283 +#: replication/slot.c:2324 replication/walsender.c:673 #: storage/file/buffile.c:470 storage/file/copydir.c:185 #: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format @@ -106,8 +106,8 @@ #: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 #: access/transam/xlog.c:3463 access/transam/xlog.c:4327 #: replication/logical/origin.c:750 replication/logical/origin.c:789 -#: replication/logical/snapbuild.c:2104 replication/slot.c:2285 -#: replication/slot.c:2326 replication/walsender.c:678 +#: replication/logical/snapbuild.c:2104 replication/slot.c:2287 +#: replication/slot.c:2328 replication/walsender.c:678 #: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" @@ -124,9 +124,9 @@ #: access/transam/xlog.c:5227 commands/copyfrom.c:1799 commands/copyto.c:325 #: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 #: replication/logical/origin.c:683 replication/logical/origin.c:822 -#: replication/logical/reorderbuffer.c:5295 +#: replication/logical/reorderbuffer.c:5311 #: replication/logical/snapbuild.c:1866 replication/logical/snapbuild.c:1990 -#: replication/slot.c:2169 replication/slot.c:2333 replication/walsender.c:688 +#: replication/slot.c:2171 replication/slot.c:2335 replication/walsender.c:688 #: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:828 #: storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 #: utils/cache/relmapper.c:956 @@ -161,15 +161,15 @@ #: access/transam/xlog.c:3374 access/transam/xlog.c:3413 #: access/transam/xlog.c:3606 access/transam/xlog.c:4312 #: access/transam/xlogrecovery.c:4285 access/transam/xlogrecovery.c:4388 -#: access/transam/xlogutils.c:836 backup/basebackup.c:547 -#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 -#: postmaster/syslogger.c:1511 replication/logical/origin.c:735 -#: replication/logical/reorderbuffer.c:3896 -#: replication/logical/reorderbuffer.c:4450 -#: replication/logical/reorderbuffer.c:5223 +#: access/transam/xlogutils.c:860 backup/basebackup.c:547 +#: backup/basebackup.c:1596 backup/walsummary.c:220 libpq/hba.c:624 +#: postmaster/syslogger.c:1511 postmaster/walsummarizer.c:1614 +#: replication/logical/origin.c:735 replication/logical/reorderbuffer.c:3912 +#: replication/logical/reorderbuffer.c:4466 +#: replication/logical/reorderbuffer.c:5239 #: replication/logical/snapbuild.c:1821 replication/logical/snapbuild.c:1931 -#: replication/slot.c:2253 replication/walsender.c:646 -#: replication/walsender.c:3108 storage/file/copydir.c:151 +#: replication/slot.c:2255 replication/walsender.c:646 +#: replication/walsender.c:3130 storage/file/copydir.c:151 #: storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 #: storage/file/fd.c:3830 storage/smgr/md.c:672 utils/cache/relmapper.c:818 #: utils/cache/relmapper.c:935 utils/error/elog.c:2124 @@ -199,7 +199,7 @@ #: access/transam/xlog.c:4285 access/transam/xlog.c:8721 #: access/transam/xlog.c:8766 backup/basebackup_server.c:207 #: commands/dbcommands.c:514 replication/logical/snapbuild.c:1859 -#: replication/slot.c:2153 replication/slot.c:2263 storage/file/fd.c:820 +#: replication/slot.c:2155 replication/slot.c:2265 storage/file/fd.c:820 #: storage/file/fd.c:3851 storage/smgr/md.c:1345 storage/smgr/md.c:1390 #: storage/sync/sync.c:446 utils/misc/guc.c:4530 #, c-format @@ -211,23 +211,23 @@ #: ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 #: ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 #: ../common/md5_common.c:156 ../common/parse_manifest.c:157 -#: ../common/parse_manifest.c:852 ../common/psprintf.c:143 -#: ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:828 -#: ../port/path.c:865 ../port/path.c:882 access/transam/twophase.c:1419 +#: ../common/parse_manifest.c:852 ../common/psprintf.c:140 +#: ../common/scram-common.c:268 ../common/stringinfo.c:311 ../port/path.c:845 +#: ../port/path.c:882 ../port/path.c:899 access/transam/twophase.c:1419 #: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1360 #: libpq/auth.c:1404 libpq/auth.c:1961 libpq/be-secure-gssapi.c:534 #: libpq/be-secure-gssapi.c:714 postmaster/bgworker.c:355 #: postmaster/bgworker.c:945 postmaster/postmaster.c:3548 #: postmaster/postmaster.c:4009 postmaster/postmaster.c:4371 -#: postmaster/walsummarizer.c:936 +#: postmaster/walsummarizer.c:1035 #: replication/libpqwalreceiver/libpqwalreceiver.c:400 #: replication/logical/logical.c:212 replication/walsender.c:853 #: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 #: storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 #: storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 #: storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 -#: utils/activity/pgstat_shmem.c:508 utils/adt/formatting.c:1727 -#: utils/adt/formatting.c:1875 utils/adt/formatting.c:2077 +#: utils/activity/pgstat_shmem.c:511 utils/adt/formatting.c:1728 +#: utils/adt/formatting.c:1876 utils/adt/formatting.c:2090 #: utils/adt/pg_locale.c:533 utils/adt/pg_locale.c:697 utils/fmgr/dfmgr.c:229 #: 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 @@ -235,7 +235,7 @@ #: utils/misc/guc.c:674 utils/misc/guc.c:1062 utils/misc/guc.c:4508 #: utils/misc/tzparser.c:477 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:1157 utils/mmgr/slab.c:370 +#: utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1160 utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -299,20 +299,30 @@ msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 -#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 -#: ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:867 -#: ../port/path.c:884 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:847 ../port/path.c:884 +#: ../port/path.c:901 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:76 storage/file/fd.c:3516 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -355,8 +365,8 @@ #: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 #: postmaster/pgarch.c:834 postmaster/syslogger.c:1559 -#: replication/logical/snapbuild.c:1878 replication/slot.c:965 -#: replication/slot.c:2036 replication/slot.c:2185 storage/file/fd.c:838 +#: replication/logical/snapbuild.c:1878 replication/slot.c:967 +#: replication/slot.c:2038 replication/slot.c:2187 storage/file/fd.c:838 #: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -576,7 +586,7 @@ msgid "file size is not an integer" msgstr "Dateigröße ist keine ganze Zahl" -#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#: ../common/parse_manifest.c:699 backup/basebackup.c:868 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "unbekannter Prüfsummenalgorithmus: »%s«" @@ -645,7 +655,7 @@ #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 -#: tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 +#: tcop/backend_startup.c:760 utils/misc/guc.c:3167 utils/misc/guc.c:3208 #: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6942 #: utils/misc/guc.c:6983 #, c-format @@ -711,9 +721,9 @@ #: access/transam/twophase.c:1718 access/transam/xlogarchive.c:119 #: access/transam/xlogarchive.c:399 backup/walsummary.c:254 #: postmaster/postmaster.c:1051 postmaster/syslogger.c:1488 -#: replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4719 +#: replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4735 #: replication/logical/snapbuild.c:1759 replication/logical/snapbuild.c:2193 -#: replication/slot.c:2237 storage/file/fd.c:878 storage/file/fd.c:3378 +#: replication/slot.c:2239 storage/file/fd.c:878 storage/file/fd.c:3378 #: storage/file/fd.c:3440 storage/file/reinit.c:261 storage/ipc/dsm.c:343 #: storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 #: utils/time/snapmgr.c:1591 @@ -740,12 +750,12 @@ msgid "could not encode server key" msgstr "konnte Server Key nicht kodieren" -#: ../common/stringinfo.c:315 +#: ../common/stringinfo.c:312 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "Kann Zeichenkettenpuffer mit %d Bytes nicht um %d Bytes vergrößern." -#: ../common/stringinfo.c:319 +#: ../common/stringinfo.c:316 #, c-format msgid "" "out of memory\n" @@ -853,7 +863,7 @@ 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:852 +#: ../port/path.c:869 #, c-format msgid "could not get current working directory: %m\n" msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %m\n" @@ -1199,7 +1209,7 @@ msgstr "Um das zu reparieren, führen Sie REINDEX INDEX \"%s\" aus." #: access/gin/ginutil.c:147 executor/execExpr.c:2200 -#: utils/adt/arrayfuncs.c:4022 utils/adt/arrayfuncs.c:6720 +#: utils/adt/arrayfuncs.c:4022 utils/adt/arrayfuncs.c:6727 #: utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" @@ -1286,9 +1296,9 @@ #: access/hash/hashfunc.c:281 access/hash/hashfunc.c:337 catalog/heap.c:687 #: catalog/heap.c:693 commands/createas.c:201 commands/createas.c:508 -#: commands/indexcmds.c:2021 commands/tablecmds.c:18252 commands/view.c:81 -#: regex/regc_pg_locale.c:245 utils/adt/formatting.c:1655 -#: utils/adt/formatting.c:1803 utils/adt/formatting.c:1993 utils/adt/like.c:189 +#: commands/indexcmds.c:2021 commands/tablecmds.c:18247 commands/view.c:81 +#: regex/regc_pg_locale.c:245 utils/adt/formatting.c:1656 +#: utils/adt/formatting.c:1804 utils/adt/formatting.c:2006 utils/adt/like.c:189 #: utils/adt/like_support.c:1024 utils/adt/varchar.c:738 #: utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 utils/adt/varlena.c:1566 #, c-format @@ -1341,38 +1351,38 @@ 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:2244 +#: access/heap/heapam.c:2335 #, 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:2767 +#: access/heap/heapam.c:2887 #, 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:2814 +#: access/heap/heapam.c:2934 #, c-format msgid "attempted to delete invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu löschen" -#: access/heap/heapam.c:3264 access/heap/heapam.c:6632 access/index/genam.c:818 +#: access/heap/heapam.c:3412 access/heap/heapam.c:6948 access/index/genam.c:818 #, 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:3441 +#: access/heap/heapam.c:3589 #, c-format msgid "attempted to update invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu aktualisieren" -#: access/heap/heapam.c:4954 access/heap/heapam.c:4992 -#: access/heap/heapam.c:5259 access/heap/heapam_handler.c:468 +#: access/heap/heapam.c:5220 access/heap/heapam.c:5258 +#: access/heap/heapam.c:5548 access/heap/heapam_handler.c:468 #, 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:6386 commands/trigger.c:3427 +#: access/heap/heapam.c:6702 commands/trigger.c:3427 #: executor/nodeModifyTable.c:2399 executor/nodeModifyTable.c:2490 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" @@ -1400,8 +1410,8 @@ #: access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 #: backup/basebackup_server.c:242 commands/dbcommands.c:494 #: postmaster/launch_backend.c:340 postmaster/postmaster.c:4102 -#: postmaster/walsummarizer.c:1213 replication/logical/origin.c:603 -#: replication/slot.c:2097 storage/file/copydir.c:157 storage/smgr/md.c:230 +#: postmaster/walsummarizer.c:1312 replication/logical/origin.c:603 +#: replication/slot.c:2099 storage/file/copydir.c:157 storage/smgr/md.c:230 #: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" @@ -1419,7 +1429,7 @@ #: postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 #: replication/logical/origin.c:615 replication/logical/origin.c:657 #: replication/logical/origin.c:676 replication/logical/snapbuild.c:1835 -#: replication/slot.c:2133 storage/file/buffile.c:545 +#: replication/slot.c:2135 storage/file/buffile.c:545 #: storage/file/copydir.c:197 utils/init/miscinit.c:1656 #: utils/init/miscinit.c:1667 utils/init/miscinit.c:1675 utils/misc/guc.c:4491 #: utils/misc/guc.c:4522 utils/misc/guc.c:5680 utils/misc/guc.c:5698 @@ -1665,7 +1675,7 @@ #: access/index/indexam.c:203 catalog/objectaddress.c:1356 #: commands/indexcmds.c:2885 commands/tablecmds.c:281 commands/tablecmds.c:305 -#: commands/tablecmds.c:17937 commands/tablecmds.c:19848 +#: commands/tablecmds.c:17932 commands/tablecmds.c:19843 #, c-format msgid "\"%s\" is not an index" msgstr "»%s« ist kein Index" @@ -1818,14 +1828,13 @@ #: access/transam/multixact.c:1262 access/transam/multixact.c:1269 #: access/transam/multixact.c:1293 access/transam/multixact.c:1302 -#: 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:1267 #, c-format @@ -1894,10 +1903,10 @@ #, 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:2941 #, c-format @@ -2117,7 +2126,7 @@ 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:927 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "angeforderte Zeitleiste %u ist nicht in der History dieses Servers" @@ -2220,7 +2229,7 @@ msgstr "berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in Datei »%s« überein" #: access/transam/twophase.c:1420 access/transam/xlogrecovery.c:565 -#: postmaster/walsummarizer.c:937 replication/logical/logical.c:213 +#: postmaster/walsummarizer.c:1036 replication/logical/logical.c:213 #: replication/walsender.c:854 #, c-format msgid "Failed while allocating a WAL reading processor." @@ -2308,6 +2317,15 @@ 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" @@ -2482,8 +2500,8 @@ 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:3720 access/transam/xlogutils.c:831 -#: replication/walsender.c:3102 +#: access/transam/xlog.c:3720 access/transam/xlogutils.c:855 +#: postmaster/walsummarizer.c:1628 replication/walsender.c:3124 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "das angeforderte WAL-Segment %s wurde schon entfernt" @@ -2641,13 +2659,13 @@ #: access/transam/xlog.c:4643 catalog/namespace.c:4699 #: commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 -#: replication/slot.c:2487 tcop/postgres.c:3719 utils/error/elog.c:2247 +#: replication/slot.c:2489 tcop/postgres.c:3735 utils/error/elog.c:2247 #, c-format msgid "List syntax is invalid." msgstr "Die Listensyntax ist ungültig." #: access/transam/xlog.c:4689 commands/user.c:2545 commands/variable.c:173 -#: tcop/postgres.c:3735 utils/error/elog.c:2273 +#: tcop/postgres.c:3751 utils/error/elog.c:2273 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Unbekanntes Schlüsselwort: »%s«." @@ -2859,12 +2877,12 @@ 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:9072 backup/basebackup.c:1417 utils/adt/misc.c:354 +#: access/transam/xlog.c:9072 backup/basebackup.c:1415 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:9079 backup/basebackup.c:1422 utils/adt/misc.c:359 +#: access/transam/xlog.c:9079 backup/basebackup.c:1420 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" @@ -2874,12 +2892,12 @@ 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:9238 backup/basebackup.c:1281 +#: access/transam/xlog.c:9238 backup/basebackup.c:1279 #, 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:9239 backup/basebackup.c:1282 +#: access/transam/xlog.c:9239 backup/basebackup.c:1280 #, 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." @@ -2957,7 +2975,7 @@ msgid "could not write archive status file \"%s\": %m" msgstr "konnte Archivstatusdatei »%s« nicht schreiben: %m" -#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:995 #, c-format msgid "a backup is already in progress in this session" msgstr "ein Backup läuft bereits in dieser Sitzung" @@ -3674,12 +3692,12 @@ #: access/transam/xlogrecovery.c:4773 access/transam/xlogrecovery.c:4775 #: catalog/dependency.c:1153 catalog/dependency.c:1160 #: catalog/dependency.c:1171 commands/tablecmds.c:1459 -#: commands/tablecmds.c:15152 commands/tablespace.c:460 commands/user.c:1302 +#: commands/tablecmds.c:15147 commands/tablespace.c:460 commands/user.c:1302 #: commands/vacuum.c:213 commands/view.c:441 executor/execExprInterp.c:4726 #: executor/execExprInterp.c:4734 libpq/auth.c:332 #: replication/logical/applyparallelworker.c:1057 replication/slot.c:261 -#: replication/slot.c:2502 replication/slot.c:2504 replication/syncrep.c:1078 -#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 +#: replication/slot.c:2504 replication/slot.c:2506 replication/syncrep.c:1078 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1465 utils/misc/guc.c:3169 #: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6836 #: utils/misc/guc.c:6870 utils/misc/guc.c:6904 utils/misc/guc.c:6947 #: utils/misc/guc.c:6989 @@ -3713,12 +3731,12 @@ msgid "\"recovery_target_timeline\" is not a valid number." msgstr "»recovery_target_timeline« ist keine gültige Zahl." -#: access/transam/xlogutils.c:1032 +#: access/transam/xlogutils.c:1068 #, 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:1039 +#: access/transam/xlogutils.c:1075 #, 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" @@ -3801,118 +3819,118 @@ msgid "checksum verification failure during base backup" msgstr "Prüfsummenüberprüfung bei der Basissicherung fehlgeschlagen" -#: 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 +#: backup/basebackup.c:731 backup/basebackup.c:740 backup/basebackup.c:751 +#: backup/basebackup.c:768 backup/basebackup.c:777 backup/basebackup.c:786 +#: backup/basebackup.c:801 backup/basebackup.c:818 backup/basebackup.c:827 +#: backup/basebackup.c:839 backup/basebackup.c:863 backup/basebackup.c:877 +#: backup/basebackup.c:888 backup/basebackup.c:899 backup/basebackup.c:912 #, c-format msgid "duplicate option \"%s\"" msgstr "doppelte Option »%s«" -#: backup/basebackup.c:761 +#: backup/basebackup.c:759 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "unbekannter Checkpoint-Typ: »%s«" -#: backup/basebackup.c:793 +#: backup/basebackup.c:791 #, 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:809 +#: backup/basebackup.c:807 #, 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:854 +#: backup/basebackup.c:852 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "unbekannte Manifestoption: »%s«" -#: backup/basebackup.c:905 +#: backup/basebackup.c:903 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "unbekannter Komprimierungsalgorithmus: »%s«" -#: backup/basebackup.c:921 +#: backup/basebackup.c:919 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "unbekannte Base-Backup-Option: »%s«" -#: backup/basebackup.c:932 +#: backup/basebackup.c:930 #, c-format msgid "manifest checksums require a backup manifest" msgstr "Manifest-Prüfsummen benötigen ein Backup-Manifest" -#: backup/basebackup.c:941 +#: backup/basebackup.c:939 #, c-format msgid "target detail cannot be used without target" msgstr "Zieldetail kann nicht ohne Ziel verwendet werden" -#: backup/basebackup.c:950 backup/basebackup_target.c:218 +#: backup/basebackup.c:948 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:961 +#: backup/basebackup.c:959 #, 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:974 +#: backup/basebackup.c:972 #, c-format msgid "invalid compression specification: %s" msgstr "ungültige Komprimierungsangabe: %s" -#: backup/basebackup.c:1024 +#: backup/basebackup.c:1022 #, 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:1157 backup/basebackup.c:1358 +#: backup/basebackup.c:1155 backup/basebackup.c:1356 #, 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:1544 +#: backup/basebackup.c:1542 #, c-format msgid "skipping special file \"%s\"" msgstr "überspringe besondere Datei »%s«" -#: backup/basebackup.c:1751 +#: backup/basebackup.c:1749 #, 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:1813 +#: backup/basebackup.c:1811 #, 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:1917 +#: backup/basebackup.c:1915 #, 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:1924 +#: backup/basebackup.c:1922 #, 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:2048 +#: backup/basebackup.c:2046 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "Dateiname zu lang für Tar-Format: »%s«" -#: backup/basebackup.c:2053 +#: backup/basebackup.c:2051 #, 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:2127 +#: backup/basebackup.c:2125 #, c-format msgid "could not read file \"%s\": read %zd of %zu" msgstr "konnte Datei »%s« nicht lesen: %zd von %zu gelesen" @@ -4009,7 +4027,7 @@ #: backup/basebackup_server.c:102 commands/dbcommands.c:477 #: commands/tablespace.c:157 commands/tablespace.c:173 -#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2024 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2026 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" @@ -4034,10 +4052,9 @@ 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 @@ -4064,17 +4081,22 @@ 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 %lld" msgstr "ungültige Zeitleiste %lld" -#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:624 tcop/postgres.c:3950 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:624 tcop/postgres.c:3966 #, c-format msgid "--%s requires a value" msgstr "--%s benötigt einen Wert" -#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:629 tcop/postgres.c:3955 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:629 tcop/postgres.c:3971 #, c-format msgid "-c %s requires a value" msgstr "-c %s benötigt einen Wert" @@ -4247,16 +4269,16 @@ #: commands/tablecmds.c:7778 commands/tablecmds.c:7852 #: commands/tablecmds.c:7922 commands/tablecmds.c:8052 #: commands/tablecmds.c:8181 commands/tablecmds.c:8275 -#: commands/tablecmds.c:8376 commands/tablecmds.c:8503 -#: commands/tablecmds.c:8533 commands/tablecmds.c:8675 -#: commands/tablecmds.c:8768 commands/tablecmds.c:8902 -#: commands/tablecmds.c:9014 commands/tablecmds.c:12838 -#: commands/tablecmds.c:13030 commands/tablecmds.c:13191 -#: commands/tablecmds.c:14403 commands/tablecmds.c:17030 commands/trigger.c:943 +#: commands/tablecmds.c:8376 commands/tablecmds.c:8498 +#: commands/tablecmds.c:8528 commands/tablecmds.c:8670 +#: commands/tablecmds.c:8763 commands/tablecmds.c:8897 +#: commands/tablecmds.c:9009 commands/tablecmds.c:12833 +#: commands/tablecmds.c:13025 commands/tablecmds.c:13186 +#: commands/tablecmds.c:14398 commands/tablecmds.c:17025 commands/trigger.c:943 #: parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 #: parser/parse_type.c:144 parser/parse_utilcmd.c:3413 #: parser/parse_utilcmd.c:3453 parser/parse_utilcmd.c:3495 utils/adt/acl.c:2940 -#: utils/adt/ruleutils.c:2812 +#: utils/adt/ruleutils.c:2814 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "Spalte »%s« von Relation »%s« existiert nicht" @@ -4266,13 +4288,13 @@ msgid "\"%s\" is an index" msgstr "»%s« ist ein Index" -#: catalog/aclchk.c:1869 commands/tablecmds.c:14560 commands/tablecmds.c:17946 +#: catalog/aclchk.c:1869 commands/tablecmds.c:14555 commands/tablecmds.c:17941 #, c-format msgid "\"%s\" is a composite type" msgstr "»%s« ist ein zusammengesetzter Typ" #: catalog/aclchk.c:1877 catalog/objectaddress.c:1363 commands/tablecmds.c:263 -#: commands/tablecmds.c:17910 utils/adt/acl.c:2124 utils/adt/acl.c:2154 +#: commands/tablecmds.c:17905 utils/adt/acl.c:2124 utils/adt/acl.c:2154 #: utils/adt/acl.c:2187 utils/adt/acl.c:2223 utils/adt/acl.c:2254 #: utils/adt/acl.c:2285 #, c-format @@ -4814,12 +4836,12 @@ 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:2375 parser/parse_relation.c:3407 +#: catalog/dependency.c:2378 parser/parse_relation.c:3407 #: parser/parse_relation.c:3417 #, c-format msgid "column %d of relation \"%s\" does not exist" @@ -4878,146 +4900,146 @@ 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:1176 catalog/index.c:899 commands/createas.c:401 +#: catalog/heap.c:1179 catalog/index.c:903 commands/createas.c:401 #: commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "Relation »%s« existiert bereits" -#: catalog/heap.c:1192 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: 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:1179 commands/typecmds.c:1405 -#: commands/typecmds.c:1585 commands/typecmds.c:2556 +#: commands/typecmds.c:1592 commands/typecmds.c:2563 #, c-format msgid "type \"%s\" already exists" msgstr "Typ »%s« existiert bereits" -#: catalog/heap.c:1193 +#: catalog/heap.c:1196 #, 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:1233 +#: catalog/heap.c:1236 #, 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:1244 +#: catalog/heap.c:1247 #, 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:1254 +#: catalog/heap.c:1257 #, 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:2199 +#: catalog/heap.c:2202 #, 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:2466 +#: catalog/heap.c:2469 #, c-format msgid "check constraint \"%s\" already exists" msgstr "Check-Constraint »%s« existiert bereits" -#: catalog/heap.c:2638 catalog/index.c:913 catalog/pg_constraint.c:725 -#: commands/tablecmds.c:9389 +#: catalog/heap.c:2641 catalog/index.c:917 catalog/pg_constraint.c:725 +#: commands/tablecmds.c:9384 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "Constraint »%s« existiert bereits für Relation »%s«" -#: catalog/heap.c:2645 +#: catalog/heap.c:2648 #, 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:2656 +#: catalog/heap.c:2659 #, 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:2666 +#: catalog/heap.c:2669 #, 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:2671 +#: catalog/heap.c:2674 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "Constraint »%s« wird mit geerbter Definition zusammengeführt" -#: catalog/heap.c:2697 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 +#: catalog/heap.c:2700 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 #: commands/tablecmds.c:3377 commands/tablecmds.c:7089 -#: commands/tablecmds.c:15971 commands/tablecmds.c:16102 +#: commands/tablecmds.c:15966 commands/tablecmds.c:16097 #, c-format msgid "too many inheritance parents" msgstr "zu viele Elterntabellen" -#: catalog/heap.c:2781 +#: catalog/heap.c:2784 #, 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:2783 +#: catalog/heap.c:2786 #, 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:2789 +#: catalog/heap.c:2792 #, 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:2790 +#: catalog/heap.c:2793 #, 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:2845 +#: catalog/heap.c:2848 #, c-format msgid "generation expression is not immutable" msgstr "Generierungsausdruck ist nicht »immutable«" -#: catalog/heap.c:2873 rewrite/rewriteHandler.c:1313 +#: catalog/heap.c:2876 rewrite/rewriteHandler.c:1313 #, 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:2878 commands/prepare.c:331 parser/analyze.c:2758 +#: catalog/heap.c:2881 commands/prepare.c:331 parser/analyze.c:2758 #: parser/parse_target.c:592 parser/parse_target.c:882 #: parser/parse_target.c:892 rewrite/rewriteHandler.c:1318 #, 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:2925 +#: catalog/heap.c:2928 #, 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:3231 +#: catalog/heap.c:3234 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "nicht unterstützte Kombination aus ON COMMIT und Fremdschlüssel" -#: catalog/heap.c:3232 +#: catalog/heap.c:3235 #, 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:3237 +#: catalog/heap.c:3240 #, 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:3238 +#: catalog/heap.c:3241 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabelle »%s« verweist auf »%s«." -#: catalog/heap.c:3240 +#: catalog/heap.c:3243 #, 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." @@ -5042,74 +5064,74 @@ msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "Primärschlüsselspalte »%s« ist nicht als NOT NULL markiert" -#: catalog/index.c:798 catalog/index.c:1915 +#: catalog/index.c:802 catalog/index.c:1929 #, 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:838 +#: catalog/index.c:842 #, 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:853 +#: catalog/index.c:857 #, 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:862 catalog/index.c:1331 +#: catalog/index.c:866 catalog/index.c:1338 #, 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:871 +#: catalog/index.c:875 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "Cluster-globale Indexe können nicht nach initdb erzeugt werden" -#: catalog/index.c:891 commands/createas.c:416 commands/sequence.c:159 +#: catalog/index.c:895 commands/createas.c:416 commands/sequence.c:159 #: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "Relation »%s« existiert bereits, wird übersprungen" -#: catalog/index.c:941 +#: catalog/index.c:945 #, 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:951 utils/cache/relcache.c:3807 +#: catalog/index.c:955 utils/cache/relcache.c:3809 #, 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:2214 +#: catalog/index.c:2228 #, 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:3675 +#: catalog/index.c:3701 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht reindizieren" -#: catalog/index.c:3686 commands/indexcmds.c:3660 +#: catalog/index.c:3712 commands/indexcmds.c:3660 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "ungültiger Index einer TOAST-Tabelle kann nicht reindiziert werden" -#: catalog/index.c:3702 commands/indexcmds.c:3538 commands/indexcmds.c:3684 +#: catalog/index.c:3728 commands/indexcmds.c:3538 commands/indexcmds.c:3684 #: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" msgstr "Systemrelation »%s« kann nicht verschoben werden" -#: catalog/index.c:3839 +#: catalog/index.c:3865 #, c-format msgid "index \"%s\" was reindexed" msgstr "Index »%s« wurde neu indiziert" -#: catalog/index.c:4005 +#: catalog/index.c:4031 #, 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" @@ -5188,7 +5210,7 @@ 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" @@ -5252,25 +5274,25 @@ #: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 #: commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2327 -#: commands/tablecmds.c:12966 +#: commands/tablecmds.c:12961 #, c-format msgid "\"%s\" is not a table" msgstr "»%s« ist keine Tabelle" #: catalog/objectaddress.c:1378 commands/tablecmds.c:269 -#: commands/tablecmds.c:17915 commands/view.c:114 +#: commands/tablecmds.c:17910 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "»%s« ist keine Sicht" #: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 -#: commands/tablecmds.c:17920 +#: commands/tablecmds.c:17915 #, c-format msgid "\"%s\" is not a materialized view" msgstr "»%s« ist keine materialisierte Sicht" #: catalog/objectaddress.c:1392 commands/tablecmds.c:293 -#: commands/tablecmds.c:17925 +#: commands/tablecmds.c:17920 #, c-format msgid "\"%s\" is not a foreign table" msgstr "»%s« ist keine Fremdtabelle" @@ -5291,7 +5313,7 @@ msgstr "Vorgabewert für Spalte »%s« von Relation »%s« existiert nicht" #: catalog/objectaddress.c:1618 commands/functioncmds.c:132 -#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 +#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3850 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 #: utils/adt/acl.c:4577 #, c-format @@ -5557,7 +5579,7 @@ msgid "role %s" msgstr "Rolle %s" -#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 +#: catalog/objectaddress.c:3656 #, c-format msgid "membership of role %s in role %s" msgstr "Mitgliedschaft von Rolle %s in Rolle %s" @@ -5852,10 +5874,10 @@ msgstr "die Anzahl direkter Argumente einer Aggregatfunktion kann nicht geändert werden" #: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 -#: commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 -#: commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 -#: commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 -#: commands/typecmds.c:2380 parser/parse_func.c:417 parser/parse_func.c:448 +#: commands/typecmds.c:1992 commands/typecmds.c:2038 commands/typecmds.c:2090 +#: commands/typecmds.c:2127 commands/typecmds.c:2161 commands/typecmds.c:2195 +#: commands/typecmds.c:2229 commands/typecmds.c:2258 commands/typecmds.c:2345 +#: commands/typecmds.c:2387 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 #, c-format @@ -5977,31 +5999,41 @@ 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:3527 +#: catalog/pg_depend.c:236 commands/extension.c:3527 #, 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:3567 +#: catalog/pg_depend.c:243 catalog/pg_depend.c:294 commands/extension.c:3567 #, 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\"" @@ -6048,7 +6080,7 @@ msgstr "Die Partition wird nebenläufig abgetrennt oder hat eine unfertige Abtrennoperation." #: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 -#: commands/tablecmds.c:16217 +#: commands/tablecmds.c:16212 #, 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." @@ -6423,7 +6455,7 @@ 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:4363 +#: catalog/pg_type.c:325 commands/typecmds.c:4370 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "Typen mit fester Größe müssen Storage-Typ PLAIN haben" @@ -6438,7 +6470,7 @@ 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:533 storage/buffer/bufmgr.c:1547 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1556 #, c-format msgid "invalid page in block %u of relation %s" msgstr "ungültige Seite in Block %u von Relation %s" @@ -6558,7 +6590,7 @@ msgid "publication \"%s\" already exists" msgstr "Publikation »%s« existiert bereits" -#: commands/alter.c:98 commands/subscriptioncmds.c:669 +#: commands/alter.c:98 commands/subscriptioncmds.c:695 #, c-format msgid "subscription \"%s\" already exists" msgstr "Subskription »%s« existiert bereits" @@ -6598,16 +6630,16 @@ msgid "must be superuser to rename %s" msgstr "nur Superuser können %s umbenennen" -#: commands/alter.c:256 commands/subscriptioncmds.c:648 -#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 -#: commands/subscriptioncmds.c:1920 +#: commands/alter.c:256 commands/subscriptioncmds.c:674 +#: commands/subscriptioncmds.c:1155 commands/subscriptioncmds.c:1238 +#: commands/subscriptioncmds.c:1948 #, 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:649 -#: commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 -#: commands/subscriptioncmds.c:1921 +#: commands/alter.c:257 commands/subscriptioncmds.c:675 +#: commands/subscriptioncmds.c:1156 commands/subscriptioncmds.c:1239 +#: commands/subscriptioncmds.c:1949 #, 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." @@ -6750,7 +6782,7 @@ msgid "there is no previously clustered index for table \"%s\"" msgstr "es gibt keinen bereits geclusterten Index für Tabelle »%s«" -#: commands/cluster.c:191 commands/tablecmds.c:14861 commands/tablecmds.c:16793 +#: commands/cluster.c:191 commands/tablecmds.c:14856 commands/tablecmds.c:16788 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "Index »%s« für Tabelle »%s« existiert nicht" @@ -6765,7 +6797,7 @@ msgid "cannot vacuum temporary tables of other sessions" msgstr "temporäre Tabellen anderer Sitzungen können nicht gevacuumt werden" -#: commands/cluster.c:513 commands/tablecmds.c:16803 +#: commands/cluster.c:513 commands/tablecmds.c:16798 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "»%s« ist kein Index für Tabelle »%s«" @@ -6834,9 +6866,9 @@ #: replication/pgoutput/pgoutput.c:315 replication/pgoutput/pgoutput.c:338 #: replication/pgoutput/pgoutput.c:356 replication/pgoutput/pgoutput.c:366 #: replication/pgoutput/pgoutput.c:376 replication/pgoutput/pgoutput.c:386 -#: replication/pgoutput/pgoutput.c:398 replication/walsender.c:1164 -#: replication/walsender.c:1186 replication/walsender.c:1196 -#: replication/walsender.c:1205 replication/walsender.c:1444 +#: replication/pgoutput/pgoutput.c:398 replication/walsender.c:1186 +#: replication/walsender.c:1208 replication/walsender.c:1218 +#: replication/walsender.c:1227 replication/walsender.c:1466 #, c-format msgid "conflicting or redundant options" msgstr "widersprüchliche oder überflüssige Optionen" @@ -6904,11 +6936,11 @@ #. translator: %s is an SQL command #. translator: %s is an SQL ALTER command -#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1402 #: commands/tablecmds.c:7938 commands/tablecmds.c:7948 -#: commands/tablecmds.c:7950 commands/tablecmds.c:14563 -#: commands/tablecmds.c:17948 commands/tablecmds.c:17969 -#: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 +#: commands/tablecmds.c:7950 commands/tablecmds.c:14558 +#: commands/tablecmds.c:17943 commands/tablecmds.c:17964 +#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4233 #, c-format msgid "Use %s instead." msgstr "Verwenden Sie stattdessen %s." @@ -7038,8 +7070,8 @@ 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:182 commands/tablecmds.c:12858 commands/tablecmds.c:18092 -#: commands/tablecmds.c:18171 commands/trigger.c:657 +#: commands/copy.c:182 commands/tablecmds.c:12853 commands/tablecmds.c:18087 +#: commands/tablecmds.c:18166 commands/trigger.c:657 #: rewrite/rewriteHandler.c:978 rewrite/rewriteHandler.c:1013 #, c-format msgid "Column \"%s\" is a generated column." @@ -7191,7 +7223,7 @@ #: commands/tablecmds.c:3808 parser/parse_relation.c:3692 #: parser/parse_relation.c:3702 parser/parse_relation.c:3720 #: parser/parse_relation.c:3727 parser/parse_relation.c:3741 -#: utils/adt/tsvector_op.c:2857 +#: utils/adt/tsvector_op.c:2830 #, c-format msgid "column \"%s\" does not exist" msgstr "Spalte »%s« existiert nicht" @@ -7832,7 +7864,7 @@ msgstr "Datenverzeichnis mit der angegebenen OID %u existiert bereits" #: commands/dbcommands.c:1571 commands/dbcommands.c:1586 -#: utils/adt/pg_locale.c:2597 +#: utils/adt/pg_locale.c:2604 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "Kodierung »%s« stimmt nicht mit Locale »%s« überein" @@ -8016,7 +8048,7 @@ msgstr "ungültiges Argument für %s: »%s«" #: commands/dropcmds.c:96 commands/functioncmds.c:1382 -#: utils/adt/ruleutils.c:2910 +#: utils/adt/ruleutils.c:2912 #, c-format msgid "\"%s\" is an aggregate function" msgstr "»%s« ist eine Aggregatfunktion" @@ -8028,7 +8060,7 @@ #: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3892 #: commands/tablecmds.c:4050 commands/tablecmds.c:4102 -#: commands/tablecmds.c:17225 tcop/utility.c:1325 +#: commands/tablecmds.c:17220 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "Relation »%s« existiert nicht, wird übersprungen" @@ -8235,17 +8267,17 @@ 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" @@ -8553,7 +8585,7 @@ 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:3621 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 +#: commands/extension.c:3621 commands/typecmds.c:4049 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" @@ -9192,7 +9224,7 @@ 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:2028 commands/tablecmds.c:18259 commands/typecmds.c:811 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18254 commands/typecmds.c:811 #: parser/parse_expr.c:2794 parser/parse_type.c:568 parser/parse_utilcmd.c:3775 #: utils/adt/misc.c:630 #, c-format @@ -9229,8 +9261,8 @@ 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:2210 commands/tablecmds.c:18284 -#: commands/tablecmds.c:18290 commands/typecmds.c:2311 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18279 +#: commands/tablecmds.c:18285 commands/typecmds.c:2318 #, 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«" @@ -9246,7 +9278,7 @@ msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "Operatorklasse »%s« existiert nicht für Zugriffsmethode »%s«" -#: commands/indexcmds.c:2263 commands/typecmds.c:2299 +#: commands/indexcmds.c:2263 commands/typecmds.c:2306 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "Operatorklasse »%s« akzeptiert Datentyp %s nicht" @@ -9302,7 +9334,7 @@ msgid "while reindexing partitioned index \"%s.%s\"" msgstr "beim Reindizieren des partitionierten Index »%s.%s«" -#: commands/indexcmds.c:3399 commands/indexcmds.c:4283 +#: commands/indexcmds.c:3399 commands/indexcmds.c:4285 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "Tabelle »%s.%s« wurde neu indiziert" @@ -9332,12 +9364,12 @@ msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "nicht geteilte Relation kann nicht nach Tablespace »%s« verschoben werden" -#: commands/indexcmds.c:4264 commands/indexcmds.c:4276 +#: commands/indexcmds.c:4266 commands/indexcmds.c:4278 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Index »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:4266 commands/indexcmds.c:4285 +#: commands/indexcmds.c:4268 commands/indexcmds.c:4287 #, c-format msgid "%s." msgstr "%s." @@ -9679,10 +9711,10 @@ #: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:152 #: commands/tablecmds.c:1740 commands/tablecmds.c:2340 #: commands/tablecmds.c:3702 commands/tablecmds.c:6605 -#: commands/tablecmds.c:9670 commands/tablecmds.c:17836 -#: commands/tablecmds.c:17871 commands/trigger.c:317 commands/trigger.c:1333 +#: commands/tablecmds.c:9665 commands/tablecmds.c:17831 +#: commands/tablecmds.c:17866 commands/trigger.c:317 commands/trigger.c:1333 #: commands/trigger.c:1443 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" @@ -9920,7 +9952,7 @@ msgstr "In einer FOR-ALL-TABLES-Publikation können keine Tabellen hinzugefügt oder entfernt werden." #: commands/publicationcmds.c:1390 commands/publicationcmds.c:1429 -#: commands/publicationcmds.c:1966 utils/cache/lsyscache.c:3672 +#: commands/publicationcmds.c:1966 utils/cache/lsyscache.c:3747 #, c-format msgid "publication \"%s\" does not exist" msgstr "Publikation »%s« existiert nicht" @@ -10130,8 +10162,8 @@ msgid "cannot change ownership of identity sequence" msgstr "kann Eigentümer einer Identitätssequenz nicht ändern" -#: commands/sequence.c:1671 commands/tablecmds.c:14550 -#: commands/tablecmds.c:17245 +#: commands/sequence.c:1671 commands/tablecmds.c:14545 +#: commands/tablecmds.c:17240 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Sequenz »%s« ist mit Tabelle »%s« verknüpft." @@ -10201,12 +10233,12 @@ msgid "duplicate expression in statistics definition" msgstr "doppelter Ausdruck in Statistikdefinition" -#: commands/statscmds.c:649 commands/tablecmds.c:8653 +#: commands/statscmds.c:649 commands/tablecmds.c:8648 #, c-format msgid "statistics target %d is too low" msgstr "Statistikziel %d ist zu niedrig" -#: commands/statscmds.c:657 commands/tablecmds.c:8661 +#: commands/statscmds.c:657 commands/tablecmds.c:8656 #, c-format msgid "lowering statistics target to %d" msgstr "setze Statistikziel auf %d herab" @@ -10245,197 +10277,197 @@ msgid "subscription with %s must also set %s" msgstr "Subskription mit %s muss auch %s setzen" -#: commands/subscriptioncmds.c:506 +#: commands/subscriptioncmds.c:532 #, 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:538 +#: commands/subscriptioncmds.c:564 #, 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:626 +#: commands/subscriptioncmds.c:652 #, c-format msgid "permission denied to create subscription" msgstr "keine Berechtigung, um Subskription zu erzeugen" -#: commands/subscriptioncmds.c:627 +#: commands/subscriptioncmds.c:653 #, 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:758 commands/subscriptioncmds.c:891 -#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1371 -#: replication/logical/worker.c:4524 +#: commands/subscriptioncmds.c:784 commands/subscriptioncmds.c:917 +#: commands/subscriptioncmds.c:1550 replication/logical/tablesync.c:1372 +#: replication/logical/worker.c:4539 #, c-format msgid "could not connect to the publisher: %s" msgstr "konnte nicht mit dem Publikationsserver verbinden: %s" -#: commands/subscriptioncmds.c:829 +#: commands/subscriptioncmds.c:855 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "Replikations-Slot »%s« wurde auf dem Publikationsserver erzeugt" -#: commands/subscriptioncmds.c:841 +#: commands/subscriptioncmds.c:867 #, c-format msgid "subscription was created, but is not connected" msgstr "Subskription wurde erzeugt, ist aber nicht verbunden" -#: commands/subscriptioncmds.c:842 +#: commands/subscriptioncmds.c:868 #, 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:1109 commands/subscriptioncmds.c:1592 -#: commands/subscriptioncmds.c:1975 utils/cache/lsyscache.c:3722 +#: commands/subscriptioncmds.c:1135 commands/subscriptioncmds.c:1618 +#: commands/subscriptioncmds.c:2003 utils/cache/lsyscache.c:3797 #, c-format msgid "subscription \"%s\" does not exist" msgstr "Subskription »%s« existiert nicht" -#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 +#: commands/subscriptioncmds.c:1192 commands/subscriptioncmds.c:1271 #, c-format msgid "cannot set %s for enabled subscription" msgstr "für eine aktivierte Subskription kann nicht %s gesetzt werden" -#: commands/subscriptioncmds.c:1233 +#: commands/subscriptioncmds.c:1259 #, 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:1279 +#: commands/subscriptioncmds.c:1305 #, 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:1323 commands/subscriptioncmds.c:1374 +#: commands/subscriptioncmds.c:1349 commands/subscriptioncmds.c:1400 #, 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:1324 +#: commands/subscriptioncmds.c:1350 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Verwenden Sie ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 +#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1414 #, 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:1334 +#: commands/subscriptioncmds.c:1360 #, 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:1390 +#: commands/subscriptioncmds.c:1416 #, 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:1412 +#: commands/subscriptioncmds.c:1438 #, 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:1437 +#: commands/subscriptioncmds.c:1463 #, 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:1438 +#: commands/subscriptioncmds.c:1464 #, 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:1473 +#: commands/subscriptioncmds.c:1499 #, 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:1596 +#: commands/subscriptioncmds.c:1622 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "Subskription »%s« existiert nicht, wird übersprungen" -#: commands/subscriptioncmds.c:1865 +#: commands/subscriptioncmds.c:1893 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "Replikations-Slot »%s« auf dem Publikationsserver wurde gelöscht" -#: commands/subscriptioncmds.c:1874 commands/subscriptioncmds.c:1882 +#: commands/subscriptioncmds.c:1902 commands/subscriptioncmds.c:1910 #, 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:2007 +#: commands/subscriptioncmds.c:2035 #, c-format msgid "subscription with OID %u does not exist" msgstr "Subskription mit OID %u existiert nicht" -#: commands/subscriptioncmds.c:2081 commands/subscriptioncmds.c:2206 +#: commands/subscriptioncmds.c:2114 commands/subscriptioncmds.c:2239 #, 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:2117 +#: commands/subscriptioncmds.c:2150 #, 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:2119 +#: commands/subscriptioncmds.c:2152 #, 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:2122 +#: commands/subscriptioncmds.c:2155 #, 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:2228 replication/logical/tablesync.c:932 +#: commands/subscriptioncmds.c:2261 replication/logical/tablesync.c:932 #: replication/pgoutput/pgoutput.c:1159 #, 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:2278 +#: commands/subscriptioncmds.c:2311 #, 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:2281 +#: commands/subscriptioncmds.c:2314 #, 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:2312 +#: commands/subscriptioncmds.c:2345 #, c-format msgid "publication name \"%s\" used more than once" msgstr "Publikationsname »%s« mehrmals angegeben" -#: commands/subscriptioncmds.c:2356 +#: commands/subscriptioncmds.c:2389 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "Publikation »%s« ist bereits in Subskription »%s«" -#: commands/subscriptioncmds.c:2370 +#: commands/subscriptioncmds.c:2403 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "Publikation »%s« ist nicht in Subskription »%s«" -#: commands/subscriptioncmds.c:2381 +#: commands/subscriptioncmds.c:2414 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "kann nicht alle Publikationen von einer Subskription löschen" -#: commands/subscriptioncmds.c:2438 +#: commands/subscriptioncmds.c:2471 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s erfordert einen Boole’schen Wert oder »parallel«" @@ -10496,7 +10528,7 @@ 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:279 commands/tablecmds.c:303 commands/tablecmds.c:19891 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19886 #: parser/parse_utilcmd.c:2255 #, c-format msgid "index \"%s\" does not exist" @@ -10520,8 +10552,8 @@ msgid "Use DROP TYPE to remove a type." msgstr "Verwenden Sie DROP TYPE, um einen Typen zu löschen." -#: commands/tablecmds.c:291 commands/tablecmds.c:14389 -#: commands/tablecmds.c:16950 +#: commands/tablecmds.c:291 commands/tablecmds.c:14384 +#: commands/tablecmds.c:16945 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "Fremdtabelle »%s« existiert nicht" @@ -10545,7 +10577,7 @@ msgid "cannot create temporary table within security-restricted operation" msgstr "kann temporäre Tabelle nicht in einer sicherheitsbeschränkten Operation erzeugen" -#: commands/tablecmds.c:801 commands/tablecmds.c:15809 +#: commands/tablecmds.c:801 commands/tablecmds.c:15804 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "von der Relation »%s« würde mehrmals geerbt werden" @@ -10570,7 +10602,7 @@ msgid "Table \"%s\" contains indexes that are unique." msgstr "Tabelle »%s« enthält Unique Indexe." -#: commands/tablecmds.c:1338 commands/tablecmds.c:13382 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13377 #, c-format msgid "too many array dimensions" msgstr "zu viele Array-Dimensionen" @@ -10621,7 +10653,7 @@ msgid "cannot truncate temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht leeren" -#: commands/tablecmds.c:2606 commands/tablecmds.c:15706 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15701 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "von partitionierter Tabelle »%s« kann nicht geerbt werden" @@ -10642,18 +10674,18 @@ 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:2640 commands/tablecmds.c:15685 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15680 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "von temporärer Relation »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2650 commands/tablecmds.c:15693 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15688 #, 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:2791 commands/tablecmds.c:2845 -#: commands/tablecmds.c:13065 parser/parse_utilcmd.c:1265 +#: commands/tablecmds.c:13060 parser/parse_utilcmd.c:1265 #: parser/parse_utilcmd.c:1308 parser/parse_utilcmd.c:1735 #: parser/parse_utilcmd.c:1843 #, c-format @@ -10754,7 +10786,7 @@ msgstr "für Spalte »%s« besteht ein Sortierfolgenkonflikt" #: commands/tablecmds.c:3164 commands/tablecmds.c:3326 -#: commands/tablecmds.c:7080 parser/parse_expr.c:4771 +#: commands/tablecmds.c:7080 parser/parse_expr.c:4781 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "»%s« gegen »%s«" @@ -10947,12 +10979,12 @@ msgid "cannot add column to a partition" msgstr "zu einer Partition kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:7072 commands/tablecmds.c:15924 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15919 #, 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:7078 commands/tablecmds.c:15930 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15925 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Sortierfolge für Spalte »%s«" @@ -10982,15 +11014,15 @@ msgid "column \"%s\" of relation \"%s\" already exists" msgstr "Spalte »%s« von Relation »%s« existiert bereits" -#: commands/tablecmds.c:7546 commands/tablecmds.c:12693 +#: commands/tablecmds.c:7546 commands/tablecmds.c:12688 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "Constraint kann nicht nur von der partitionierten Tabelle entfernt werden, wenn Partitionen existieren" #: commands/tablecmds.c:7547 commands/tablecmds.c:7861 #: commands/tablecmds.c:8039 commands/tablecmds.c:8146 -#: commands/tablecmds.c:8263 commands/tablecmds.c:9082 -#: commands/tablecmds.c:12694 +#: commands/tablecmds.c:8263 commands/tablecmds.c:9077 +#: commands/tablecmds.c:12689 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Lassen Sie das Schlüsselwort ONLY weg." @@ -10998,10 +11030,10 @@ #: commands/tablecmds.c:7583 commands/tablecmds.c:7787 #: commands/tablecmds.c:7929 commands/tablecmds.c:8061 #: commands/tablecmds.c:8190 commands/tablecmds.c:8284 -#: commands/tablecmds.c:8385 commands/tablecmds.c:8542 -#: commands/tablecmds.c:8695 commands/tablecmds.c:8776 -#: commands/tablecmds.c:8910 commands/tablecmds.c:12847 -#: commands/tablecmds.c:14412 commands/tablecmds.c:17039 +#: commands/tablecmds.c:8385 commands/tablecmds.c:8537 +#: commands/tablecmds.c:8690 commands/tablecmds.c:8771 +#: commands/tablecmds.c:8905 commands/tablecmds.c:12842 +#: commands/tablecmds.c:14407 commands/tablecmds.c:17034 #, c-format msgid "cannot alter system column \"%s\"" msgstr "Systemspalte »%s« kann nicht geändert werden" @@ -11026,7 +11058,7 @@ msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "Spalte »%s« ist in Elterntabelle als NOT NULL markiert" -#: commands/tablecmds.c:7858 commands/tablecmds.c:9566 +#: commands/tablecmds.c:7858 commands/tablecmds.c:9561 #, c-format msgid "constraint must be added to child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen hinzugefügt werden" @@ -11101,839 +11133,839 @@ msgid "column \"%s\" of relation \"%s\" is not a generated column" msgstr "Spalte »%s« von Relation »%s« ist keine generierte Spalte" -#: commands/tablecmds.c:8489 +#: commands/tablecmds.c:8484 #, 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:8511 +#: commands/tablecmds.c:8506 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "Generierungsausdruck von vererbter Spalte kann nicht gelöscht werden" -#: commands/tablecmds.c:8550 +#: commands/tablecmds.c:8545 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "Spalte »%s« von Relation »%s« ist keine gespeicherte generierte Spalte" -#: commands/tablecmds.c:8555 +#: commands/tablecmds.c:8550 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "Spalte »%s« von Relation »%s« ist keine gespeicherte generierte Spalte, wird übersprungen" -#: commands/tablecmds.c:8633 +#: commands/tablecmds.c:8628 #, 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:8685 +#: commands/tablecmds.c:8680 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "Spalte Nummer %d von Relation »%s« existiert nicht" -#: commands/tablecmds.c:8704 +#: commands/tablecmds.c:8699 #, 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:8709 +#: commands/tablecmds.c:8704 #, 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:8711 +#: commands/tablecmds.c:8706 #, c-format msgid "Alter statistics on table column instead." msgstr "Ändern Sie stattdessen die Statistiken für die Tabellenspalte." -#: commands/tablecmds.c:8957 +#: commands/tablecmds.c:8952 #, c-format msgid "cannot drop column from typed table" msgstr "aus einer getypten Tabelle können keine Spalten gelöscht werden" -#: commands/tablecmds.c:9020 +#: commands/tablecmds.c:9015 #, 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:9033 +#: commands/tablecmds.c:9028 #, c-format msgid "cannot drop system column \"%s\"" msgstr "Systemspalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:9043 +#: commands/tablecmds.c:9038 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "geerbte Spalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:9056 +#: commands/tablecmds.c:9051 #, 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:9081 +#: commands/tablecmds.c:9076 #, 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:9286 +#: commands/tablecmds.c:9281 #, 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:9311 +#: commands/tablecmds.c:9306 #, 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:9648 +#: commands/tablecmds.c:9643 #, 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:9654 +#: commands/tablecmds.c:9649 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "Hinzufügen von Fremdschlüssel mit NOT VALID nicht möglich für partitionierte Tabelle »%s« verweisend auf Relation »%s«" -#: commands/tablecmds.c:9657 +#: commands/tablecmds.c:9652 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." -#: commands/tablecmds.c:9664 commands/tablecmds.c:10146 +#: commands/tablecmds.c:9659 commands/tablecmds.c:10141 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "Relation »%s«, auf die verwiesen wird, ist keine Tabelle" -#: commands/tablecmds.c:9687 +#: commands/tablecmds.c:9682 #, 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:9694 +#: commands/tablecmds.c:9689 #, 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:9700 +#: commands/tablecmds.c:9695 #, 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:9704 +#: commands/tablecmds.c:9699 #, 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:9769 commands/tablecmds.c:9775 +#: commands/tablecmds.c:9764 commands/tablecmds.c:9770 #, 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:9791 +#: commands/tablecmds.c:9786 #, 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:9898 +#: commands/tablecmds.c:9893 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "Fremdschlüssel-Constraint »%s« kann nicht implementiert werden" -#: commands/tablecmds.c:9900 +#: commands/tablecmds.c:9895 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Schlüsselspalten »%s« und »%s« haben inkompatible Typen: %s und %s." -#: commands/tablecmds.c:10075 +#: commands/tablecmds.c:10070 #, 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:10446 commands/tablecmds.c:10873 +#: commands/tablecmds.c:10441 commands/tablecmds.c:10868 #: parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:945 #, 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:10856 +#: commands/tablecmds.c:10851 #, 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:11457 commands/tablecmds.c:11738 -#: commands/tablecmds.c:12650 commands/tablecmds.c:12724 +#: commands/tablecmds.c:11452 commands/tablecmds.c:11733 +#: commands/tablecmds.c:12645 commands/tablecmds.c:12719 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "Constraint »%s« von Relation »%s« existiert nicht" -#: commands/tablecmds.c:11464 +#: commands/tablecmds.c:11459 #, 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:11502 +#: commands/tablecmds.c:11497 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:11505 +#: commands/tablecmds.c:11500 #, 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:11507 +#: commands/tablecmds.c:11502 #, 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:11746 +#: commands/tablecmds.c:11741 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "Constraint »%s« von Relation »%s« ist kein Fremdschlüssel- oder Check-Constraint" -#: commands/tablecmds.c:11823 +#: commands/tablecmds.c:11818 #, c-format msgid "constraint must be validated on child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen validiert werden" -#: commands/tablecmds.c:11910 +#: commands/tablecmds.c:11905 #, 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:11916 +#: commands/tablecmds.c:11911 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "Systemspalten können nicht in Fremdschlüsseln verwendet werden" -#: commands/tablecmds.c:11920 +#: commands/tablecmds.c:11915 #, 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:11985 +#: commands/tablecmds.c:11980 #, 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:12002 +#: commands/tablecmds.c:11997 #, 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:12070 +#: commands/tablecmds.c:12065 #, 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:12162 +#: commands/tablecmds.c:12157 #, 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:12167 +#: commands/tablecmds.c:12162 #, 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:12606 +#: commands/tablecmds.c:12601 #, 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:12656 +#: commands/tablecmds.c:12651 #, 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:12831 +#: commands/tablecmds.c:12826 #, c-format msgid "cannot alter column type of typed table" msgstr "Spaltentyp einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:12857 +#: commands/tablecmds.c:12852 #, 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:12868 +#: commands/tablecmds.c:12863 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht ändern" -#: commands/tablecmds.c:12877 +#: commands/tablecmds.c:12872 #, 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:12927 +#: commands/tablecmds.c:12922 #, 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:12930 +#: commands/tablecmds.c:12925 #, 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:12934 +#: commands/tablecmds.c:12929 #, 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:12938 +#: commands/tablecmds.c:12933 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Sie müssen möglicherweise »USING %s::%s« angeben." -#: commands/tablecmds.c:13037 +#: commands/tablecmds.c:13032 #, 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:13066 +#: commands/tablecmds.c:13061 #, 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:13077 +#: commands/tablecmds.c:13072 #, 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:13202 +#: commands/tablecmds.c:13197 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "Typ der Spalte »%s« kann nicht zweimal geändert werden" -#: commands/tablecmds.c:13240 +#: commands/tablecmds.c:13235 #, 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:13245 +#: commands/tablecmds.c:13240 #, 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:13549 +#: commands/tablecmds.c:13544 #, 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:13550 commands/tablecmds.c:13565 -#: commands/tablecmds.c:13585 commands/tablecmds.c:13604 -#: commands/tablecmds.c:13663 +#: commands/tablecmds.c:13545 commands/tablecmds.c:13560 +#: commands/tablecmds.c:13580 commands/tablecmds.c:13599 +#: commands/tablecmds.c:13658 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s hängt von Spalte »%s« ab" -#: commands/tablecmds.c:13564 +#: commands/tablecmds.c:13559 #, 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:13584 +#: commands/tablecmds.c:13579 #, 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:13603 +#: commands/tablecmds.c:13598 #, 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:13634 +#: commands/tablecmds.c:13629 #, 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:13635 +#: commands/tablecmds.c:13630 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Spalte »%s« wird von generierter Spalte »%s« verwendet." -#: commands/tablecmds.c:13662 +#: commands/tablecmds.c:13657 #, 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:14520 commands/tablecmds.c:14532 +#: commands/tablecmds.c:14515 commands/tablecmds.c:14527 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "kann Eigentümer des Index »%s« nicht ändern" -#: commands/tablecmds.c:14522 commands/tablecmds.c:14534 +#: commands/tablecmds.c:14517 commands/tablecmds.c:14529 #, 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:14548 +#: commands/tablecmds.c:14543 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "kann Eigentümer der Sequenz »%s« nicht ändern" -#: commands/tablecmds.c:14573 +#: commands/tablecmds.c:14568 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "kann Eigentümer der Relation »%s« nicht ändern" -#: commands/tablecmds.c:15040 +#: commands/tablecmds.c:15035 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "mehrere SET TABLESPACE Unterbefehle sind ungültig" -#: commands/tablecmds.c:15117 +#: commands/tablecmds.c:15112 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "für Relation »%s« können keine Optionen gesetzt werden" -#: commands/tablecmds.c:15151 commands/view.c:440 +#: commands/tablecmds.c:15146 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:15402 +#: commands/tablecmds.c:15397 #, 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:15414 +#: commands/tablecmds.c:15409 #, 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:15506 +#: commands/tablecmds.c:15501 #, 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:15522 +#: commands/tablecmds.c:15517 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "keine passenden Relationen in Tablespace »%s« gefunden" -#: commands/tablecmds.c:15644 +#: commands/tablecmds.c:15639 #, c-format msgid "cannot change inheritance of typed table" msgstr "Vererbung einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:15649 commands/tablecmds.c:16149 +#: commands/tablecmds.c:15644 commands/tablecmds.c:16144 #, c-format msgid "cannot change inheritance of a partition" msgstr "Vererbung einer Partition kann nicht geändert werden" -#: commands/tablecmds.c:15654 +#: commands/tablecmds.c:15649 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "Vererbung einer partitionierten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:15700 +#: commands/tablecmds.c:15695 #, 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:15713 +#: commands/tablecmds.c:15708 #, c-format msgid "cannot inherit from a partition" msgstr "von einer Partition kann nicht geerbt werden" -#: commands/tablecmds.c:15735 commands/tablecmds.c:18603 +#: commands/tablecmds.c:15730 commands/tablecmds.c:18598 #, c-format msgid "circular inheritance not allowed" msgstr "zirkuläre Vererbung ist nicht erlaubt" -#: commands/tablecmds.c:15736 commands/tablecmds.c:18604 +#: commands/tablecmds.c:15731 commands/tablecmds.c:18599 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "»%s« ist schon von »%s« abgeleitet." -#: commands/tablecmds.c:15749 +#: commands/tablecmds.c:15744 #, 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:15751 +#: commands/tablecmds.c:15746 #, 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:15940 +#: commands/tablecmds.c:15935 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "Spalte »%s« in abgeleiteter Tabelle muss als NOT NULL markiert sein" -#: commands/tablecmds.c:15949 +#: commands/tablecmds.c:15944 #, 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:15953 +#: commands/tablecmds.c:15948 #, 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:15991 +#: commands/tablecmds.c:15986 #, c-format msgid "child table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:16072 +#: commands/tablecmds.c:16067 #, 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:16079 +#: commands/tablecmds.c:16074 #, 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:16089 +#: commands/tablecmds.c:16084 #, 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:16127 +#: commands/tablecmds.c:16122 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "Constraint »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:16213 +#: commands/tablecmds.c:16208 #, 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:16242 commands/tablecmds.c:16288 +#: commands/tablecmds.c:16237 commands/tablecmds.c:16283 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "Relation »%s« ist keine Partition von Relation »%s«" -#: commands/tablecmds.c:16294 +#: commands/tablecmds.c:16289 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "Relation »%s« ist keine Basisrelation von Relation »%s«" -#: commands/tablecmds.c:16521 +#: commands/tablecmds.c:16516 #, c-format msgid "typed tables cannot inherit" msgstr "getypte Tabellen können nicht erben" -#: commands/tablecmds.c:16551 +#: commands/tablecmds.c:16546 #, c-format msgid "table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in Tabelle" -#: commands/tablecmds.c:16562 +#: commands/tablecmds.c:16557 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "Tabelle hat Spalte »%s«, aber Typ benötigt »%s«" -#: commands/tablecmds.c:16571 +#: commands/tablecmds.c:16566 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:16585 +#: commands/tablecmds.c:16580 #, c-format msgid "table has extra column \"%s\"" msgstr "Tabelle hat zusätzliche Spalte »%s«" -#: commands/tablecmds.c:16637 +#: commands/tablecmds.c:16632 #, c-format msgid "\"%s\" is not a typed table" msgstr "»%s« ist keine getypte Tabelle" -#: commands/tablecmds.c:16811 +#: commands/tablecmds.c:16806 #, 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:16817 +#: commands/tablecmds.c:16812 #, 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:16823 +#: commands/tablecmds.c:16818 #, 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:16829 +#: commands/tablecmds.c:16824 #, 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:16846 +#: commands/tablecmds.c:16841 #, 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:16853 +#: commands/tablecmds.c:16848 #, 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:17105 +#: commands/tablecmds.c:17100 #, 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:17129 +#: commands/tablecmds.c:17124 #, 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:17131 +#: commands/tablecmds.c:17126 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ungeloggte Relationen können nicht repliziert werden." -#: commands/tablecmds.c:17176 +#: commands/tablecmds.c:17171 #, 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:17186 +#: commands/tablecmds.c:17181 #, 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:17244 +#: commands/tablecmds.c:17239 #, 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:17352 +#: commands/tablecmds.c:17347 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "Relation »%s« existiert bereits in Schema »%s«" -#: commands/tablecmds.c:17777 +#: commands/tablecmds.c:17772 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "»%s« ist keine Tabelle oder materialisierte Sicht" -#: commands/tablecmds.c:17930 +#: commands/tablecmds.c:17925 #, c-format msgid "\"%s\" is not a composite type" msgstr "»%s« ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:17960 +#: commands/tablecmds.c:17955 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "kann Schema des Index »%s« nicht ändern" -#: commands/tablecmds.c:17962 commands/tablecmds.c:17976 +#: commands/tablecmds.c:17957 commands/tablecmds.c:17971 #, c-format msgid "Change the schema of the table instead." msgstr "Ändern Sie stattdessen das Schema der Tabelle." -#: commands/tablecmds.c:17966 +#: commands/tablecmds.c:17961 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "kann Schema des zusammengesetzten Typs »%s« nicht ändern" -#: commands/tablecmds.c:17974 +#: commands/tablecmds.c:17969 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "kann Schema der TOAST-Tabelle »%s« nicht ändern" -#: commands/tablecmds.c:18006 +#: commands/tablecmds.c:18001 #, 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:18072 +#: commands/tablecmds.c:18067 #, 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:18080 +#: commands/tablecmds.c:18075 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "Systemspalte »%s« kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:18091 commands/tablecmds.c:18170 +#: commands/tablecmds.c:18086 commands/tablecmds.c:18165 #, c-format msgid "cannot use generated column in partition key" msgstr "generierte Spalte kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:18160 +#: commands/tablecmds.c:18155 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "Partitionierungsschlüsselausdruck kann nicht auf Systemspalten verweisen" -#: commands/tablecmds.c:18221 +#: commands/tablecmds.c:18216 #, 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:18230 +#: commands/tablecmds.c:18225 #, c-format msgid "cannot use constant expression as partition key" msgstr "Partitionierungsschlüssel kann kein konstanter Ausdruck sein" -#: commands/tablecmds.c:18251 +#: commands/tablecmds.c:18246 #, 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:18286 +#: commands/tablecmds.c:18281 #, 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:18292 +#: commands/tablecmds.c:18287 #, 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:18543 +#: commands/tablecmds.c:18538 #, c-format msgid "\"%s\" is already a partition" msgstr "»%s« ist bereits eine Partition" -#: commands/tablecmds.c:18549 +#: commands/tablecmds.c:18544 #, c-format msgid "cannot attach a typed table as partition" msgstr "eine getypte Tabelle kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:18565 +#: commands/tablecmds.c:18560 #, c-format msgid "cannot attach inheritance child as partition" msgstr "ein Vererbungskind kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:18579 +#: commands/tablecmds.c:18574 #, 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:18613 +#: commands/tablecmds.c:18608 #, 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:18621 +#: commands/tablecmds.c:18616 #, 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:18629 +#: commands/tablecmds.c:18624 #, 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:18636 +#: commands/tablecmds.c:18631 #, 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:18656 +#: commands/tablecmds.c:18651 #, 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:18658 +#: commands/tablecmds.c:18653 #, c-format msgid "The new partition may not contain an identity column." msgstr "Die neue Partition darf keine Identitätsspalte enthalten." -#: commands/tablecmds.c:18666 +#: commands/tablecmds.c:18661 #, 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:18669 +#: commands/tablecmds.c:18664 #, 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:18681 +#: commands/tablecmds.c:18676 #, 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:18683 +#: commands/tablecmds.c:18678 #, 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:18859 +#: commands/tablecmds.c:18854 #, 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:18862 +#: commands/tablecmds.c:18857 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Partitionierte Tabelle »%s« enthält Unique-Indexe." -#: commands/tablecmds.c:19185 +#: commands/tablecmds.c:19180 #, 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:19297 +#: commands/tablecmds.c:19292 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "partitionierte Tabelle »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:19303 +#: commands/tablecmds.c:19298 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "Partition »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:19928 commands/tablecmds.c:19948 -#: commands/tablecmds.c:19969 commands/tablecmds.c:19988 -#: commands/tablecmds.c:20038 +#: commands/tablecmds.c:19923 commands/tablecmds.c:19943 +#: commands/tablecmds.c:19964 commands/tablecmds.c:19983 +#: commands/tablecmds.c:20033 #, 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:19931 +#: commands/tablecmds.c:19926 #, 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:19951 +#: commands/tablecmds.c:19946 #, 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:19972 +#: commands/tablecmds.c:19967 #, c-format msgid "The index definitions do not match." msgstr "Die Indexdefinitionen stimmen nicht überein." -#: commands/tablecmds.c:19991 +#: commands/tablecmds.c:19986 #, 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:20041 +#: commands/tablecmds.c:20036 #, 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:20277 +#: commands/tablecmds.c:20272 #, c-format msgid "column data type %s does not support compression" msgstr "Spaltendatentyp %s unterstützt keine Komprimierung" -#: commands/tablecmds.c:20284 +#: commands/tablecmds.c:20279 #, c-format msgid "invalid compression method \"%s\"" msgstr "ungültige Komprimierungsmethode »%s«" -#: commands/tablecmds.c:20310 +#: commands/tablecmds.c:20305 #, c-format msgid "invalid storage type \"%s\"" msgstr "ungültiger Storage-Typ »%s«" -#: commands/tablecmds.c:20320 +#: commands/tablecmds.c:20315 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "Spaltendatentyp %s kann nur Storage-Typ PLAIN" @@ -12449,7 +12481,7 @@ 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:1460 commands/typecmds.c:4480 +#: commands/typecmds.c:331 commands/typecmds.c:1467 commands/typecmds.c:4487 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "Typ-Attribut »%s« nicht erkannt" @@ -12469,7 +12501,7 @@ msgid "alignment \"%s\" not recognized" msgstr "Ausrichtung »%s« nicht erkannt" -#: commands/typecmds.c:454 commands/typecmds.c:4354 +#: commands/typecmds.c:454 commands/typecmds.c:4361 #, c-format msgid "storage \"%s\" not recognized" msgstr "Storage-Typ »%s« nicht erkannt" @@ -12514,273 +12546,273 @@ msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "Check-Constraints für Domänen können nicht als NO INHERIT markiert werden" -#: commands/typecmds.c:980 commands/typecmds.c:2940 +#: commands/typecmds.c:980 commands/typecmds.c:2947 #, c-format msgid "unique constraints not possible for domains" msgstr "Unique-Constraints sind nicht für Domänen möglich" -#: commands/typecmds.c:986 commands/typecmds.c:2946 +#: commands/typecmds.c:986 commands/typecmds.c:2953 #, c-format msgid "primary key constraints not possible for domains" msgstr "Primärschlüssel-Constraints sind nicht fürDomänen möglich" -#: commands/typecmds.c:992 commands/typecmds.c:2952 +#: commands/typecmds.c:992 commands/typecmds.c:2959 #, c-format msgid "exclusion constraints not possible for domains" msgstr "Exclusion-Constraints sind nicht für Domänen möglich" -#: commands/typecmds.c:998 commands/typecmds.c:2958 +#: commands/typecmds.c:998 commands/typecmds.c:2965 #, c-format msgid "foreign key constraints not possible for domains" msgstr "Fremdschlüssel-Constraints sind nicht für Domänen möglich" -#: commands/typecmds.c:1007 commands/typecmds.c:2967 +#: commands/typecmds.c:1007 commands/typecmds.c:2974 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "Setzen des Constraint-Modus wird für Domänen nicht unterstützt" -#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2563 #, c-format msgid "%s is not an enum" msgstr "»%s« ist kein Enum" -#: commands/typecmds.c:1468 +#: commands/typecmds.c:1475 #, c-format msgid "type attribute \"subtype\" is required" msgstr "Typ-Attribut »subtype« muss angegeben werden" -#: commands/typecmds.c:1473 +#: commands/typecmds.c:1480 #, c-format msgid "range subtype cannot be %s" msgstr "Bereichtsuntertyp kann nicht %s sein" -#: commands/typecmds.c:1492 +#: commands/typecmds.c:1499 #, 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:1502 +#: commands/typecmds.c:1509 #, 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:1503 +#: commands/typecmds.c:1510 #, 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:1975 +#: commands/typecmds.c:1982 #, c-format msgid "type input function %s has multiple matches" msgstr "Typeingabefunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:1993 +#: commands/typecmds.c:2000 #, c-format msgid "type input function %s must return type %s" msgstr "Typeingabefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2009 +#: commands/typecmds.c:2016 #, c-format msgid "type input function %s should not be volatile" msgstr "Typeingabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2037 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s must return type %s" msgstr "Typausgabefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2044 +#: commands/typecmds.c:2051 #, c-format msgid "type output function %s should not be volatile" msgstr "Typausgabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2073 +#: commands/typecmds.c:2080 #, c-format msgid "type receive function %s has multiple matches" msgstr "Typempfangsfunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:2091 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s must return type %s" msgstr "Typempfangsfunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2098 +#: commands/typecmds.c:2105 #, c-format msgid "type receive function %s should not be volatile" msgstr "Typempfangsfunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2126 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s must return type %s" msgstr "Typsendefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2133 +#: commands/typecmds.c:2140 #, c-format msgid "type send function %s should not be volatile" msgstr "Typsendefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2160 +#: commands/typecmds.c:2167 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2167 +#: commands/typecmds.c:2174 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "Typmodifikatoreingabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2194 +#: commands/typecmds.c:2201 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2201 +#: commands/typecmds.c:2208 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "Typmodifikatorausgabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2228 +#: commands/typecmds.c:2235 #, c-format msgid "type analyze function %s must return type %s" msgstr "Typanalysefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2257 +#: commands/typecmds.c:2264 #, c-format msgid "type subscripting function %s must return type %s" msgstr "Typ-Subscript-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2267 +#: commands/typecmds.c:2274 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "benutzerdefinierte Typen können Subscript-Funktion %s nicht verwenden" -#: commands/typecmds.c:2313 +#: commands/typecmds.c:2320 #, 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:2344 +#: commands/typecmds.c:2351 #, c-format msgid "range canonical function %s must return range type" msgstr "Bereichstyp-Canonical-Funktion %s muss Bereichstyp zurückgeben" -#: commands/typecmds.c:2350 +#: commands/typecmds.c:2357 #, c-format msgid "range canonical function %s must be immutable" msgstr "Bereichstyp-Canonical-Funktion %s muss »immutable« sein" -#: commands/typecmds.c:2386 +#: commands/typecmds.c:2393 #, 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:2393 +#: commands/typecmds.c:2400 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "Bereichstyp-Untertyp-Diff-Funktion %s muss »immutable« sein" -#: commands/typecmds.c:2420 +#: commands/typecmds.c:2427 #, 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:2453 +#: commands/typecmds.c:2460 #, 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:2486 +#: commands/typecmds.c:2493 #, 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:2868 commands/typecmds.c:3093 +#: commands/typecmds.c:2875 commands/typecmds.c:3100 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "Constraint »%s« von Domäne »%s« existiert nicht" -#: commands/typecmds.c:2872 +#: commands/typecmds.c:2879 #, 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:3100 +#: commands/typecmds.c:3107 #, 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:3180 +#: commands/typecmds.c:3187 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "Spalte »%s« von Tabelle »%s« enthält NULL-Werte" -#: commands/typecmds.c:3269 +#: commands/typecmds.c:3276 #, 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:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 -#: commands/typecmds.c:4073 +#: commands/typecmds.c:3505 commands/typecmds.c:3779 commands/typecmds.c:3864 +#: commands/typecmds.c:4080 #, c-format msgid "%s is not a domain" msgstr "%s ist keine Domäne" -#: commands/typecmds.c:3532 commands/typecmds.c:3686 +#: commands/typecmds.c:3539 commands/typecmds.c:3693 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "Constraint »%s« für Domäne »%s« existiert bereits" -#: commands/typecmds.c:3583 +#: commands/typecmds.c:3590 #, 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:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 +#: commands/typecmds.c:3791 commands/typecmds.c:3876 commands/typecmds.c:4230 #, c-format msgid "%s is a table's row type" msgstr "%s ist der Zeilentyp einer Tabelle" -#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 +#: commands/typecmds.c:3801 commands/typecmds.c:3886 commands/typecmds.c:4128 #, c-format msgid "cannot alter array type %s" msgstr "Array-Typ %s kann nicht verändert werden" -#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 +#: commands/typecmds.c:3803 commands/typecmds.c:3888 commands/typecmds.c:4130 #, 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:3892 +#: commands/typecmds.c:3899 #, c-format msgid "cannot alter multirange type %s" msgstr "Multirange-Typ %s kann nicht verändert werden" -#: commands/typecmds.c:3895 +#: commands/typecmds.c:3902 #, 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:4202 +#: commands/typecmds.c:4209 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "Typ %s existiert bereits in Schema »%s«" -#: commands/typecmds.c:4382 +#: commands/typecmds.c:4389 #, 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:4475 +#: commands/typecmds.c:4482 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "Typ-Attribut »%s« kann nicht geändert werden" -#: commands/typecmds.c:4493 +#: commands/typecmds.c:4500 #, c-format msgid "must be superuser to alter a type" msgstr "nur Superuser können Typen ändern" -#: commands/typecmds.c:4514 commands/typecmds.c:4523 +#: commands/typecmds.c:4521 commands/typecmds.c:4530 #, c-format msgid "%s is not a base type" msgstr "%s ist kein Basistyp" @@ -13210,7 +13242,7 @@ 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:1152 commands/vacuum.c:1157 +#: commands/vacuum.c:1152 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -13224,6 +13256,15 @@ 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:1157 +#, 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:1912 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" @@ -13581,8 +13622,8 @@ msgstr "Tabelle hat Typ %s, aber Anfrage erwartet %s." #: executor/execExprInterp.c:2115 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 -#: utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1745 +#: utils/cache/typcache.c:1904 utils/cache/typcache.c:2051 #: utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" @@ -13604,8 +13645,8 @@ msgstr "Arrayelement mit Typ %s kann nicht in ARRAY-Konstrukt mit Elementtyp %s verwendet werden." #: executor/execExprInterp.c:2953 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5599 -#: utils/adt/arrayfuncs.c:6118 utils/adt/arraysubs.c:150 +#: utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5608 +#: utils/adt/arrayfuncs.c:6125 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" @@ -13624,7 +13665,7 @@ #: utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 #: utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 #: utils/adt/arrayfuncs.c:3533 utils/adt/arrayfuncs.c:5371 -#: utils/adt/arrayfuncs.c:6210 utils/adt/arrayfuncs.c:6554 +#: utils/adt/arrayfuncs.c:6217 utils/adt/arrayfuncs.c:6561 #: utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 #: utils/adt/arrayutils.c:99 #, c-format @@ -13874,7 +13915,7 @@ #: executor/execReplication.c:352 parser/parse_cte.c:303 #: parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1343 #: utils/adt/array_userfuncs.c:1486 utils/adt/arrayfuncs.c:3858 -#: utils/adt/arrayfuncs.c:4413 utils/adt/arrayfuncs.c:6434 +#: utils/adt/arrayfuncs.c:4413 utils/adt/arrayfuncs.c:6441 #: utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" @@ -14092,7 +14133,7 @@ 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:239 +#: executor/nodeIndexonlyscan.c:221 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "verlustbehaftete Abstandsfunktionen werden in Index-Only-Scans nicht unterstützt" @@ -14840,7 +14881,7 @@ msgid "unexpected end after backslash" msgstr "unerwartetes Ende nach Backslash" -#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 +#: jsonpath_scan.l:201 repl_scanner.l:215 scan.l:756 msgid "unterminated quoted string" msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" @@ -15959,12 +16000,12 @@ 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:203 libpq/crypt.c:245 libpq/crypt.c:265 +#: libpq/crypt.c:204 libpq/crypt.c:246 libpq/crypt.c:267 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Passwort stimmt nicht überein für Benutzer »%s«." -#: libpq/crypt.c:284 +#: libpq/crypt.c:286 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Passwort von Benutzer »%s« hat unbekanntes Format." @@ -16455,7 +16496,7 @@ msgid "could not receive data from client: %m" msgstr "konnte Daten vom Client nicht empfangen: %m" -#: libpq/pqcomm.c:1149 tcop/postgres.c:4537 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4553 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "Verbindung wird abgebrochen, weil Protokollsynchronisierung verloren wurde" @@ -16911,7 +16952,7 @@ msgid "could not implement %s" msgstr "konnte %s nicht implementieren" -#: optimizer/util/clauses.c:4962 +#: optimizer/util/clauses.c:4973 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL-Funktion »%s« beim Inlining" @@ -17774,7 +17815,7 @@ #: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 #: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 #: parser/parse_expr.c:2155 parser/parse_expr.c:2763 parser/parse_expr.c:3414 -#: parser/parse_expr.c:3643 parser/parse_target.c:998 +#: parser/parse_expr.c:3643 parser/parse_expr.c:4079 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "kann Typ %s nicht in Typ %s umwandeln" @@ -18391,49 +18432,49 @@ 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:4081 +#: parser/parse_expr.c:4091 #, 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:4101 +#: parser/parse_expr.c:4111 #, 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:4127 parser/parse_expr.c:4248 +#: parser/parse_expr.c:4137 parser/parse_expr.c:4258 #, 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:4129 +#: parser/parse_expr.c:4139 #, c-format msgid "Try returning json or jsonb." msgstr "Versuchen Sie json oder jsonb zurückzugeben." -#: parser/parse_expr.c:4177 +#: parser/parse_expr.c:4187 #, 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:4251 +#: parser/parse_expr.c:4261 #, c-format msgid "Try returning a string type or bytea." msgstr "Versuchen Sie einen Zeichenkettentyp oder bytea zurückzugeben." -#: parser/parse_expr.c:4319 +#: parser/parse_expr.c:4329 #, 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:4332 +#: parser/parse_expr.c:4342 #, 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:4346 parser/parse_expr.c:4375 parser/parse_expr.c:4406 -#: parser/parse_expr.c:4432 parser/parse_expr.c:4458 +#: parser/parse_expr.c:4356 parser/parse_expr.c:4385 parser/parse_expr.c:4416 +#: parser/parse_expr.c:4442 parser/parse_expr.c:4468 #: parser/parse_jsontable.c:94 #, c-format msgid "invalid %s behavior" @@ -18441,7 +18482,7 @@ #. 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:4349 parser/parse_expr.c:4378 +#: parser/parse_expr.c:4359 parser/parse_expr.c:4388 #, 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." @@ -18449,73 +18490,73 @@ #. 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:4356 parser/parse_expr.c:4385 parser/parse_expr.c:4414 -#: parser/parse_expr.c:4442 parser/parse_expr.c:4468 +#: parser/parse_expr.c:4366 parser/parse_expr.c:4395 parser/parse_expr.c:4424 +#: parser/parse_expr.c:4452 parser/parse_expr.c:4478 #, 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:4359 parser/parse_expr.c:4388 +#: parser/parse_expr.c:4369 parser/parse_expr.c:4398 #, 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:4407 +#: parser/parse_expr.c:4417 #, 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:4417 +#: parser/parse_expr.c:4427 #, 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:4435 parser/parse_expr.c:4461 +#: parser/parse_expr.c:4445 parser/parse_expr.c:4471 #, 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:4445 parser/parse_expr.c:4471 +#: parser/parse_expr.c:4455 parser/parse_expr.c:4481 #, 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:4505 +#: parser/parse_expr.c:4515 #, 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:4745 +#: parser/parse_expr.c:4755 #, 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:4750 +#: parser/parse_expr.c:4760 #, c-format msgid "DEFAULT expression must not contain column references" msgstr "DEFAULT-Ausdruck darf keine Spaltenverweise enthalten" -#: parser/parse_expr.c:4755 +#: parser/parse_expr.c:4765 #, c-format msgid "DEFAULT expression must not return a set" msgstr "DEFAULT-Ausdruck darf keine Ergebnismenge zurückgeben" -#: parser/parse_expr.c:4770 +#: parser/parse_expr.c:4780 #, 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:4849 parser/parse_expr.c:4858 +#: parser/parse_expr.c:4868 parser/parse_expr.c:4877 #, 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:4852 +#: parser/parse_expr.c:4871 #, 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." @@ -19610,7 +19651,7 @@ 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" @@ -19620,7 +19661,7 @@ 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«" @@ -20519,39 +20560,39 @@ msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "automatische Rotation abgeschaltet (SIGHUP zum Wiederanschalten verwenden)" -#: postmaster/walsummarizer.c:741 +#: postmaster/walsummarizer.c:781 #, c-format msgid "WAL summarization is not progressing" msgstr "WAL-Zusammenfassung kommt nicht voran" -#: postmaster/walsummarizer.c:742 +#: postmaster/walsummarizer.c:782 #, 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:756 +#: postmaster/walsummarizer.c:796 #, 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:761 +#: postmaster/walsummarizer.c:801 #, 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:1001 +#: postmaster/walsummarizer.c:1100 #, 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:1046 +#: postmaster/walsummarizer.c:1145 #, 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:1052 +#: postmaster/walsummarizer.c:1151 #, c-format msgid "could not read WAL from timeline %u at %X/%X" msgstr "konnte WAL aus Zeitleiste %u bei %X/%X nicht lesen" @@ -20597,7 +20638,7 @@ msgstr "konnte Suchpfad nicht auf leer setzen: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:344 -#: replication/libpqwalreceiver/libpqwalreceiver.c:542 +#: replication/libpqwalreceiver/libpqwalreceiver.c:556 #, c-format msgid "invalid connection string syntax: %s" msgstr "ungültige Syntax für Verbindungszeichenkette: %s" @@ -20618,7 +20659,8 @@ msgstr "konnte Datenbanksystemidentifikator und Zeitleisten-ID nicht vom Primärserver empfangen: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:489 -#: replication/libpqwalreceiver/libpqwalreceiver.c:788 +#: replication/libpqwalreceiver/libpqwalreceiver.c:821 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1168 #, c-format msgid "invalid response from primary server" msgstr "ungültige Antwort vom Primärserver" @@ -20628,91 +20670,99 @@ 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:631 -#: replication/libpqwalreceiver/libpqwalreceiver.c:638 -#: replication/libpqwalreceiver/libpqwalreceiver.c:668 +#: replication/libpqwalreceiver/libpqwalreceiver.c:504 +#, c-format +msgid "could not parse WAL location \"%s\"" +msgstr "konnte WAL-Position »%s« nicht parsen" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:701 #, c-format msgid "could not start WAL streaming: %s" msgstr "konnte WAL-Streaming nicht starten: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:692 +#: replication/libpqwalreceiver/libpqwalreceiver.c:725 #, 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:715 +#: replication/libpqwalreceiver/libpqwalreceiver.c:748 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "unerwartete Ergebnismenge nach End-of-Streaming" -#: replication/libpqwalreceiver/libpqwalreceiver.c:730 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "Fehler beim Beenden des COPY-Datenstroms: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:740 +#: replication/libpqwalreceiver/libpqwalreceiver.c:773 #, c-format msgid "error reading result of streaming command: %s" msgstr "Fehler beim Lesen des Ergebnisses von Streaming-Befehl: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:749 -#: replication/libpqwalreceiver/libpqwalreceiver.c:982 +#: replication/libpqwalreceiver/libpqwalreceiver.c:782 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1015 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "unerwartetes Ergebnis nach CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:776 +#: replication/libpqwalreceiver/libpqwalreceiver.c:809 #, 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:789 +#: replication/libpqwalreceiver/libpqwalreceiver.c:822 #, 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:945 -#: replication/libpqwalreceiver/libpqwalreceiver.c:998 -#: replication/libpqwalreceiver/libpqwalreceiver.c:1005 +#: replication/libpqwalreceiver/libpqwalreceiver.c:978 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1031 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1038 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "konnte keine Daten vom WAL-Stream empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1025 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1058 #, 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:1126 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1160 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1165 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1169 +#, 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:1208 #, c-format msgid "could not alter replication slot \"%s\": %s" msgstr "konnte Replikations-Slot »%s« nicht ändern: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1199 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1242 #, c-format msgid "invalid query response" msgstr "ungültige Antwort auf Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1200 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1243 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d Felder erwartet, %d Feldern erhalten." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1270 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1313 #, c-format msgid "the query interface requires a database connection" msgstr "Ausführen von Anfragen benötigt eine Datenbankverbindung" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1302 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1345 msgid "empty query" msgstr "leere Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1308 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1351 msgid "unexpected pipeline mode" msgstr "unerwarteter Pipeline-Modus" @@ -20768,7 +20818,7 @@ msgstr "alle Slots für Arbeitsprozesse für logische Replikation belegt" #: replication/logical/launcher.c:441 replication/logical/launcher.c:527 -#: replication/slot.c:1585 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 +#: replication/slot.c:1587 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 #: storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 #: storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 #: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 @@ -20821,8 +20871,8 @@ 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:827 -#: replication/slot.c:858 +#: replication/logical/logical.c:546 replication/slot.c:829 +#: replication/slot.c:860 #, c-format msgid "This replication slot is being synchronized from the primary server." msgstr "Dieser Replikations-Slot wird vom Primärserver synchronisiert." @@ -20977,7 +21027,7 @@ msgstr "konnte keinen freien Replication-State-Slot für Replication-Origin mit ID %d finden" #: replication/logical/origin.c:957 replication/logical/origin.c:1158 -#: replication/slot.c:2446 +#: replication/slot.c:2448 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "Erhöhen Sie »max_replication_slots« und versuchen Sie es erneut." @@ -21030,34 +21080,34 @@ msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "Zielrelation für logische Replikation »%s.%s« existiert nicht" -#: replication/logical/reorderbuffer.c:4129 +#: replication/logical/reorderbuffer.c:4145 #, 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:4475 -#: replication/logical/reorderbuffer.c:4500 +#: replication/logical/reorderbuffer.c:4491 +#: replication/logical/reorderbuffer.c:4516 #, 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:4479 -#: replication/logical/reorderbuffer.c:4504 +#: replication/logical/reorderbuffer.c:4495 +#: replication/logical/reorderbuffer.c:4520 #, 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:4754 +#: replication/logical/reorderbuffer.c:4770 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "konnte Datei »%s« nicht löschen, bei Löschen von pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:5250 +#: replication/logical/reorderbuffer.c:5266 #, 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:226 replication/logical/slotsync.c:604 +#: replication/logical/slotsync.c:226 replication/logical/slotsync.c:607 #, c-format msgid "could not synchronize replication slot \"%s\"" msgstr "konnte Replikations-Slot »%s« nicht synchronisieren" @@ -21067,53 +21117,53 @@ 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:483 +#: replication/logical/slotsync.c:482 #, 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:605 +#: replication/logical/slotsync.c:608 #, 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:614 +#: replication/logical/slotsync.c:617 #, 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:653 +#: replication/logical/slotsync.c:656 #, 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:675 +#: replication/logical/slotsync.c:678 #, 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:846 +#: replication/logical/slotsync.c:849 #, 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:992 +#: replication/logical/slotsync.c:995 #, 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:994 +#: replication/logical/slotsync.c:997 #, 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:1014 +#: replication/logical/slotsync.c:1017 #, 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:1023 +#: replication/logical/slotsync.c:1026 #, 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" @@ -21121,76 +21171,76 @@ #. translator: first %s is a connection option; second %s is a GUC #. variable name #. -#: replication/logical/slotsync.c:1056 +#: replication/logical/slotsync.c:1059 #, 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:1075 +#: replication/logical/slotsync.c:1078 #, 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:1090 replication/logical/slotsync.c:1118 +#: replication/logical/slotsync.c:1093 replication/logical/slotsync.c:1121 #, 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:1104 +#: replication/logical/slotsync.c:1107 #, 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:1161 +#: replication/logical/slotsync.c:1164 #, 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:1179 +#: replication/logical/slotsync.c:1182 #, 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:1204 +#: replication/logical/slotsync.c:1207 #, 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:1240 +#: replication/logical/slotsync.c:1243 #, 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:1254 +#: replication/logical/slotsync.c:1257 #, 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:1374 +#: replication/logical/slotsync.c:1377 #, 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:1386 +#: replication/logical/slotsync.c:1389 #, 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:1395 +#: replication/logical/slotsync.c:1398 #, c-format msgid "cannot synchronize replication slots concurrently" msgstr "Replikations-Slots können nicht nebenläufig synchronisiert werden" -#: replication/logical/slotsync.c:1507 +#: replication/logical/slotsync.c:1510 #, c-format msgid "slot sync worker started" msgstr "Slot-Sync-Arbeitsprozess gestartet" -#: replication/logical/slotsync.c:1570 replication/slotfuncs.c:926 -#: replication/walreceiver.c:307 +#: replication/logical/slotsync.c:1573 replication/slotfuncs.c:926 +#: replication/walreceiver.c:316 #, c-format msgid "could not connect to the primary server: %s" msgstr "konnte nicht mit dem Primärserver verbinden: %s" @@ -21298,17 +21348,17 @@ 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:1469 +#: replication/logical/tablesync.c:1470 #, 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:1529 replication/logical/worker.c:2363 +#: replication/logical/tablesync.c:1530 replication/logical/worker.c:2373 #, 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:1542 +#: replication/logical/tablesync.c:1543 #, 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" @@ -21323,147 +21373,153 @@ 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:854 replication/logical/worker.c:969 +#: replication/logical/worker.c:821 replication/logical/worker.c:938 +#: replication/logical/worker.c:2615 +#, 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:860 replication/logical/worker.c:979 #, 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:2506 +#: replication/logical/worker.c:2516 #, 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:2513 +#: replication/logical/worker.c:2523 #, 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:3384 +#: replication/logical/worker.c:3399 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "ungültiger Nachrichtentyp für logische Replikation »??? (%d)«" -#: replication/logical/worker.c:3556 +#: replication/logical/worker.c:3571 #, c-format msgid "data stream from publisher has ended" msgstr "Datenstrom vom Publikationsserver endete" -#: replication/logical/worker.c:3710 +#: replication/logical/worker.c:3725 #, 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:3904 +#: replication/logical/worker.c:3919 #, 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:3918 +#: replication/logical/worker.c:3933 #, 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:3949 +#: replication/logical/worker.c:3964 #, 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:3953 +#: replication/logical/worker.c:3968 #, 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:3967 +#: replication/logical/worker.c:3982 #, 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:3971 +#: replication/logical/worker.c:3986 #, 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:4499 +#: replication/logical/worker.c:4514 #, c-format msgid "subscription has no replication slot set" msgstr "für die Subskription ist kein Replikations-Slot gesetzt" -#: replication/logical/worker.c:4627 +#: replication/logical/worker.c:4642 #, 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:4643 +#: replication/logical/worker.c:4658 #, 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:4667 +#: replication/logical/worker.c:4682 #, 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:4672 +#: replication/logical/worker.c:4687 #, 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:4806 +#: replication/logical/worker.c:4817 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "Subskription »%s« wurde wegen eines Fehlers deaktiviert" -#: replication/logical/worker.c:4854 +#: replication/logical/worker.c:4865 #, 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:4868 +#: replication/logical/worker.c:4879 #, 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:4956 +#: replication/logical/worker.c:4967 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "Skip-LSN von Subskription »%s« gelöscht" -#: replication/logical/worker.c:4957 +#: replication/logical/worker.c:4968 #, 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:4985 +#: replication/logical/worker.c:4996 #, 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:4989 +#: replication/logical/worker.c:5000 #, 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:4994 +#: replication/logical/worker.c:5005 #, 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:5005 +#: replication/logical/worker.c:5016 #, 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:5012 +#: replication/logical/worker.c:5023 #, 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:5023 +#: replication/logical/worker.c:5034 #, 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:5031 +#: replication/logical/worker.c:5042 #, 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" @@ -21547,7 +21603,7 @@ 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:374 replication/slot.c:878 +#: replication/slot.c:374 replication/slot.c:880 #, c-format msgid "cannot enable failover for a temporary replication slot" msgstr "Failover kann nicht für einen temporären Replikations-Slot eingeschaltet werden" @@ -21573,7 +21629,7 @@ msgid "replication slot \"%s\" does not exist" msgstr "Replikations-Slot »%s« existiert nicht" -#: replication/slot.c:635 replication/slot.c:1395 +#: replication/slot.c:635 replication/slot.c:1397 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "Replikations-Slot »%s« ist aktiv für PID %d" @@ -21588,188 +21644,188 @@ msgid "acquired physical replication slot \"%s\"" msgstr "physischer Replikations-Slot »%s« wurde akquiriert" -#: replication/slot.c:758 +#: replication/slot.c:760 #, c-format msgid "released logical replication slot \"%s\"" msgstr "logischer Replikations-Slot »%s« wurde freigegeben" -#: replication/slot.c:760 +#: replication/slot.c:762 #, c-format msgid "released physical replication slot \"%s\"" msgstr "physischer Replikations-Slot »%s« wurde freigegeben" -#: replication/slot.c:826 +#: replication/slot.c:828 #, c-format msgid "cannot drop replication slot \"%s\"" msgstr "kann Replikations-Slot »%s« nicht löschen" -#: replication/slot.c:845 +#: replication/slot.c:847 #, 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:857 +#: replication/slot.c:859 #, c-format msgid "cannot alter replication slot \"%s\"" msgstr "Replikations-Slot »%s« kann nicht geändert werden" -#: replication/slot.c:867 +#: replication/slot.c:869 #, 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:998 replication/slot.c:1965 replication/slot.c:2356 +#: replication/slot.c:1000 replication/slot.c:1967 replication/slot.c:2358 #, c-format msgid "could not remove directory \"%s\"" msgstr "konnte Verzeichnis »%s« nicht löschen" -#: replication/slot.c:1430 +#: replication/slot.c:1432 #, 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:1435 +#: replication/slot.c:1437 #, 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:1447 +#: replication/slot.c:1449 #, c-format msgid "permission denied to use replication slots" msgstr "keine Berechtigung, um Replikations-Slots zu verwenden" -#: replication/slot.c:1448 +#: replication/slot.c:1450 #, 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:1559 +#: replication/slot.c:1561 #, c-format msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." msgstr[0] "Die restart_lsn des Slots %X/%X überschreitet das Maximum um %llu Byte." msgstr[1] "Die restart_lsn des Slots %X/%X überschreitet das Maximum um %llu Bytes." -#: replication/slot.c:1567 +#: replication/slot.c:1569 #, c-format msgid "The slot conflicted with xid horizon %u." msgstr "Der Slot kollidierte mit dem xid-Horizont %u." -#: replication/slot.c:1572 +#: replication/slot.c:1574 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." -#: replication/slot.c:1580 +#: replication/slot.c:1582 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "Prozess %d wird beendet, um Replikations-Slot »%s« freizugeben" -#: replication/slot.c:1582 +#: replication/slot.c:1584 #, c-format msgid "invalidating obsolete replication slot \"%s\"" msgstr "obsoleter Replikations-Slot »%s« wird ungültig gemacht" -#: replication/slot.c:2294 +#: replication/slot.c:2296 #, 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:2301 +#: replication/slot.c:2303 #, 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:2308 +#: replication/slot.c:2310 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "Replikations-Slot-Datei »%s« hat falsche Länge %u" -#: replication/slot.c:2344 +#: replication/slot.c:2346 #, 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:2380 +#: replication/slot.c:2382 #, 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:2382 +#: replication/slot.c:2384 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "Ändern Sie »wal_level« in »logical« oder höher." -#: replication/slot.c:2394 +#: replication/slot.c:2396 #, 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:2396 +#: replication/slot.c:2398 #, c-format msgid "Change \"hot_standby\" to be \"on\"." msgstr "Ändern Sie »hot_standby« auf »on«." -#: replication/slot.c:2401 +#: replication/slot.c:2403 #, 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:2403 +#: replication/slot.c:2405 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "Ändern Sie »wal_level« in »replica« oder höher." -#: replication/slot.c:2445 +#: replication/slot.c:2447 #, c-format msgid "too many replication slots active before shutdown" msgstr "zu viele aktive Replikations-Slots vor dem Herunterfahren" -#: replication/slot.c:2672 +#: replication/slot.c:2674 #, 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:2674 replication/slot.c:2708 replication/slot.c:2723 +#: replication/slot.c:2676 replication/slot.c:2710 replication/slot.c:2725 #, 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:2676 +#: replication/slot.c:2678 #, 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:2686 +#: replication/slot.c:2688 #, 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:2688 +#: replication/slot.c:2690 #, 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:2690 +#: replication/slot.c:2692 #, 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:2706 +#: replication/slot.c:2708 #, 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:2710 +#: replication/slot.c:2712 #, 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:2721 +#: replication/slot.c:2723 #, 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:2725 +#: replication/slot.c:2727 #, 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«." @@ -21884,72 +21940,82 @@ 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:176 +#: replication/walreceiver.c:183 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "WAL-Receiver-Prozess wird abgebrochen aufgrund von Anweisung des Administrators" -#: replication/walreceiver.c:354 +#: replication/walreceiver.c:365 #, 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:355 +#: replication/walreceiver.c:366 #, 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:366 +#: replication/walreceiver.c:377 #, 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:419 +#: replication/walreceiver.c:420 +#, 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:435 +#, 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:496 #, 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:423 +#: replication/walreceiver.c:500 #, 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:458 +#: replication/walreceiver.c:535 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "kann WAL-Streaming nicht fortsetzen, Wiederherstellung ist bereits beendet" -#: replication/walreceiver.c:502 +#: replication/walreceiver.c:579 #, c-format msgid "replication terminated by primary server" msgstr "Replikation wurde durch Primärserver beendet" -#: replication/walreceiver.c:503 +#: replication/walreceiver.c:580 #, 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:593 +#: replication/walreceiver.c:670 #, c-format msgid "terminating walreceiver due to timeout" msgstr "WAL-Receiver-Prozess wird abgebrochen wegen Zeitüberschreitung" -#: replication/walreceiver.c:625 +#: replication/walreceiver.c:702 #, 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:641 replication/walreceiver.c:1071 +#: replication/walreceiver.c:718 replication/walreceiver.c:1148 #, c-format msgid "could not close WAL segment %s: %m" msgstr "konnte WAL-Segment %s nicht schließen: %m" -#: replication/walreceiver.c:760 +#: replication/walreceiver.c:837 #, 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:959 +#: replication/walreceiver.c:1036 #, 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" @@ -21989,100 +22055,100 @@ msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "angeforderter Startpunkt %X/%X ist vor der WAL-Flush-Position dieses Servers %X/%X" -#: replication/walsender.c:1178 +#: replication/walsender.c:1200 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "unbekannter Wert für CREATE_REPLICATION_SLOT-Option »%s«: »%s«" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1284 +#: replication/walsender.c:1306 #, 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:1294 +#: replication/walsender.c:1316 #, 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:1300 +#: replication/walsender.c:1322 #, 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:1305 +#: replication/walsender.c:1327 #, 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:1311 +#: replication/walsender.c:1333 #, 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:1317 +#: replication/walsender.c:1339 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s darf nicht in einer Subtransaktion aufgerufen werden" -#: replication/walsender.c:1490 +#: replication/walsender.c:1512 #, c-format msgid "terminating walsender process after promotion" msgstr "WAL-Sender-Prozess wird nach Beförderung abgebrochen" -#: replication/walsender.c:2035 +#: replication/walsender.c:2057 #, 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:2103 +#: replication/walsender.c:2125 #, c-format msgid "received replication command: %s" msgstr "Replikationsbefehl empfangen: %s" -#: replication/walsender.c:2111 tcop/fastpath.c:209 tcop/postgres.c:1143 +#: replication/walsender.c:2133 tcop/fastpath.c:209 tcop/postgres.c:1143 #: tcop/postgres.c:1501 tcop/postgres.c:1753 tcop/postgres.c:2235 #: tcop/postgres.c:2673 tcop/postgres.c:2750 #, 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:2268 replication/walsender.c:2303 +#: replication/walsender.c:2290 replication/walsender.c:2325 #, c-format msgid "unexpected EOF on standby connection" msgstr "unerwartetes EOF auf Standby-Verbindung" -#: replication/walsender.c:2291 +#: replication/walsender.c:2313 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ungültiger Standby-Message-Typ »%c«" -#: replication/walsender.c:2380 +#: replication/walsender.c:2402 #, c-format msgid "unexpected message type \"%c\"" msgstr "unerwarteter Message-Typ »%c«" -#: replication/walsender.c:2801 +#: replication/walsender.c:2823 #, 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" @@ -22147,108 +22213,108 @@ 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" @@ -22693,42 +22759,44 @@ 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" -#: storage/buffer/bufmgr.c:656 storage/buffer/bufmgr.c:812 +#: storage/aio/read_stream.c:417 storage/buffer/bufmgr.c:656 +#: storage/buffer/bufmgr.c:1215 storage/buffer/bufmgr.c:1283 +#: storage/buffer/bufmgr.c:2181 #, 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:1539 +#: storage/buffer/bufmgr.c:1548 #, 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:2284 storage/buffer/localbuf.c:361 +#: storage/buffer/bufmgr.c:2307 storage/buffer/localbuf.c:361 #, 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:2355 +#: storage/buffer/bufmgr.c:2378 #, 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:2357 +#: storage/buffer/bufmgr.c:2380 #, 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:5721 +#: storage/buffer/bufmgr.c:5744 #, c-format msgid "could not write block %u of %s" msgstr "konnte Block %u von %s nicht schreiben" -#: storage/buffer/bufmgr.c:5723 +#: storage/buffer/bufmgr.c:5746 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Mehrere Fehlschläge --- Schreibfehler ist möglicherweise dauerhaft." -#: storage/buffer/bufmgr.c:5745 storage/buffer/bufmgr.c:5765 +#: storage/buffer/bufmgr.c:5768 storage/buffer/bufmgr.c:5788 #, c-format msgid "writing block %u of relation %s" msgstr "schreibe Block %u von Relation %s" @@ -23046,7 +23114,7 @@ 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:417 +#: storage/ipc/procsignal.c:424 #, 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" @@ -23091,17 +23159,12 @@ 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:72 #, c-format msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d ist kein PostgreSQL-Backend-Prozess" -#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1486 #: utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" @@ -23427,27 +23490,27 @@ 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:1546 +#: storage/lmgr/proc.c:1579 #, 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:1561 +#: storage/lmgr/proc.c:1594 #, 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:1570 +#: storage/lmgr/proc.c:1603 #, 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:1577 +#: storage/lmgr/proc.c:1610 #, 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:1594 +#: storage/lmgr/proc.c:1627 #, 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" @@ -23600,77 +23663,77 @@ msgid "direct SSL connection rejected" msgstr "direkte SSL-Verbindung abgelehnt" -#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#: tcop/backend_startup.c:490 tcop/backend_startup.c:518 #, c-format msgid "incomplete startup packet" msgstr "unvollständiges Startpaket" -#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#: tcop/backend_startup.c:502 tcop/backend_startup.c:539 #, c-format msgid "invalid length of startup packet" msgstr "ungültige Länge des Startpakets" -#: tcop/backend_startup.c:573 +#: tcop/backend_startup.c:574 #, c-format msgid "SSLRequest accepted" msgstr "SSLRequest akzeptiert" -#: tcop/backend_startup.c:576 +#: tcop/backend_startup.c:577 #, c-format msgid "SSLRequest rejected" msgstr "SSLRequest abgelehnt" -#: tcop/backend_startup.c:585 +#: tcop/backend_startup.c:586 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "konnte SSL-Verhandlungsantwort nicht senden: %m" -#: tcop/backend_startup.c:603 +#: tcop/backend_startup.c:604 #, c-format msgid "received unencrypted data after SSL request" msgstr "unverschlüsselte Daten nach SSL-Anforderung empfangen" -#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 +#: tcop/backend_startup.c:605 tcop/backend_startup.c:668 #, 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:627 +#: tcop/backend_startup.c:637 #, c-format msgid "GSSENCRequest accepted" msgstr "GSSENCRequest akzeptiert" -#: tcop/backend_startup.c:630 +#: tcop/backend_startup.c:640 #, c-format msgid "GSSENCRequest rejected" msgstr "GSSENCRequest abgelehnt" -#: tcop/backend_startup.c:639 +#: tcop/backend_startup.c:649 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "konnte GSSAPI-Verhandlungsantwort nicht senden: %m" -#: tcop/backend_startup.c:657 +#: tcop/backend_startup.c:667 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsanforderung empfangen" -#: tcop/backend_startup.c:681 +#: tcop/backend_startup.c:700 #, 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:744 +#: tcop/backend_startup.c:763 #, 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:785 +#: tcop/backend_startup.c:804 #, 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:802 +#: tcop/backend_startup.c:821 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "kein PostgreSQL-Benutzername im Startpaket angegeben" @@ -23721,7 +23784,7 @@ msgid "incorrect binary data format in function argument %d" msgstr "falsches Binärdatenformat in Funktionsargument %d" -#: tcop/postgres.c:468 tcop/postgres.c:5016 +#: tcop/postgres.c:468 tcop/postgres.c:5032 #, c-format msgid "invalid frontend message type %d" msgstr "ungültiger Frontend-Message-Typ %d" @@ -23959,82 +24022,82 @@ msgid "terminating connection due to idle-session timeout" msgstr "Verbindung wird abgebrochen wegen Zeitüberschreitung in inaktiver Sitzung" -#: tcop/postgres.c:3568 +#: tcop/postgres.c:3569 #, c-format msgid "stack depth limit exceeded" msgstr "Grenze für Stacktiefe überschritten" -#: tcop/postgres.c:3569 +#: tcop/postgres.c:3570 #, 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." -#: tcop/postgres.c:3616 +#: tcop/postgres.c:3632 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "»max_stack_depth« darf %ldkB nicht überschreiten." -#: tcop/postgres.c:3618 +#: tcop/postgres.c:3634 #, 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." -#: tcop/postgres.c:3641 +#: tcop/postgres.c:3657 #, c-format msgid "\"client_connection_check_interval\" must be set to 0 on this platform." msgstr "»client_connection_check_interval« muss auf dieser Plattform auf 0 gesetzt sein." -#: tcop/postgres.c:3662 +#: tcop/postgres.c:3678 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "Kann Parameter nicht einschalten, wenn »log_statement_stats« an ist." -#: tcop/postgres.c:3677 +#: tcop/postgres.c:3693 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "Kann »log_statement_stats« nicht einschalten, wenn »log_parser_stats«, »log_planner_stats« oder »log_executor_stats« an ist." -#: tcop/postgres.c:4102 +#: tcop/postgres.c:4118 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "ungültiges Kommandozeilenargument für Serverprozess: %s" -#: tcop/postgres.c:4103 tcop/postgres.c:4109 +#: tcop/postgres.c:4119 tcop/postgres.c:4125 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: tcop/postgres.c:4107 +#: tcop/postgres.c:4123 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: ungültiges Kommandozeilenargument: %s" -#: tcop/postgres.c:4160 +#: tcop/postgres.c:4176 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: weder Datenbankname noch Benutzername angegeben" -#: tcop/postgres.c:4913 +#: tcop/postgres.c:4929 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "ungültiger Subtyp %d von CLOSE-Message" -#: tcop/postgres.c:4950 +#: tcop/postgres.c:4966 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "ungültiger Subtyp %d von DESCRIBE-Message" -#: tcop/postgres.c:5037 +#: tcop/postgres.c:5053 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "Fastpath-Funktionsaufrufe werden auf einer Replikationsverbindung nicht unterstützt" -#: tcop/postgres.c:5041 +#: tcop/postgres.c:5057 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "erweitertes Anfrageprotokoll wird nicht auf einer Replikationsverbindung unterstützt" -#: tcop/postgres.c:5221 +#: tcop/postgres.c:5237 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "Verbindungsende: Sitzungszeit: %d:%02d:%02d.%03d Benutzer=%s Datenbank=%s Host=%s%s%s" @@ -24135,17 +24198,17 @@ msgid "unrecognized simple dictionary parameter: \"%s\"" msgstr "unbekannter Parameter für das einfache Wörterbuch: »%s«" -#: tsearch/dict_synonym.c:118 +#: tsearch/dict_synonym.c:117 #, c-format msgid "unrecognized synonym parameter: \"%s\"" msgstr "unbekannter Synonymparameter: »%s«" -#: tsearch/dict_synonym.c:125 +#: tsearch/dict_synonym.c:124 #, c-format msgid "missing Synonyms parameter" msgstr "Parameter »Synonyms« fehlt" -#: tsearch/dict_synonym.c:132 +#: tsearch/dict_synonym.c:131 #, c-format msgid "could not open synonym file \"%s\": %m" msgstr "konnte Synonymdatei »%s« nicht öffnen: %m" @@ -24246,38 +24309,43 @@ msgid "could not open dictionary file \"%s\": %m" msgstr "konnte Wörterbuchdatei »%s« nicht öffnen: %m" -#: tsearch/spell.c:1181 tsearch/spell.c:1193 tsearch/spell.c:1753 -#: tsearch/spell.c:1758 tsearch/spell.c:1763 +#: tsearch/spell.c:1181 tsearch/spell.c:1188 tsearch/spell.c:1199 +#: tsearch/spell.c:1768 tsearch/spell.c:1773 tsearch/spell.c:1778 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ungültiges Affixalias »%s«" -#: tsearch/spell.c:1234 tsearch/spell.c:1305 tsearch/spell.c:1454 +#: tsearch/spell.c:1240 tsearch/spell.c:1311 tsearch/spell.c:1469 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "konnte Affixdatei »%s« nicht öffnen: %m" -#: tsearch/spell.c:1288 +#: tsearch/spell.c:1294 #, 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:1332 +#: tsearch/spell.c:1338 #, c-format msgid "invalid number of flag vector aliases" msgstr "ungültige Anzahl Flag-Vektor-Aliasse" -#: tsearch/spell.c:1355 +#: tsearch/spell.c:1361 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "Anzahl der Aliasse überschreitet angegebene Zahl %d" -#: tsearch/spell.c:1569 +#: tsearch/spell.c:1435 +#, 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:1584 #, 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)" @@ -24319,62 +24387,68 @@ 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" -#: utils/activity/pgstat.c:435 +#: 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:436 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "konnte permanente Statistikdatei »%s« nicht löschen: %m" -#: utils/activity/pgstat.c:1254 +#: utils/activity/pgstat.c:1265 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "ungültige Statistikart: »%s«" -#: utils/activity/pgstat.c:1334 +#: utils/activity/pgstat.c:1345 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht öffnen: %m" -#: utils/activity/pgstat.c:1454 +#: utils/activity/pgstat.c:1465 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht schreiben: %m" -#: utils/activity/pgstat.c:1463 +#: utils/activity/pgstat.c:1474 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht schließen: %m" -#: utils/activity/pgstat.c:1471 +#: utils/activity/pgstat.c:1482 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht in »%s« umbenennen: %m" -#: utils/activity/pgstat.c:1520 +#: utils/activity/pgstat.c:1531 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "konnte Statistikdatei »%s« nicht öffnen: %m" -#: utils/activity/pgstat.c:1692 +#: utils/activity/pgstat.c:1703 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "verfälschte Statistikdatei »%s«" @@ -24384,7 +24458,7 @@ msgid "function call to dropped function" msgstr "Funktionsaufruf einer gelöschten Funktion" -#: utils/activity/pgstat_shmem.c:509 +#: utils/activity/pgstat_shmem.c:512 #, c-format msgid "Failed while allocating entry %d/%u/%u." msgstr "Fehlgeschlagen beim Anlegen von Eintrag %d/%u/%u." @@ -24525,7 +24599,7 @@ #: 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:1918 utils/adt/numeric.c:4455 +#: utils/adt/int8.c:1286 utils/adt/numeric.c:1924 utils/adt/numeric.c:4461 #: utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 #: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1178 #: utils/adt/varlena.c:3182 @@ -24566,12 +24640,12 @@ msgstr "Arrays mit unterschiedlichen Dimensionen sind nicht kompatibel für Aneinanderhängen." #: utils/adt/array_userfuncs.c:977 utils/adt/array_userfuncs.c:985 -#: utils/adt/arrayfuncs.c:5622 utils/adt/arrayfuncs.c:5628 +#: utils/adt/arrayfuncs.c:5631 utils/adt/arrayfuncs.c:5637 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "Arrays unterschiedlicher Dimensionalität können nicht akkumuliert werden" -#: utils/adt/array_userfuncs.c:997 +#: utils/adt/array_userfuncs.c:997 utils/adt/arrayfuncs.c:5593 #, c-format msgid "array size exceeds the maximum allowed (%zu)" msgstr "Arraygröße überschreitet erlaubtes Maximum (%zu)" @@ -24689,7 +24763,7 @@ msgstr "Unerwartetes Ende der Eingabe." #: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 -#: utils/adt/arrayfuncs.c:6114 +#: utils/adt/arrayfuncs.c:6121 #, c-format msgid "invalid number of dimensions: %d" msgstr "ungültige Anzahl Dimensionen: %d" @@ -24704,8 +24778,8 @@ 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:351 utils/cache/lsyscache.c:2996 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:451 +#: utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:3071 #, c-format msgid "no binary input function available for type %s" msgstr "keine binäre Eingabefunktion verfügbar für Typ %s" @@ -24715,8 +24789,8 @@ 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:356 utils/cache/lsyscache.c:3029 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:456 +#: utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:3104 #, c-format msgid "no binary output function available for type %s" msgstr "keine binäre Ausgabefunktion verfügbar für Typ %s" @@ -24728,8 +24802,8 @@ #: 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:6100 -#: utils/adt/arrayfuncs.c:6126 utils/adt/arrayfuncs.c:6137 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6107 +#: utils/adt/arrayfuncs.c:6133 utils/adt/arrayfuncs.c:6144 #: utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 #: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 #: utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 @@ -24779,8 +24853,8 @@ msgid "cannot compare arrays of different element types" msgstr "kann Arrays mit verschiedenen Elementtypen nicht vergleichen" -#: utils/adt/arrayfuncs.c:4183 utils/adt/multirangetypes.c:2806 -#: utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1361 +#: utils/adt/arrayfuncs.c:4183 utils/adt/multirangetypes.c:2807 +#: utils/adt/multirangetypes.c:2879 utils/adt/rangetypes.c:1361 #: utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" @@ -24796,52 +24870,52 @@ msgid "data type %s is not an array type" msgstr "Datentyp %s ist kein Array-Typ" -#: utils/adt/arrayfuncs.c:5567 +#: utils/adt/arrayfuncs.c:5568 #, c-format msgid "cannot accumulate null arrays" msgstr "Arrays, die NULL sind, können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5595 +#: utils/adt/arrayfuncs.c:5604 #, c-format msgid "cannot accumulate empty arrays" msgstr "leere Arrays können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5998 utils/adt/arrayfuncs.c:6038 +#: utils/adt/arrayfuncs.c:6005 utils/adt/arrayfuncs.c:6045 #, 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:6101 utils/adt/arrayfuncs.c:6127 +#: utils/adt/arrayfuncs.c:6108 utils/adt/arrayfuncs.c:6134 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensions-Array muss eindimensional sein." -#: utils/adt/arrayfuncs.c:6106 utils/adt/arrayfuncs.c:6132 +#: utils/adt/arrayfuncs.c:6113 utils/adt/arrayfuncs.c:6139 #, c-format msgid "dimension values cannot be null" msgstr "Dimensionswerte dürfen nicht NULL sein" -#: utils/adt/arrayfuncs.c:6138 +#: utils/adt/arrayfuncs.c:6145 #, 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:6419 +#: utils/adt/arrayfuncs.c:6426 #, 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:6696 +#: utils/adt/arrayfuncs.c:6703 #, c-format msgid "thresholds must be one-dimensional array" msgstr "Parameter »thresholds« muss ein eindimensionales Array sein" -#: utils/adt/arrayfuncs.c:6701 +#: utils/adt/arrayfuncs.c:6708 #, c-format msgid "thresholds array must not contain NULLs" msgstr "»thresholds«-Array darf keine NULL-Werte enthalten" -#: utils/adt/arrayfuncs.c:6934 +#: utils/adt/arrayfuncs.c:6941 #, 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" @@ -24882,7 +24956,7 @@ msgstr "Kodierungsumwandlung zwischen %s und ASCII wird nicht unterstützt" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 +#: utils/adt/bool.c:149 utils/adt/cash.c:370 utils/adt/datetime.c:4142 #: utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 #: utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 #: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 @@ -24890,8 +24964,8 @@ #: 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:803 utils/adt/numeric.c:7222 -#: utils/adt/numeric.c:7425 utils/adt/numeric.c:8372 utils/adt/numutils.c:356 +#: utils/adt/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7228 +#: utils/adt/numeric.c:7431 utils/adt/numeric.c:8378 utils/adt/numutils.c:356 #: utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 #: utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 #: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 @@ -24902,26 +24976,26 @@ 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:723 utils/adt/float.c:99 +#: utils/adt/cash.c:161 utils/adt/cash.c:739 utils/adt/float.c:99 #: 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:3192 utils/adt/numeric.c:3215 utils/adt/numeric.c:3300 -#: utils/adt/numeric.c:3318 utils/adt/numeric.c:3414 utils/adt/numeric.c:8921 -#: utils/adt/numeric.c:9234 utils/adt/numeric.c:9582 utils/adt/numeric.c:9698 -#: utils/adt/numeric.c:11209 utils/adt/timestamp.c:3713 +#: 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:3198 utils/adt/numeric.c:3221 utils/adt/numeric.c:3306 +#: utils/adt/numeric.c:3324 utils/adt/numeric.c:3420 utils/adt/numeric.c:8927 +#: utils/adt/numeric.c:9240 utils/adt/numeric.c:9588 utils/adt/numeric.c:9704 +#: utils/adt/numeric.c:11215 utils/adt/timestamp.c:3717 #, 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:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 #: utils/adt/numutils.c:964 utils/adt/numutils.c:1011 #, c-format @@ -24954,9 +25028,9 @@ 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:167 utils/adt/date.c:175 utils/adt/formatting.c:4426 -#: utils/adt/formatting.c:4435 utils/adt/formatting.c:4540 -#: utils/adt/formatting.c:4550 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4535 +#: utils/adt/formatting.c:4544 utils/adt/formatting.c:4649 +#: utils/adt/formatting.c:4659 #, c-format msgid "date out of range: \"%s\"" msgstr "date ist außerhalb des gültigen Bereichs: »%s«" @@ -24989,21 +25063,21 @@ msgstr "Datum ist außerhalb des gültigen Bereichs für Typ »timestamp«" #: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 -#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 -#: utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 -#: utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 -#: utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 -#: utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 -#: utils/adt/timestamp.c:6070 +#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4730 +#: utils/adt/timestamp.c:4945 utils/adt/timestamp.c:5093 +#: utils/adt/timestamp.c:5346 utils/adt/timestamp.c:5547 +#: utils/adt/timestamp.c:5594 utils/adt/timestamp.c:5818 +#: utils/adt/timestamp.c:5865 utils/adt/timestamp.c:5945 +#: utils/adt/timestamp.c:6074 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "Einheit »%s« nicht unterstützt für Typ %s" #: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 -#: utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 -#: utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 -#: utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 -#: utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 +#: utils/adt/timestamp.c:4744 utils/adt/timestamp.c:4962 +#: utils/adt/timestamp.c:5107 utils/adt/timestamp.c:5306 +#: utils/adt/timestamp.c:5603 utils/adt/timestamp.c:5874 +#: utils/adt/timestamp.c:5915 utils/adt/timestamp.c:6135 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "Einheit »%s« nicht erkannt für Typ %s" @@ -25011,38 +25085,38 @@ #: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 #: utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 #: utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 -#: utils/adt/formatting.c:4271 utils/adt/formatting.c:4307 -#: utils/adt/formatting.c:4394 utils/adt/formatting.c:4516 utils/adt/json.c:366 +#: utils/adt/formatting.c:4380 utils/adt/formatting.c:4416 +#: utils/adt/formatting.c:4503 utils/adt/formatting.c:4625 utils/adt/json.c:366 #: utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 #: utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 #: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 -#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 -#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 -#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 -#: utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 -#: utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 -#: utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 -#: utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 -#: utils/adt/timestamp.c:3266 utils/adt/timestamp.c:3279 -#: utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 -#: utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 -#: utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 -#: utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 -#: utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 -#: utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 -#: utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 -#: utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 -#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 -#: utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 -#: utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 -#: utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 -#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2575 +#: utils/adt/timestamp.c:3070 utils/adt/timestamp.c:3079 +#: utils/adt/timestamp.c:3096 utils/adt/timestamp.c:3101 +#: utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3133 +#: utils/adt/timestamp.c:3144 utils/adt/timestamp.c:3150 +#: utils/adt/timestamp.c:3156 utils/adt/timestamp.c:3161 +#: utils/adt/timestamp.c:3214 utils/adt/timestamp.c:3223 +#: utils/adt/timestamp.c:3244 utils/adt/timestamp.c:3249 +#: utils/adt/timestamp.c:3270 utils/adt/timestamp.c:3283 +#: utils/adt/timestamp.c:3297 utils/adt/timestamp.c:3305 +#: utils/adt/timestamp.c:3311 utils/adt/timestamp.c:3316 +#: utils/adt/timestamp.c:4384 utils/adt/timestamp.c:4536 +#: utils/adt/timestamp.c:4612 utils/adt/timestamp.c:4648 +#: utils/adt/timestamp.c:4738 utils/adt/timestamp.c:4817 +#: utils/adt/timestamp.c:4853 utils/adt/timestamp.c:4956 +#: utils/adt/timestamp.c:5411 utils/adt/timestamp.c:5685 +#: utils/adt/timestamp.c:6203 utils/adt/timestamp.c:6213 +#: utils/adt/timestamp.c:6218 utils/adt/timestamp.c:6224 +#: utils/adt/timestamp.c:6264 utils/adt/timestamp.c:6351 +#: utils/adt/timestamp.c:6392 utils/adt/timestamp.c:6396 +#: utils/adt/timestamp.c:6450 utils/adt/timestamp.c:6454 +#: utils/adt/timestamp.c:6460 utils/adt/timestamp.c:6501 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:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4599 +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4708 #, c-format msgid "time out of range" msgstr "time ist außerhalb des gültigen Bereichs" @@ -25069,9 +25143,9 @@ #: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 #: utils/adt/float.c:1112 utils/adt/int.c:664 utils/adt/int.c:711 -#: utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2596 -#: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 -#: utils/adt/timestamp.c:3888 +#: utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2602 +#: utils/adt/timestamp.c:3814 utils/adt/timestamp.c:3851 +#: utils/adt/timestamp.c:3892 #, c-format msgid "invalid preceding or following size in window function" msgstr "ungültige vorhergehende oder folgende Größe in Fensterfunktion" @@ -25081,12 +25155,12 @@ msgid "time zone displacement out of range" msgstr "Zeitzonenunterschied ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6246 utils/adt/timestamp.c:6483 #, c-format msgid "interval time zone \"%s\" must be finite" msgstr "Intervall-Zeitzone »%s« muss endlich sein" -#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6253 utils/adt/timestamp.c:6490 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "Intervall-Zeitzone »%s« darf keine Monate oder Tage enthalten" @@ -25247,34 +25321,34 @@ #: utils/adt/float.c:1247 utils/adt/float.c:1321 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:4594 utils/adt/numeric.c:4599 +#: utils/adt/int8.c:1307 utils/adt/numeric.c:4600 utils/adt/numeric.c:4605 #, c-format msgid "smallint out of range" msgstr "smallint ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:1447 utils/adt/numeric.c:3710 utils/adt/numeric.c:10113 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3716 utils/adt/numeric.c:10119 #, c-format msgid "cannot take square root of a negative number" msgstr "Quadratwurzel von negativer Zahl kann nicht ermittelt werden" -#: utils/adt/float.c:1515 utils/adt/numeric.c:3998 utils/adt/numeric.c:4110 +#: utils/adt/float.c:1515 utils/adt/numeric.c:4004 utils/adt/numeric.c:4116 #, c-format msgid "zero raised to a negative power is undefined" msgstr "null hoch eine negative Zahl ist undefiniert" -#: utils/adt/float.c:1519 utils/adt/numeric.c:4002 utils/adt/numeric.c:11004 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4008 utils/adt/numeric.c:11010 #, 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:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3910 -#: utils/adt/numeric.c:10784 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3916 +#: utils/adt/numeric.c:10790 #, c-format msgid "cannot take logarithm of zero" msgstr "Logarithmus von null kann nicht ermittelt werden" -#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3848 -#: utils/adt/numeric.c:3905 utils/adt/numeric.c:10788 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3854 +#: utils/adt/numeric.c:3911 utils/adt/numeric.c:10794 #, c-format msgid "cannot take logarithm of a negative number" msgstr "Logarithmus negativer Zahlen kann nicht ermittelt werden" @@ -25288,284 +25362,284 @@ msgid "input is out of range" msgstr "Eingabe ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:4000 utils/adt/numeric.c:1858 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1864 #, c-format msgid "count must be greater than zero" msgstr "Anzahl muss größer als null sein" -#: utils/adt/float.c:4005 utils/adt/numeric.c:1869 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1875 #, 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:4011 utils/adt/numeric.c:1874 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1880 #, c-format msgid "lower and upper bounds must be finite" msgstr "Untergrenze und Obergrenze müssen endlich sein" -#: utils/adt/float.c:4077 utils/adt/numeric.c:1888 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1894 #, c-format msgid "lower bound cannot equal upper bound" msgstr "Untergrenze kann nicht gleich der Obergrenze sein" -#: utils/adt/formatting.c:530 +#: utils/adt/formatting.c:531 #, c-format msgid "invalid format specification for an interval value" msgstr "ungültige Formatangabe für Intervall-Wert" -#: utils/adt/formatting.c:531 +#: utils/adt/formatting.c:532 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Intervalle beziehen sich nicht auf bestimmte Kalenderdaten." -#: utils/adt/formatting.c:1163 +#: utils/adt/formatting.c:1164 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "»EEEE« muss das letzte Muster sein" -#: utils/adt/formatting.c:1171 +#: utils/adt/formatting.c:1172 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "»9« muss vor »PR« stehen" -#: utils/adt/formatting.c:1187 +#: utils/adt/formatting.c:1188 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "»0« muss vor »PR« stehen" -#: utils/adt/formatting.c:1214 +#: utils/adt/formatting.c:1215 #, c-format msgid "multiple decimal points" msgstr "mehrere Dezimalpunkte" -#: utils/adt/formatting.c:1218 utils/adt/formatting.c:1301 +#: utils/adt/formatting.c:1219 utils/adt/formatting.c:1302 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "»V« und Dezimalpunkt können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1230 +#: utils/adt/formatting.c:1231 #, c-format msgid "cannot use \"S\" twice" msgstr "»S« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1234 +#: utils/adt/formatting.c:1235 #, 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:1254 +#: utils/adt/formatting.c:1255 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "»S« und »MI« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1264 +#: utils/adt/formatting.c:1265 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "»S« und »PL« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1274 +#: utils/adt/formatting.c:1275 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "»S« und »SG« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1283 +#: utils/adt/formatting.c:1284 #, 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:1309 +#: utils/adt/formatting.c:1310 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "»EEEE« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1315 +#: utils/adt/formatting.c:1316 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "»EEEE« ist mit anderen Formaten inkompatibel" -#: utils/adt/formatting.c:1316 +#: utils/adt/formatting.c:1317 #, 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:1400 +#: utils/adt/formatting.c:1401 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "ungültiges Datum-/Zeit-Formattrennzeichen: »%s«" -#: utils/adt/formatting.c:1527 +#: utils/adt/formatting.c:1528 #, c-format msgid "\"%s\" is not a number" msgstr "»%s« ist keine Zahl" -#: utils/adt/formatting.c:1605 +#: utils/adt/formatting.c:1606 #, c-format msgid "case conversion failed: %s" msgstr "Groß/Klein-Umwandlung fehlgeschlagen: %s" -#: utils/adt/formatting.c:1653 utils/adt/formatting.c:1801 -#: utils/adt/formatting.c:1991 +#: utils/adt/formatting.c:1654 utils/adt/formatting.c:1802 +#: utils/adt/formatting.c:2004 #, 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:2412 +#: utils/adt/formatting.c:2425 #, c-format msgid "invalid combination of date conventions" msgstr "ungültige Kombination von Datumskonventionen" -#: utils/adt/formatting.c:2413 +#: utils/adt/formatting.c:2426 #, 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:2435 +#: utils/adt/formatting.c:2448 #, 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:2437 +#: utils/adt/formatting.c:2450 #, 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:2504 +#: utils/adt/formatting.c:2517 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "Quellzeichenkette zu kurz für Formatfeld »%s»" -#: utils/adt/formatting.c:2506 +#: utils/adt/formatting.c:2519 #, 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:2508 utils/adt/formatting.c:2522 +#: utils/adt/formatting.c:2521 utils/adt/formatting.c:2535 #, 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:2518 utils/adt/formatting.c:2531 -#: utils/adt/formatting.c:2752 utils/adt/formatting.c:3652 +#: utils/adt/formatting.c:2531 utils/adt/formatting.c:2544 +#: utils/adt/formatting.c:2861 utils/adt/formatting.c:3761 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "ungültiger Wert »%s« für »%s«" -#: utils/adt/formatting.c:2520 +#: utils/adt/formatting.c:2533 #, 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:2533 +#: utils/adt/formatting.c:2546 #, c-format msgid "Value must be an integer." msgstr "Der Wert muss eine ganze Zahl sein." -#: utils/adt/formatting.c:2538 +#: utils/adt/formatting.c:2551 #, 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:2540 +#: utils/adt/formatting.c:2553 #, 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:2754 +#: utils/adt/formatting.c:2863 #, 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:2970 utils/adt/formatting.c:2990 -#: utils/adt/formatting.c:3010 utils/adt/formatting.c:3030 -#: utils/adt/formatting.c:3049 utils/adt/formatting.c:3068 -#: utils/adt/formatting.c:3092 utils/adt/formatting.c:3110 -#: utils/adt/formatting.c:3128 utils/adt/formatting.c:3146 -#: utils/adt/formatting.c:3163 utils/adt/formatting.c:3180 +#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3099 +#: utils/adt/formatting.c:3119 utils/adt/formatting.c:3139 +#: utils/adt/formatting.c:3158 utils/adt/formatting.c:3177 +#: utils/adt/formatting.c:3201 utils/adt/formatting.c:3219 +#: utils/adt/formatting.c:3237 utils/adt/formatting.c:3255 +#: utils/adt/formatting.c:3272 utils/adt/formatting.c:3289 #, c-format msgid "localized string format value too long" msgstr "lokalisierter Formatwert ist zu lang" -#: utils/adt/formatting.c:3460 +#: utils/adt/formatting.c:3569 #, c-format msgid "unmatched format separator \"%c\"" msgstr "Formattrennzeichen »%c« ohne passende Eingabe" -#: utils/adt/formatting.c:3521 +#: utils/adt/formatting.c:3630 #, c-format msgid "unmatched format character \"%s\"" msgstr "Formatzeichen »%s« ohne passende Eingabe" -#: utils/adt/formatting.c:3654 +#: utils/adt/formatting.c:3763 #, c-format msgid "Time zone abbreviation is not recognized." msgstr "Zeitzonenabkürzung wird nicht erkannt." -#: utils/adt/formatting.c:3855 +#: utils/adt/formatting.c:3964 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ungültige Eingabe für »Y,YYY«" -#: utils/adt/formatting.c:3944 +#: utils/adt/formatting.c:4053 #, c-format msgid "input string is too short for datetime format" msgstr "Eingabezeichenkette ist zu kurz für Datum-/Zeitformat" -#: utils/adt/formatting.c:3952 +#: utils/adt/formatting.c:4061 #, 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:4496 +#: utils/adt/formatting.c:4605 #, 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:4502 +#: utils/adt/formatting.c:4611 #, c-format msgid "timestamptz out of range" msgstr "timestamptz ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:4530 +#: utils/adt/formatting.c:4639 #, c-format msgid "datetime format is zoned but not timed" msgstr "Datum-/Zeitformat hat Zeitzone aber keine Zeit" -#: utils/adt/formatting.c:4579 +#: utils/adt/formatting.c:4688 #, 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:4585 +#: utils/adt/formatting.c:4694 #, c-format msgid "timetz out of range" msgstr "timetz ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:4611 +#: utils/adt/formatting.c:4720 #, c-format msgid "datetime format is not dated and not timed" msgstr "Datum-/Zeitformat hat kein Datum und keine Zeit" -#: utils/adt/formatting.c:4788 +#: utils/adt/formatting.c:4897 #, 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:4790 +#: utils/adt/formatting.c:4899 #, 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:4902 +#: utils/adt/formatting.c:5011 #, c-format msgid "cannot calculate day of year without year information" msgstr "kann Tag des Jahres nicht berechnen ohne Jahrinformationen" -#: utils/adt/formatting.c:5867 +#: utils/adt/formatting.c:5976 #, c-format msgid "\"EEEE\" not supported for input" msgstr "»E« wird nicht bei der Eingabe unterstützt" -#: utils/adt/formatting.c:5879 +#: utils/adt/formatting.c:5988 #, c-format msgid "\"RN\" not supported for input" msgstr "»RN« wird nicht bei der Eingabe unterstützt" @@ -25658,8 +25732,8 @@ msgid "invalid int2vector data" msgstr "ungültige int2vector-Daten" -#: utils/adt/int.c:1558 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 -#: utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 +#: utils/adt/int.c:1558 utils/adt/int8.c:1433 utils/adt/numeric.c:1771 +#: utils/adt/timestamp.c:6550 utils/adt/timestamp.c:6636 #, c-format msgid "step size cannot equal zero" msgstr "Schrittgröße kann nicht gleich null sein" @@ -25668,19 +25742,19 @@ #: 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:4543 +#: 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:4549 #: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, 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" @@ -26113,7 +26187,7 @@ msgstr "NaN oder unendliche Werte sind für JSON-Path-Item-Methode .%s() nicht erlaubt" #: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 -#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 +#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1581 #, 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" @@ -26133,145 +26207,145 @@ 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:1439 utils/adt/jsonpath_exec.c:1528 +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1517 #, c-format msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" msgstr "Argument »%s« der JSON-Path-Item-Methode .%s() ist ungültig für Typ numeric" -#: utils/adt/jsonpath_exec.c:1487 +#: utils/adt/jsonpath_exec.c:1483 #, 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:1501 +#: utils/adt/jsonpath_exec.c:1497 #, 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:1561 utils/adt/jsonpath_exec.c:1585 +#: utils/adt/jsonpath_exec.c:1549 utils/adt/jsonpath_exec.c:1573 #, c-format msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" msgstr "Argument »%s« der JSON-Path-Item-Methode .%s() ist ungültig für Typ integer" -#: utils/adt/jsonpath_exec.c:1648 +#: utils/adt/jsonpath_exec.c:1636 #, 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:2137 +#: utils/adt/jsonpath_exec.c:2125 #, 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:2144 +#: utils/adt/jsonpath_exec.c:2132 #, 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:2212 +#: utils/adt/jsonpath_exec.c:2200 #, 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:2311 +#: utils/adt/jsonpath_exec.c:2299 #, 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:2357 +#: utils/adt/jsonpath_exec.c:2345 #, 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:2450 +#: utils/adt/jsonpath_exec.c:2438 #, 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:2484 utils/adt/jsonpath_exec.c:2490 -#: utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 -#: utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 -#: utils/adt/jsonpath_exec.c:2720 +#: utils/adt/jsonpath_exec.c:2472 utils/adt/jsonpath_exec.c:2478 +#: utils/adt/jsonpath_exec.c:2505 utils/adt/jsonpath_exec.c:2533 +#: utils/adt/jsonpath_exec.c:2586 utils/adt/jsonpath_exec.c:2637 +#: utils/adt/jsonpath_exec.c:2708 #, c-format msgid "%s format is not recognized: \"%s\"" msgstr "%s-Format wird nicht erkannt: »%s«" -#: utils/adt/jsonpath_exec.c:2486 +#: utils/adt/jsonpath_exec.c:2474 #, 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:2679 utils/adt/jsonpath_exec.c:2760 +#: utils/adt/jsonpath_exec.c:2667 utils/adt/jsonpath_exec.c:2748 #, 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:2840 +#: utils/adt/jsonpath_exec.c:2828 #, 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:3124 +#: utils/adt/jsonpath_exec.c:3112 #, 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:3158 +#: utils/adt/jsonpath_exec.c:3146 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "konnte JSON-Path-Variable »%s« nicht finden" -#: utils/adt/jsonpath_exec.c:3211 +#: utils/adt/jsonpath_exec.c:3199 #, c-format msgid "\"vars\" argument is not an object" msgstr "Argument »vars« ist kein Objekt" -#: utils/adt/jsonpath_exec.c:3212 +#: utils/adt/jsonpath_exec.c:3200 #, 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:3475 +#: utils/adt/jsonpath_exec.c:3463 #, 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:3487 +#: utils/adt/jsonpath_exec.c:3475 #, 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:3671 +#: utils/adt/jsonpath_exec.c:3659 #, 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:3673 +#: utils/adt/jsonpath_exec.c:3661 #, 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:3981 +#: utils/adt/jsonpath_exec.c:3969 #, 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:3983 utils/adt/jsonpath_exec.c:3988 +#: utils/adt/jsonpath_exec.c:3971 utils/adt/jsonpath_exec.c:3976 #, 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:3987 +#: utils/adt/jsonpath_exec.c:3975 #, 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:4045 utils/adt/jsonpath_exec.c:4069 +#: utils/adt/jsonpath_exec.c:4033 utils/adt/jsonpath_exec.c:4057 #, 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:4050 utils/adt/jsonpath_exec.c:4074 +#: utils/adt/jsonpath_exec.c:4038 utils/adt/jsonpath_exec.c:4062 #, 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" @@ -26433,12 +26507,12 @@ 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" @@ -26517,10 +26591,10 @@ msgid "cannot subtract inet values of different sizes" msgstr "Subtraktion von »inet«-Werten unterschiedlicher Größe nicht möglich" -#: utils/adt/numeric.c:793 utils/adt/numeric.c:3660 utils/adt/numeric.c:7217 -#: utils/adt/numeric.c:7420 utils/adt/numeric.c:7892 utils/adt/numeric.c:10587 -#: utils/adt/numeric.c:11062 utils/adt/numeric.c:11156 -#: utils/adt/numeric.c:11291 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3666 utils/adt/numeric.c:7223 +#: utils/adt/numeric.c:7426 utils/adt/numeric.c:7898 utils/adt/numeric.c:10593 +#: utils/adt/numeric.c:11068 utils/adt/numeric.c:11162 +#: utils/adt/numeric.c:11297 #, c-format msgid "value overflows numeric format" msgstr "Wert verursacht Überlauf im »numeric«-Format" @@ -26540,109 +26614,109 @@ msgid "invalid digit in external \"numeric\" value" msgstr "ungültige Ziffer in externem »numeric«-Wert" -#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 +#: utils/adt/numeric.c:1333 #, 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:1341 +#: utils/adt/numeric.c:1338 #, 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:1359 +#: utils/adt/numeric.c:1365 #, c-format msgid "invalid NUMERIC type modifier" msgstr "ungültiker Modifikator für Typ NUMERIC" -#: utils/adt/numeric.c:1725 +#: utils/adt/numeric.c:1731 #, c-format msgid "start value cannot be NaN" msgstr "Startwert kann nicht NaN sein" -#: utils/adt/numeric.c:1729 +#: utils/adt/numeric.c:1735 #, c-format msgid "start value cannot be infinity" msgstr "Startwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1736 +#: utils/adt/numeric.c:1742 #, c-format msgid "stop value cannot be NaN" msgstr "Stoppwert kann nicht NaN sein" -#: utils/adt/numeric.c:1740 +#: utils/adt/numeric.c:1746 #, c-format msgid "stop value cannot be infinity" msgstr "Stoppwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1753 +#: utils/adt/numeric.c:1759 #, c-format msgid "step size cannot be NaN" msgstr "Schrittgröße kann nicht NaN sein" -#: utils/adt/numeric.c:1757 +#: utils/adt/numeric.c:1763 #, c-format msgid "step size cannot be infinity" msgstr "Schrittgröße kann nicht unendlich sein" -#: utils/adt/numeric.c:3650 +#: utils/adt/numeric.c:3656 #, c-format msgid "factorial of a negative number is undefined" msgstr "Fakultät einer negativen Zahl ist undefiniert" -#: utils/adt/numeric.c:4257 +#: utils/adt/numeric.c:4263 #, c-format msgid "lower bound cannot be NaN" msgstr "Untergrenze kann nicht NaN sein" -#: utils/adt/numeric.c:4261 +#: utils/adt/numeric.c:4267 #, c-format msgid "lower bound cannot be infinity" msgstr "Untergrenze kann nicht unendlich sein" -#: utils/adt/numeric.c:4268 +#: utils/adt/numeric.c:4274 #, c-format msgid "upper bound cannot be NaN" msgstr "Obergrenze kann nicht NaN sein" -#: utils/adt/numeric.c:4272 +#: utils/adt/numeric.c:4278 #, c-format msgid "upper bound cannot be infinity" msgstr "Obergrenze kann nicht unendlich sein" -#: utils/adt/numeric.c:4433 utils/adt/numeric.c:4521 utils/adt/numeric.c:4581 -#: utils/adt/numeric.c:4777 +#: utils/adt/numeric.c:4439 utils/adt/numeric.c:4527 utils/adt/numeric.c:4587 +#: utils/adt/numeric.c:4783 #, c-format msgid "cannot convert NaN to %s" msgstr "kann NaN nicht in %s umwandeln" -#: utils/adt/numeric.c:4437 utils/adt/numeric.c:4525 utils/adt/numeric.c:4585 -#: utils/adt/numeric.c:4781 +#: utils/adt/numeric.c:4443 utils/adt/numeric.c:4531 utils/adt/numeric.c:4591 +#: utils/adt/numeric.c:4787 #, c-format msgid "cannot convert infinity to %s" msgstr "kann Unendlich nicht in %s umwandeln" -#: utils/adt/numeric.c:4790 +#: utils/adt/numeric.c:4796 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn ist außerhalb des gültigen Bereichs" -#: utils/adt/numeric.c:7982 utils/adt/numeric.c:8033 +#: utils/adt/numeric.c:7988 utils/adt/numeric.c:8039 #, c-format msgid "numeric field overflow" msgstr "Feldüberlauf bei Typ »numeric«" -#: utils/adt/numeric.c:7983 +#: utils/adt/numeric.c:7989 #, 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:8034 +#: utils/adt/numeric.c:8040 #, 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:11360 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/numeric.c:11366 utils/adt/pseudorandomfuncs.c:135 #: utils/adt/pseudorandomfuncs.c:159 #, c-format msgid "lower bound must be less than or equal to upper bound" @@ -26694,140 +26768,140 @@ msgid "locale name \"%s\" contains non-ASCII characters" msgstr "Locale-Name »%s« enthält Nicht-ASCII-Zeichen" -#: utils/adt/pg_locale.c:1510 +#: utils/adt/pg_locale.c:1518 #, c-format msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" msgstr "konnte Collator für Locale »%s« mit Regeln »%s« nicht öffnen: %s" -#: utils/adt/pg_locale.c:1524 utils/adt/pg_locale.c:3001 -#: utils/adt/pg_locale.c:3074 +#: utils/adt/pg_locale.c:1532 utils/adt/pg_locale.c:3011 +#: utils/adt/pg_locale.c:3084 #, c-format msgid "ICU is not supported in this build" msgstr "ICU wird in dieser Installation nicht unterstützt" -#: utils/adt/pg_locale.c:1552 +#: utils/adt/pg_locale.c:1560 #, c-format msgid "could not create locale \"%s\": %m" msgstr "konnte Locale »%s« nicht erzeugen: %m" -#: utils/adt/pg_locale.c:1555 +#: utils/adt/pg_locale.c:1563 #, 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.c:1676 +#: utils/adt/pg_locale.c:1688 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "Sortierfolgen mit unterschiedlichen »collate«- und »ctype«-Werten werden auf dieser Plattform nicht unterstützt" -#: utils/adt/pg_locale.c:1723 +#: utils/adt/pg_locale.c:1735 #, c-format msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "Sortierfolge »%s« hat keine tatsächliche Version, aber eine Version wurde aufgezeichnet" -#: utils/adt/pg_locale.c:1729 +#: utils/adt/pg_locale.c:1741 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "Version von Sortierfolge »%s« stimmt nicht überein" -#: utils/adt/pg_locale.c:1731 +#: utils/adt/pg_locale.c:1743 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "Die Sortierfolge in der Datenbank wurde mit Version %s erzeugt, aber das Betriebssystem hat Version %s." -#: utils/adt/pg_locale.c:1734 +#: utils/adt/pg_locale.c:1746 #, c-format 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:1778 utils/adt/pg_locale.c:2565 -#: utils/adt/pg_locale.c:2590 +#: utils/adt/pg_locale.c:1790 utils/adt/pg_locale.c:2572 +#: utils/adt/pg_locale.c:2597 #, 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:1820 +#: utils/adt/pg_locale.c:1832 #, c-format msgid "could not load locale \"%s\"" msgstr "konnte Locale »%s« nicht laden" -#: utils/adt/pg_locale.c:1845 +#: utils/adt/pg_locale.c:1857 #, c-format 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.c:1901 utils/adt/pg_locale.c:1914 +#: utils/adt/pg_locale.c:1922 utils/adt/pg_locale.c:1935 #, 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.c:1926 +#: utils/adt/pg_locale.c:1947 #, c-format msgid "could not compare Unicode strings: %m" msgstr "konnte Unicode-Zeichenketten nicht vergleichen: %m" -#: utils/adt/pg_locale.c:2100 +#: utils/adt/pg_locale.c:2119 #, c-format msgid "collation failed: %s" msgstr "Vergleichung fehlgeschlagen: %s" -#: utils/adt/pg_locale.c:2319 utils/adt/pg_locale.c:2354 +#: utils/adt/pg_locale.c:2326 utils/adt/pg_locale.c:2361 #, c-format msgid "sort key generation failed: %s" msgstr "Sortierschlüsselerzeugung fehlgeschlagen: %s" -#: utils/adt/pg_locale.c:2644 +#: utils/adt/pg_locale.c:2651 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "konnte Sprache nicht aus Locale »%s« ermitteln: %s" -#: utils/adt/pg_locale.c:2665 utils/adt/pg_locale.c:2681 +#: utils/adt/pg_locale.c:2672 utils/adt/pg_locale.c:2688 #, c-format msgid "could not open collator for locale \"%s\": %s" msgstr "konnte Collator für Locale »%s« nicht öffnen: %s" -#: utils/adt/pg_locale.c:2706 +#: utils/adt/pg_locale.c:2713 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "Kodierung »%s« wird von ICU nicht unterstützt" -#: utils/adt/pg_locale.c:2713 +#: utils/adt/pg_locale.c:2720 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "konnte ICU-Konverter für Kodierung »%s« nicht öffnen: %s" -#: utils/adt/pg_locale.c:2731 utils/adt/pg_locale.c:2750 -#: utils/adt/pg_locale.c:2806 utils/adt/pg_locale.c:2817 +#: utils/adt/pg_locale.c:2742 utils/adt/pg_locale.c:2760 +#: utils/adt/pg_locale.c:2816 utils/adt/pg_locale.c:2827 #, c-format msgid "%s failed: %s" msgstr "%s fehlgeschlagen: %s" -#: utils/adt/pg_locale.c:2992 +#: utils/adt/pg_locale.c:3002 #, 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:3033 +#: utils/adt/pg_locale.c:3043 #, 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:3035 utils/adt/pg_locale.c:3064 +#: utils/adt/pg_locale.c:3045 utils/adt/pg_locale.c:3074 #, 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:3062 +#: utils/adt/pg_locale.c:3072 #, c-format msgid "ICU locale \"%s\" has unknown language \"%s\"" msgstr "ICU-Locale »%s« hat unbekannte Sprache »%s«" -#: utils/adt/pg_locale.c:3213 +#: utils/adt/pg_locale.c:3223 #, c-format msgid "invalid multibyte character for locale" msgstr "ungültiges Mehrbytezeichen für Locale" -#: utils/adt/pg_locale.c:3214 +#: utils/adt/pg_locale.c:3224 #, 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." @@ -27008,8 +27082,8 @@ 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:10526 -#: utils/adt/ruleutils.c:10739 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10528 +#: utils/adt/ruleutils.c:10741 #, c-format msgid "too many arguments" msgstr "zu viele Argumente" @@ -27179,22 +27253,22 @@ msgid "cannot compare record types with different numbers of columns" msgstr "kann Record-Typen mit unterschiedlicher Anzahl Spalten nicht vergleichen" -#: utils/adt/ruleutils.c:2694 +#: utils/adt/ruleutils.c:2696 #, c-format msgid "input is a query, not an expression" msgstr "Eingabe ist eine Anfrage, kein Ausdruck" -#: utils/adt/ruleutils.c:2706 +#: utils/adt/ruleutils.c:2708 #, 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:2713 +#: utils/adt/ruleutils.c:2715 #, c-format msgid "expression contains variables" msgstr "Ausdruck enthält Variablen" -#: utils/adt/ruleutils.c:5246 +#: utils/adt/ruleutils.c:5248 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "Regel »%s« hat nicht unterstützten Ereignistyp %d" @@ -27242,21 +27316,21 @@ #: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 #: utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 -#: utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 -#: utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 -#: utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 -#: utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 -#: utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 -#: utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 -#: utils/adt/timestamp.c:3537 utils/adt/timestamp.c:3546 -#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 -#: utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 -#: utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 -#: utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 -#: utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 -#: utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 -#: utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 -#: utils/adt/timestamp.c:5097 +#: utils/adt/timestamp.c:2811 utils/adt/timestamp.c:2820 +#: utils/adt/timestamp.c:2835 utils/adt/timestamp.c:2909 +#: utils/adt/timestamp.c:2926 utils/adt/timestamp.c:2983 +#: utils/adt/timestamp.c:3026 utils/adt/timestamp.c:3404 +#: utils/adt/timestamp.c:3462 utils/adt/timestamp.c:3485 +#: utils/adt/timestamp.c:3494 utils/adt/timestamp.c:3518 +#: utils/adt/timestamp.c:3541 utils/adt/timestamp.c:3550 +#: utils/adt/timestamp.c:3685 utils/adt/timestamp.c:3786 +#: utils/adt/timestamp.c:4193 utils/adt/timestamp.c:4230 +#: utils/adt/timestamp.c:4278 utils/adt/timestamp.c:4287 +#: utils/adt/timestamp.c:4379 utils/adt/timestamp.c:4426 +#: utils/adt/timestamp.c:4435 utils/adt/timestamp.c:4531 +#: utils/adt/timestamp.c:4584 utils/adt/timestamp.c:4594 +#: utils/adt/timestamp.c:4789 utils/adt/timestamp.c:4799 +#: utils/adt/timestamp.c:5101 #, c-format msgid "interval out of range" msgstr "interval-Wert ist außerhalb des gültigen Bereichs" @@ -27281,32 +27355,32 @@ 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:4564 utils/adt/timestamp.c:4769 +#: utils/adt/timestamp.c:4568 utils/adt/timestamp.c:4773 #, c-format msgid "origin out of range" msgstr "Anfangspunkt ist außerhalb des gültigen Bereichs" -#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#: utils/adt/timestamp.c:4573 utils/adt/timestamp.c:4778 #, 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:4574 utils/adt/timestamp.c:4779 +#: utils/adt/timestamp.c:4578 utils/adt/timestamp.c:4783 #, 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:4585 utils/adt/timestamp.c:4790 +#: utils/adt/timestamp.c:4589 utils/adt/timestamp.c:4794 #, c-format msgid "stride must be greater than zero" msgstr "Schrittgröße muss größer als null sein" -#: utils/adt/timestamp.c:5091 +#: utils/adt/timestamp.c:5095 #, c-format msgid "Months usually have fractional weeks." msgstr "Monate haben gewöhnlich partielle Wochen." -#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#: utils/adt/timestamp.c:6555 utils/adt/timestamp.c:6641 #, c-format msgid "step size cannot be infinite" msgstr "Schrittgröße kann nicht unendlich sein" @@ -27411,62 +27485,67 @@ 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" @@ -27797,68 +27876,68 @@ 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" -#: utils/cache/lsyscache.c:1055 +#: utils/cache/lsyscache.c:1116 #, 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:2925 utils/cache/lsyscache.c:2958 -#: utils/cache/lsyscache.c:2991 utils/cache/lsyscache.c:3024 +#: utils/cache/lsyscache.c:3000 utils/cache/lsyscache.c:3033 +#: utils/cache/lsyscache.c:3066 utils/cache/lsyscache.c:3099 #, c-format msgid "type %s is only a shell" msgstr "Typ %s ist nur eine Hülle" -#: utils/cache/lsyscache.c:2930 +#: utils/cache/lsyscache.c:3005 #, c-format msgid "no input function available for type %s" msgstr "keine Eingabefunktion verfügbar für Typ %s" -#: utils/cache/lsyscache.c:2963 +#: utils/cache/lsyscache.c:3038 #, c-format msgid "no output function available for type %s" msgstr "keine Ausgabefunktion verfügbar für Typ %s" @@ -27873,27 +27952,27 @@ msgid "cached plan must not change result type" msgstr "gecachter Plan darf den Ergebnistyp nicht ändern" -#: utils/cache/relcache.c:3817 +#: utils/cache/relcache.c:3819 #, 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:3825 +#: utils/cache/relcache.c:3827 #, 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:6555 +#: utils/cache/relcache.c:6557 #, 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:6557 +#: utils/cache/relcache.c:6559 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Setze trotzdem fort, aber irgendwas stimmt nicht." -#: utils/cache/relcache.c:6887 +#: utils/cache/relcache.c:6889 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "konnte Cache-Datei »%s« nicht löschen: %m" @@ -27913,7 +27992,7 @@ msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "Relation-Mapping-Datei »%s« enthält falsche Prüfsumme" -#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 +#: utils/cache/typcache.c:1805 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "Record-Typ wurde nicht registriert" @@ -31021,16 +31100,26 @@ msgid "could not attach to dynamic shared area" msgstr "konnte nicht an dynamische Shared Area anbinden" -#: utils/mmgr/mcxt.c:1158 +#: utils/mmgr/mcxt.c:1161 #, 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:1314 +#: utils/mmgr/mcxt.c:1317 #, c-format msgid "logging memory contexts of PID %d" msgstr "logge Speicherkontexte von PID %d" +#: utils/mmgr/mcxt.c:1690 +#, c-format +msgid "invalid memory allocation request size %zu + %zu" +msgstr "ungültige Speicheranforderungsgröße %zu + %zu" + +#: utils/mmgr/mcxt.c:1709 +#, 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 -Nru postgresql-17-17.10/src/backend/po/ja.po postgresql-17-17.11/src/backend/po/ja.po --- postgresql-17-17.10/src/backend/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: postgres (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-10 09:24+0900\n" -"PO-Revision-Date: 2026-02-10 09:55+0900\n" +"POT-Creation-Date: 2026-07-03 15:53+0900\n" +"PO-Revision-Date: 2026-07-03 16:24+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -87,19 +87,19 @@ 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:3458 access/transam/xlog.c:4322 access/transam/xlogrecovery.c:1248 access/transam/xlogrecovery.c:1346 access/transam/xlogrecovery.c:1383 access/transam/xlogrecovery.c:1450 backup/basebackup.c:2123 backup/walsummary.c:283 commands/extension.c:3678 libpq/hba.c:764 -#: replication/logical/origin.c:745 replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5243 replication/logical/snapbuild.c:2099 replication/slot.c:2281 replication/slot.c:2322 replication/walsender.c:673 storage/file/buffile.c:470 storage/file/copydir.c:185 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:3458 access/transam/xlog.c:4322 access/transam/xlogrecovery.c:1248 access/transam/xlogrecovery.c:1346 access/transam/xlogrecovery.c:1383 access/transam/xlogrecovery.c:1450 backup/basebackup.c:2121 backup/walsummary.c:283 commands/extension.c:3678 libpq/hba.c:764 +#: replication/logical/origin.c:745 replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5241 replication/logical/snapbuild.c:2099 replication/slot.c:2283 replication/slot.c:2324 replication/walsender.c:673 storage/file/buffile.c:470 storage/file/copydir.c:185 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:3463 access/transam/xlog.c:4327 replication/logical/origin.c:750 replication/logical/origin.c:789 replication/logical/snapbuild.c:2104 replication/slot.c:2285 replication/slot.c:2326 replication/walsender.c:678 utils/cache/relmapper.c:833 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 access/transam/xlog.c:3463 access/transam/xlog.c:4327 replication/logical/origin.c:750 replication/logical/origin.c:789 replication/logical/snapbuild.c:2104 replication/slot.c:2287 replication/slot.c:2328 replication/walsender.c:678 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:1784 access/transam/xlog.c:3304 access/transam/xlog.c:3498 access/transam/xlog.c:3503 access/transam/xlog.c:3639 -#: access/transam/xlog.c:4292 access/transam/xlog.c:5227 commands/copyfrom.c:1799 commands/copyto.c:325 libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 replication/logical/origin.c:683 replication/logical/origin.c:822 replication/logical/reorderbuffer.c:5295 replication/logical/snapbuild.c:1866 replication/logical/snapbuild.c:1990 replication/slot.c:2169 replication/slot.c:2333 replication/walsender.c:688 storage/file/copydir.c:208 storage/file/copydir.c:213 +#: ../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:1785 access/transam/xlog.c:3304 access/transam/xlog.c:3498 access/transam/xlog.c:3503 access/transam/xlog.c:3639 +#: access/transam/xlog.c:4292 access/transam/xlog.c:5227 commands/copyfrom.c:1799 commands/copyto.c:325 libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 replication/logical/origin.c:683 replication/logical/origin.c:822 replication/logical/reorderbuffer.c:5293 replication/logical/snapbuild.c:1866 replication/logical/snapbuild.c:1990 replication/slot.c:2171 replication/slot.c:2335 replication/walsender.c:688 storage/file/copydir.c:208 storage/file/copydir.c:213 #: storage/file/fd.c:828 storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" @@ -122,28 +122,28 @@ "されるものと一致しないようです。この場合以下の結果は不正確になります。また、\n" "PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。" -#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 ../common/file_utils.c:70 ../common/file_utils.c:347 ../common/file_utils.c:406 ../common/file_utils.c:480 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:3211 access/transam/xlog.c:3374 access/transam/xlog.c:3413 access/transam/xlog.c:3606 access/transam/xlog.c:4312 -#: access/transam/xlogrecovery.c:4285 access/transam/xlogrecovery.c:4388 access/transam/xlogutils.c:836 backup/basebackup.c:547 backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 postmaster/syslogger.c:1511 replication/logical/origin.c:735 replication/logical/reorderbuffer.c:3896 replication/logical/reorderbuffer.c:4450 replication/logical/reorderbuffer.c:5223 replication/logical/snapbuild.c:1821 replication/logical/snapbuild.c:1931 -#: replication/slot.c:2253 replication/walsender.c:646 replication/walsender.c:3099 storage/file/copydir.c:151 storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 storage/file/fd.c:3830 storage/smgr/md.c:672 utils/cache/relmapper.c:818 utils/cache/relmapper.c:935 utils/error/elog.c:2124 utils/init/miscinit.c:1581 utils/init/miscinit.c:1715 utils/init/miscinit.c:1792 utils/misc/guc.c:4782 utils/misc/guc.c:4832 +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 ../common/file_utils.c:70 ../common/file_utils.c:347 ../common/file_utils.c:406 ../common/file_utils.c:480 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:3211 access/transam/xlog.c:3374 access/transam/xlog.c:3413 access/transam/xlog.c:3606 access/transam/xlog.c:4312 +#: access/transam/xlogrecovery.c:4285 access/transam/xlogrecovery.c:4388 access/transam/xlogutils.c:860 backup/basebackup.c:547 backup/basebackup.c:1596 backup/walsummary.c:220 libpq/hba.c:624 postmaster/syslogger.c:1511 replication/logical/origin.c:735 replication/logical/reorderbuffer.c:3894 replication/logical/reorderbuffer.c:4448 replication/logical/reorderbuffer.c:5221 replication/logical/snapbuild.c:1821 replication/logical/snapbuild.c:1931 +#: replication/slot.c:2255 replication/walsender.c:646 replication/walsender.c:3130 storage/file/copydir.c:151 storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 storage/file/fd.c:3830 storage/smgr/md.c:672 utils/cache/relmapper.c:818 utils/cache/relmapper.c:935 utils/error/elog.c:2124 utils/init/miscinit.c:1581 utils/init/miscinit.c:1715 utils/init/miscinit.c:1792 utils/misc/guc.c:4782 utils/misc/guc.c:4832 #, 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:1757 access/transam/twophase.c:1766 access/transam/xlog.c:9346 access/transam/xlogfuncs.c:698 backup/basebackup_server.c:173 backup/basebackup_server.c:266 backup/walsummary.c:304 postmaster/postmaster.c:4129 postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 postmaster/syslogger.c:1548 utils/cache/relmapper.c:947 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 access/transam/twophase.c:1758 access/transam/twophase.c:1767 access/transam/xlog.c:9346 access/transam/xlogfuncs.c:698 backup/basebackup_server.c:173 backup/basebackup_server.c:266 backup/walsummary.c:304 postmaster/postmaster.c:4115 postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 postmaster/syslogger.c:1548 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:418 ../common/file_utils.c:488 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:3297 access/transam/xlog.c:3492 access/transam/xlog.c:4285 access/transam/xlog.c:8721 access/transam/xlog.c:8766 -#: backup/basebackup_server.c:207 commands/dbcommands.c:514 replication/logical/snapbuild.c:1859 replication/slot.c:2153 replication/slot.c:2263 storage/file/fd.c:820 storage/file/fd.c:3851 storage/smgr/md.c:1345 storage/smgr/md.c:1390 storage/sync/sync.c:446 utils/misc/guc.c:4530 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 ../common/file_utils.c:418 ../common/file_utils.c:488 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:1779 access/transam/xlog.c:3297 access/transam/xlog.c:3492 access/transam/xlog.c:4285 access/transam/xlog.c:8721 access/transam/xlog.c:8766 +#: backup/basebackup_server.c:207 commands/dbcommands.c:514 replication/logical/snapbuild.c:1859 replication/slot.c:2155 replication/slot.c:2265 storage/file/fd.c:820 storage/file/fd.c:3851 storage/smgr/md.c:1345 storage/smgr/md.c:1390 storage/sync/sync.c:446 utils/misc/guc.c:4530 #, 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:562 ../common/exec.c:607 ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 ../common/md5_common.c:156 ../common/parse_manifest.c:157 ../common/parse_manifest.c:852 ../common/psprintf.c:143 ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:828 ../port/path.c:865 -#: ../port/path.c:882 access/transam/twophase.c:1418 access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1360 libpq/auth.c:1404 libpq/auth.c:1961 libpq/be-secure-gssapi.c:534 libpq/be-secure-gssapi.c:714 postmaster/bgworker.c:355 postmaster/bgworker.c:945 postmaster/postmaster.c:3562 postmaster/postmaster.c:4023 postmaster/postmaster.c:4385 postmaster/walsummarizer.c:935 replication/libpqwalreceiver/libpqwalreceiver.c:400 replication/logical/logical.c:212 -#: replication/walsender.c:853 storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 utils/activity/pgstat_shmem.c:508 utils/adt/formatting.c:1725 utils/adt/formatting.c:1873 utils/adt/formatting.c:2075 utils/adt/pg_locale.c:533 utils/adt/pg_locale.c:697 -#: utils/fmgr/dfmgr.c:229 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:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 utils/misc/guc.c:4508 utils/misc/tzparser.c:477 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:1157 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 ../common/cryptohash_openssl.c:356 ../common/exec.c:562 ../common/exec.c:607 ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 ../common/md5_common.c:156 ../common/parse_manifest.c:157 ../common/parse_manifest.c:852 ../common/psprintf.c:140 ../common/scram-common.c:268 ../common/stringinfo.c:311 ../port/path.c:845 ../port/path.c:882 +#: ../port/path.c:899 access/transam/twophase.c:1419 access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1360 libpq/auth.c:1404 libpq/auth.c:1961 libpq/be-secure-gssapi.c:534 libpq/be-secure-gssapi.c:714 postmaster/bgworker.c:355 postmaster/bgworker.c:945 postmaster/postmaster.c:3548 postmaster/postmaster.c:4009 postmaster/postmaster.c:4371 postmaster/walsummarizer.c:936 replication/libpqwalreceiver/libpqwalreceiver.c:400 replication/logical/logical.c:212 +#: replication/walsender.c:853 storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 utils/activity/pgstat_shmem.c:508 utils/adt/formatting.c:1727 utils/adt/formatting.c:1875 utils/adt/formatting.c:2077 utils/adt/pg_locale.c:533 utils/adt/pg_locale.c:697 +#: utils/fmgr/dfmgr.c:229 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:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 utils/misc/guc.c:4508 utils/misc/tzparser.c:477 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:1160 #: utils/mmgr/slab.c:370 #, c-format msgid "out of memory" @@ -201,22 +201,32 @@ msgid "%s() failed: %m" msgstr "%s() が失敗しました: %m" -#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:867 ../port/path.c:884 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:847 ../port/path.c:884 ../port/path.c:901 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:76 storage/file/fd.c:3516 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "ファイル\"%s\"に対してファイルシステムを同期できませんでした: %m" -#: ../common/file_utils.c:120 ../common/file_utils.c:566 ../common/file_utils.c:570 access/transam/twophase.c:1321 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 backup/walsummary.c:247 commands/copyfrom.c:1749 commands/copyto.c:700 commands/extension.c:3657 commands/tablespace.c:804 commands/tablespace.c:893 postmaster/pgarch.c:680 replication/logical/snapbuild.c:1717 +#: ../common/file_utils.c:120 ../common/file_utils.c:566 ../common/file_utils.c:570 access/transam/twophase.c:1322 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 backup/walsummary.c:247 commands/copyfrom.c:1749 commands/copyto.c:700 commands/extension.c:3657 commands/tablespace.c:804 commands/tablespace.c:893 postmaster/pgarch.c:680 replication/logical/snapbuild.c:1717 #: replication/logical/snapbuild.c:2220 storage/file/fd.c:1968 storage/file/fd.c:2054 storage/file/fd.c:3564 utils/adt/dbsize.c:105 utils/adt/dbsize.c:257 utils/adt/dbsize.c:337 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 @@ msgid "this build does not support sync method \"%s\"" msgstr "このビルドでは同期方式\"%s\"をサポートしていません" -#: ../common/file_utils.c:151 ../common/file_utils.c:281 ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 commands/tablespace.c:738 postmaster/postmaster.c:1472 storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:339 +#: ../common/file_utils.c:151 ../common/file_utils.c:281 ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 commands/tablespace.c:738 postmaster/postmaster.c:1473 storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:339 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" @@ -237,7 +247,7 @@ msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 postmaster/pgarch.c:834 postmaster/syslogger.c:1559 replication/logical/snapbuild.c:1878 replication/slot.c:965 replication/slot.c:2036 replication/slot.c:2185 storage/file/fd.c:838 utils/time/snapmgr.c:1255 +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 postmaster/pgarch.c:834 postmaster/syslogger.c:1559 replication/logical/snapbuild.c:1878 replication/slot.c:967 replication/slot.c:2038 replication/slot.c:2187 storage/file/fd.c:838 utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" @@ -246,101 +256,101 @@ msgid "internal error" msgstr "内部エラー" -#: ../common/jsonapi.c:2124 +#: ../common/jsonapi.c:2175 msgid "Recursive descent parser cannot use incremental lexer." msgstr "再帰降下パーサーは差分字句解析器を使用できません。" -#: ../common/jsonapi.c:2126 +#: ../common/jsonapi.c:2177 msgid "Incremental parser requires incremental lexer." msgstr "差分パーサーは差分字句解析器を必要とします。" -#: ../common/jsonapi.c:2128 +#: ../common/jsonapi.c:2179 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSONのネストが深すぎます、可能な最大の深さは6400です。" -#: ../common/jsonapi.c:2130 +#: ../common/jsonapi.c:2181 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "エスケープシーケンス\"\\%.*s\"は不正です。" -#: ../common/jsonapi.c:2134 +#: ../common/jsonapi.c:2185 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../common/jsonapi.c:2138 +#: ../common/jsonapi.c:2189 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "入力の終端を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2141 +#: ../common/jsonapi.c:2192 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "配列要素または\"]\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2144 +#: ../common/jsonapi.c:2195 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "\",\"または\"]\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2147 +#: ../common/jsonapi.c:2198 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "\":\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2150 +#: ../common/jsonapi.c:2201 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON値を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2153 +#: ../common/jsonapi.c:2204 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../common/jsonapi.c:2155 +#: ../common/jsonapi.c:2206 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "文字列または\"}\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2158 +#: ../common/jsonapi.c:2209 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "\",\"または\"}\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2161 +#: ../common/jsonapi.c:2212 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "文字列を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2164 +#: ../common/jsonapi.c:2215 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "トークン\"%.*s\"は不正です。" -#: ../common/jsonapi.c:2167 jsonpath_scan.l:608 +#: ../common/jsonapi.c:2218 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../common/jsonapi.c:2169 +#: ../common/jsonapi.c:2220 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../common/jsonapi.c:2172 +#: ../common/jsonapi.c:2223 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:2181 +#: ../common/jsonapi.c:2232 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicodeエスケープの値がサーバーエンコーディング%sに変換できませんでした。" -#: ../common/jsonapi.c:2188 jsonpath_scan.l:641 +#: ../common/jsonapi.c:2239 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../common/jsonapi.c:2190 jsonpath_scan.l:652 jsonpath_scan.l:662 jsonpath_scan.l:713 +#: ../common/jsonapi.c:2241 jsonpath_scan.l:652 jsonpath_scan.l:662 jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodeのローサロゲートはハイサロゲートに続かなければなりません。" @@ -455,7 +465,7 @@ msgid "file size is not an integer" msgstr "ファイルサイズが整数ではありません" -#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#: ../common/parse_manifest.c:699 backup/basebackup.c:868 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "認識できないチェックサムアルゴリズム: \"%s\"" @@ -522,7 +532,7 @@ 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:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6942 utils/misc/guc.c:6983 +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 ../common/percentrepl.c:118 ../common/percentrepl.c:124 tcop/backend_startup.c:760 utils/misc/guc.c:3167 utils/misc/guc.c:3208 utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6942 utils/misc/guc.c:6983 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "パラメータ\"%s\"の値が不正です: \"%s\"" @@ -582,7 +592,7 @@ 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:1717 access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:399 backup/walsummary.c:254 postmaster/postmaster.c:1050 postmaster/syslogger.c:1488 replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4719 replication/logical/snapbuild.c:1759 replication/logical/snapbuild.c:2193 replication/slot.c:2237 storage/file/fd.c:878 storage/file/fd.c:3378 +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 access/transam/twophase.c:1718 access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:399 backup/walsummary.c:254 postmaster/postmaster.c:1051 postmaster/syslogger.c:1488 replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4717 replication/logical/snapbuild.c:1759 replication/logical/snapbuild.c:2193 replication/slot.c:2239 storage/file/fd.c:878 storage/file/fd.c:3378 #: storage/file/fd.c:3440 storage/file/reinit.c:261 storage/ipc/dsm.c:343 storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 utils/time/snapmgr.c:1591 #, c-format msgid "could not remove file \"%s\": %m" @@ -605,12 +615,12 @@ msgid "could not encode server key" msgstr "サーバーキーのエンコードに失敗しました" -#: ../common/stringinfo.c:315 +#: ../common/stringinfo.c:312 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "%dバイトを持つ文字列バッファを%dバイト多く、大きくすることができません。" -#: ../common/stringinfo.c:319 +#: ../common/stringinfo.c:316 #, c-format msgid "" "out of memory\n" @@ -718,7 +728,7 @@ msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "データベースシステムに干渉するアンチウィルス、バックアップといったソフトウェアが存在する可能性があります。" -#: ../port/path.c:852 +#: ../port/path.c:869 #, c-format msgid "could not get current working directory: %m\n" msgstr "現在の作業ディレクトリを取得できませんでした: %m\n" @@ -783,7 +793,7 @@ msgid "could not open parent table of index \"%s\"" msgstr "インデックス\"%s\"の親テーブルをオープンできませんでした" -#: access/brin/brin.c:1463 access/brin/brin.c:1559 access/gin/ginfast.c:1085 parser/parse_utilcmd.c:2277 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 access/gin/ginfast.c:1085 parser/parse_utilcmd.c:2281 #, c-format msgid "index \"%s\" is not valid" msgstr "インデックス\"%s\"は有効ではありません" @@ -893,7 +903,7 @@ msgid "index row requires %zu bytes, maximum size is %zu" msgstr "インデックス行が%zuバイトを必要としますが最大値は%zuです" -#: access/common/printtup.c:292 commands/explain.c:5376 tcop/fastpath.c:107 tcop/fastpath.c:454 tcop/postgres.c:1956 +#: access/common/printtup.c:292 commands/explain.c:5376 tcop/fastpath.c:107 tcop/fastpath.c:454 tcop/postgres.c:1957 #, c-format msgid "unsupported format code: %d" msgstr "非サポートの書式コード: %d" @@ -1036,7 +1046,7 @@ msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "これを修復するには REINDEX INDEX \"%s\" をおこなってください。" -#: access/gin/ginutil.c:147 executor/execExpr.c:2200 utils/adt/arrayfuncs.c:4022 utils/adt/arrayfuncs.c:6720 utils/adt/rowtypes.c:974 +#: access/gin/ginutil.c:147 executor/execExpr.c:2200 utils/adt/arrayfuncs.c:4022 utils/adt/arrayfuncs.c:6727 utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" msgstr "%s型の比較関数が見つかりません" @@ -1111,8 +1121,8 @@ msgid "could not determine which collation to use for string hashing" msgstr "文字列のハッシュ値計算で使用する照合順序を特定できませんでした" -#: access/hash/hashfunc.c:281 access/hash/hashfunc.c:337 catalog/heap.c:673 catalog/heap.c:679 commands/createas.c:201 commands/createas.c:508 commands/indexcmds.c:2021 commands/tablecmds.c:18252 commands/view.c:81 regex/regc_pg_locale.c:245 utils/adt/formatting.c:1653 utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 utils/adt/like.c:189 utils/adt/like_support.c:1024 utils/adt/varchar.c:738 utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 -#: utils/adt/varlena.c:1528 +#: access/hash/hashfunc.c:281 access/hash/hashfunc.c:337 catalog/heap.c:687 catalog/heap.c:693 commands/createas.c:201 commands/createas.c:508 commands/indexcmds.c:2021 commands/tablecmds.c:18252 commands/view.c:81 regex/regc_pg_locale.c:245 utils/adt/formatting.c:1655 utils/adt/formatting.c:1803 utils/adt/formatting.c:1993 utils/adt/like.c:189 utils/adt/like_support.c:1024 utils/adt/varchar.c:738 utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 +#: utils/adt/varlena.c:1566 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "照合順序を明示するには COLLATE 句を使います。" @@ -1212,8 +1222,8 @@ 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:3236 access/transam/xlog.c:3427 access/transam/xlog.c:4264 access/transam/xlog.c:9335 access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:494 postmaster/launch_backend.c:340 postmaster/postmaster.c:4116 postmaster/walsummarizer.c:1212 -#: replication/logical/origin.c:603 replication/slot.c:2097 storage/file/copydir.c:157 storage/smgr/md.c:230 utils/time/snapmgr.c:1234 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 access/transam/timeline.c:329 access/transam/timeline.c:481 access/transam/xlog.c:3236 access/transam/xlog.c:3427 access/transam/xlog.c:4264 access/transam/xlog.c:9335 access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:494 postmaster/launch_backend.c:340 postmaster/postmaster.c:4102 postmaster/walsummarizer.c:1213 +#: replication/logical/origin.c:603 replication/slot.c:2099 storage/file/copydir.c:157 storage/smgr/md.c:230 utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作成できませんでした: %m" @@ -1223,7 +1233,7 @@ 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:3286 access/transam/xlog.c:3483 access/transam/xlog.c:4276 commands/dbcommands.c:506 postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 replication/logical/origin.c:615 replication/logical/origin.c:657 replication/logical/origin.c:676 replication/logical/snapbuild.c:1835 replication/slot.c:2133 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:498 access/transam/xlog.c:3286 access/transam/xlog.c:3483 access/transam/xlog.c:4276 commands/dbcommands.c:506 postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 replication/logical/origin.c:615 replication/logical/origin.c:657 replication/logical/origin.c:676 replication/logical/snapbuild.c:1835 replication/slot.c:2135 #: storage/file/buffile.c:545 storage/file/copydir.c:197 utils/init/miscinit.c:1656 utils/init/miscinit.c:1667 utils/init/miscinit.c:1675 utils/misc/guc.c:4491 utils/misc/guc.c:4522 utils/misc/guc.c:5680 utils/misc/guc.c:5698 utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" @@ -1491,7 +1501,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:2323 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 parser/parse_utilcmd.c:2327 #, c-format msgid "index \"%s\" is not a btree" msgstr "インデックス\"%s\"はbtreeではありません" @@ -1610,114 +1620,114 @@ msgid "Make sure the configuration parameter \"%s\" is set." msgstr "設定パラメータ\"%s\"が設定されていることを確認してください。" -#: access/transam/multixact.c:1173 +#: access/transam/multixact.c:1260 #, 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:1175 access/transam/multixact.c:1182 access/transam/multixact.c:1206 access/transam/multixact.c:1215 access/transam/varsup.c:158 access/transam/varsup.c:165 +#: access/transam/multixact.c:1262 access/transam/multixact.c:1269 access/transam/multixact.c:1293 access/transam/multixact.c:1302 #, 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:1180 +#: access/transam/multixact.c:1267 #, 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:1201 access/transam/multixact.c:2546 +#: access/transam/multixact.c:1288 access/transam/multixact.c:2644 #, 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:1210 access/transam/multixact.c:2555 +#: access/transam/multixact.c:1297 access/transam/multixact.c:2653 #, 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:1274 +#: access/transam/multixact.c:1361 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "マルチトランザクションの\"メンバ\"が制限を超えました" -#: access/transam/multixact.c:1275 +#: access/transam/multixact.c:1362 #, 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:1280 +#: access/transam/multixact.c:1367 #, 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:1311 +#: access/transam/multixact.c:1398 #, 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:1316 +#: access/transam/multixact.c:1403 #, 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:1455 +#: access/transam/multixact.c:1542 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %uはもう存在しません: 周回しているようです" -#: access/transam/multixact.c:1461 +#: access/transam/multixact.c:1548 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %uを作成できませんでした: 周回している様子" -#: access/transam/multixact.c:1554 +#: access/transam/multixact.c:1641 #, c-format msgid "MultiXact %u has invalid next offset" msgstr "MultiXact %u の次のオフセットが不正です" -#: access/transam/multixact.c:2551 access/transam/multixact.c:2560 +#: access/transam/multixact.c:2649 access/transam/multixact.c:2658 #, 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:2839 +#: access/transam/multixact.c:2941 #, 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:2861 +#: access/transam/multixact.c:2963 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "マルチトランザクションメンバーの周回防止機能が有効になりました" -#: access/transam/multixact.c:3252 +#: access/transam/multixact.c:3354 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "最古のマルチトランザクション%uが見つかりません、アクセス可能な最古のものは%u、切り詰めをスキップします" -#: access/transam/multixact.c:3270 +#: access/transam/multixact.c:3372 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "マルチトランザクション%uがディスク上に存在しないため、そこまでの切り詰めができません、切り詰めをスキップします" -#: access/transam/multixact.c:3287 +#: access/transam/multixact.c:3389 #, c-format msgid "cannot truncate up to MultiXact %u because it has invalid offset, skipping truncation" msgstr "マルチトランザクション%uのオフセットが不正なため、そこまでの切り詰めができません、切り詰めをスキップします" -#: access/transam/multixact.c:3632 +#: access/transam/multixact.c:3726 #, c-format msgid "invalid MultiXactId: %u" msgstr "不正なMultiXactId: %u" @@ -1746,12 +1756,12 @@ msgid "parallel worker" msgstr "パラレルワーカー" -#: access/transam/parallel.c:1351 replication/logical/applyparallelworker.c:897 +#: access/transam/parallel.c:1351 replication/logical/applyparallelworker.c:906 #, c-format msgid "could not map dynamic shared memory segment" msgstr "動的共有メモリセグメントをマップできませんでした" -#: access/transam/parallel.c:1356 replication/logical/applyparallelworker.c:903 +#: access/transam/parallel.c:1356 replication/logical/applyparallelworker.c:912 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "動的共有メモリセグメントのマジックナンバーが不正です" @@ -1931,12 +1941,12 @@ msgid "transaction identifier \"%s\" is already in use" msgstr "トランザクション識別子\"%s\"はすでに存在します" -#: access/transam/twophase.c:404 access/transam/twophase.c:2531 +#: access/transam/twophase.c:404 access/transam/twophase.c:2532 #, c-format msgid "maximum number of prepared transactions reached" msgstr "準備済みのトランザクションの最大数に達しました" -#: access/transam/twophase.c:405 access/transam/twophase.c:2532 +#: access/transam/twophase.c:405 access/transam/twophase.c:2533 #, c-format msgid "Increase \"max_prepared_transactions\" (currently %d)." msgstr "\"max_prepared_transactions\"を大きくしてください(現在は%d)。" @@ -1971,119 +1981,119 @@ 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:565 postmaster/walsummarizer.c:936 replication/logical/logical.c:213 replication/walsender.c:854 +#: access/transam/twophase.c:1420 access/transam/xlogrecovery.c:565 postmaster/walsummarizer.c:937 replication/logical/logical.c:213 replication/walsender.c:854 #, 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:1745 +#: access/transam/twophase.c:1746 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "ファイル\"%s\"を再作成できませんでした: %m" -#: access/transam/twophase.c:1872 +#: access/transam/twophase.c:1873 #, 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:2107 +#: access/transam/twophase.c:2108 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "共有メモリから準備済みトランザクション%uを復元します" -#: access/transam/twophase.c:2200 +#: access/transam/twophase.c:2201 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "不要になったトランザクション%uの2相状態ファイルを削除します" -#: access/transam/twophase.c:2207 +#: access/transam/twophase.c:2208 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "不要になったトランザクション%uの2相状態をメモリから削除します" -#: access/transam/twophase.c:2220 +#: access/transam/twophase.c:2221 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "トランザクション%uの未来の2相状態ファイルを削除します" -#: access/transam/twophase.c:2227 +#: access/transam/twophase.c:2228 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "未来のトランザクション%uの2相状態をメモリから削除します" -#: access/transam/twophase.c:2252 +#: access/transam/twophase.c:2253 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "トランザクション%uの2相状態ファイルが破損しています" -#: access/transam/twophase.c:2257 +#: access/transam/twophase.c:2258 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "メモリ上にあるトランザクション%uの2相状態が破損しています" -#: access/transam/twophase.c:2514 +#: access/transam/twophase.c:2515 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "トランザクション%uの2相状態ファイルを復元できませんでした" -#: access/transam/twophase.c:2516 +#: access/transam/twophase.c:2517 #, 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:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#: access/transam/twophase.c:2525 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 #, c-format msgid "could not access file \"%s\": %m" msgstr "ファイル\"%s\"にアクセスできませんでした: %m" @@ -2093,6 +2103,15 @@ 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" @@ -2261,7 +2280,7 @@ msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" msgstr "ログファイル \"%s\" のオフセット%uに長さ%zuの書き込みができませんでした: %m" -#: access/transam/xlog.c:3720 access/transam/xlogutils.c:831 replication/walsender.c:3093 +#: access/transam/xlog.c:3720 access/transam/xlogutils.c:855 replication/walsender.c:3124 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "要求された WAL セグメント %s はすでに削除されています" @@ -2402,12 +2421,12 @@ msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\"は\"wal_segment_size\"の2倍以上でなければなりません" -#: access/transam/xlog.c:4643 catalog/namespace.c:4699 commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 replication/slot.c:2487 tcop/postgres.c:3715 utils/error/elog.c:2247 +#: access/transam/xlog.c:4643 catalog/namespace.c:4699 commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 replication/slot.c:2489 tcop/postgres.c:3735 utils/error/elog.c:2247 #, c-format msgid "List syntax is invalid." msgstr "リスト文法が無効です" -#: access/transam/xlog.c:4689 commands/user.c:2545 commands/variable.c:173 tcop/postgres.c:3731 utils/error/elog.c:2273 +#: access/transam/xlog.c:4689 commands/user.c:2545 commands/variable.c:173 tcop/postgres.c:3751 utils/error/elog.c:2273 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "不明なキーワードです: \"%s\"" @@ -2619,12 +2638,12 @@ 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:9072 backup/basebackup.c:1417 utils/adt/misc.c:354 +#: access/transam/xlog.c:9072 backup/basebackup.c:1415 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読めませんでした: %m" -#: access/transam/xlog.c:9079 backup/basebackup.c:1422 utils/adt/misc.c:359 +#: access/transam/xlog.c:9079 backup/basebackup.c:1420 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" @@ -2634,12 +2653,12 @@ msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "サーバーの開始時にwal_levelを\"replica\"または \"logical\"に設定する必要があります。" -#: access/transam/xlog.c:9238 backup/basebackup.c:1281 +#: access/transam/xlog.c:9238 backup/basebackup.c:1279 #, c-format msgid "the standby was promoted during online backup" msgstr "オンラインバックアップ中にスタンバイが昇格しました" -#: access/transam/xlog.c:9239 backup/basebackup.c:1282 +#: access/transam/xlog.c:9239 backup/basebackup.c:1280 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "つまり取得中のバックアップは破損しているため使用してはいけません。再度オンラインバックアップを取得してください。" @@ -2717,7 +2736,7 @@ msgid "could not write archive status file \"%s\": %m" msgstr "アーカイブステータスファイル\"%s\"に書き込めませんでした: %m" -#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:995 #, c-format msgid "a backup is already in progress in this session" msgstr "このセッションではすでにバックアップが進行中です" @@ -3421,8 +3440,8 @@ msgid "You can restart the server after making the necessary configuration changes." msgstr "必要な設定変更を行うことでサーバーを再起動できます。" -#: access/transam/xlogrecovery.c:4773 access/transam/xlogrecovery.c:4775 catalog/dependency.c:1153 catalog/dependency.c:1160 catalog/dependency.c:1171 commands/tablecmds.c:1459 commands/tablecmds.c:15152 commands/tablespace.c:460 commands/user.c:1302 commands/vacuum.c:213 commands/view.c:441 executor/execExprInterp.c:4655 executor/execExprInterp.c:4663 libpq/auth.c:332 replication/logical/applyparallelworker.c:1048 replication/slot.c:261 replication/slot.c:2502 -#: replication/slot.c:2504 replication/syncrep.c:1078 storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6836 utils/misc/guc.c:6870 utils/misc/guc.c:6904 utils/misc/guc.c:6947 utils/misc/guc.c:6989 +#: access/transam/xlogrecovery.c:4773 access/transam/xlogrecovery.c:4775 catalog/dependency.c:1153 catalog/dependency.c:1160 catalog/dependency.c:1171 commands/tablecmds.c:1459 commands/tablecmds.c:15152 commands/tablespace.c:460 commands/user.c:1302 commands/vacuum.c:213 commands/view.c:441 executor/execExprInterp.c:4726 executor/execExprInterp.c:4734 libpq/auth.c:332 replication/logical/applyparallelworker.c:1057 replication/slot.c:261 replication/slot.c:2504 +#: replication/slot.c:2506 replication/syncrep.c:1078 storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1465 utils/misc/guc.c:3169 utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6836 utils/misc/guc.c:6870 utils/misc/guc.c:6904 utils/misc/guc.c:6947 utils/misc/guc.c:6989 #, c-format msgid "%s" msgstr "%s" @@ -3452,12 +3471,12 @@ msgid "\"recovery_target_timeline\" is not a valid number." msgstr "\"recovery_target_timeline\"が数値として妥当ではありません。" -#: access/transam/xlogutils.c:1032 +#: access/transam/xlogutils.c:1068 #, c-format msgid "could not read from WAL segment %s, offset %d: %m" msgstr "WALセグメント%s、オフセット%dを読み取れませんでした: %m" -#: access/transam/xlogutils.c:1039 +#: access/transam/xlogutils.c:1075 #, 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 読み込みました" @@ -3477,7 +3496,7 @@ msgid "archive command was terminated by exception 0x%X" msgstr "アーカイブコマンドが例外0x%Xで終了しました" -#: archive/shell_archive.c:109 postmaster/postmaster.c:3097 +#: archive/shell_archive.c:109 postmaster/postmaster.c:3083 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "16進値の説明についてはC インクルードファイル\"ntstatus.h\"を参照してください。" @@ -3538,113 +3557,113 @@ msgid "checksum verification failure during base backup" msgstr "ベースバックアップ中にチェックサム確認が失敗しました" -#: 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 +#: backup/basebackup.c:731 backup/basebackup.c:740 backup/basebackup.c:751 backup/basebackup.c:768 backup/basebackup.c:777 backup/basebackup.c:786 backup/basebackup.c:801 backup/basebackup.c:818 backup/basebackup.c:827 backup/basebackup.c:839 backup/basebackup.c:863 backup/basebackup.c:877 backup/basebackup.c:888 backup/basebackup.c:899 backup/basebackup.c:912 #, c-format msgid "duplicate option \"%s\"" msgstr "\"%s\"オプションは重複しています" -#: backup/basebackup.c:761 +#: backup/basebackup.c:759 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "認識されないチェックポイントタイプ: \"%s\"" -#: backup/basebackup.c:793 +#: backup/basebackup.c:791 #, c-format msgid "incremental backups cannot be taken unless WAL summarization is enabled" msgstr "WAL集約が有効でなければ差分バックアップは取得できません" -#: backup/basebackup.c:809 +#: backup/basebackup.c:807 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%dはパラメータ\"%s\"の有効範囲を超えています(%d .. %d)" -#: backup/basebackup.c:854 +#: backup/basebackup.c:852 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "認識できない目録オプション: \"%s\"" -#: backup/basebackup.c:905 +#: backup/basebackup.c:903 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "認識できない圧縮アルゴリズム: \"%s\"" -#: backup/basebackup.c:921 +#: backup/basebackup.c:919 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "認識できないベースバックアップオプション: \"%s\"" -#: backup/basebackup.c:932 +#: backup/basebackup.c:930 #, c-format msgid "manifest checksums require a backup manifest" msgstr "目録のチェックサムにはバックアップ目録が必要です" -#: backup/basebackup.c:941 +#: backup/basebackup.c:939 #, c-format msgid "target detail cannot be used without target" msgstr "ターゲット詳細はターゲットの指定なしでは指定できません" -#: backup/basebackup.c:950 backup/basebackup_target.c:218 +#: backup/basebackup.c:948 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "ターゲット\"%s\"はターゲット詳細を受け付けません" -#: backup/basebackup.c:961 +#: backup/basebackup.c:959 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "圧縮詳細は圧縮が有効でない場合は指定できません" -#: backup/basebackup.c:974 +#: backup/basebackup.c:972 #, c-format msgid "invalid compression specification: %s" msgstr "不正な圧縮指定: %s" -#: backup/basebackup.c:1024 +#: backup/basebackup.c:1022 #, c-format msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" msgstr "差分のBASE_BACKUPの実行前にUPLOAD_MANIFESTを実行する必要があります" -#: backup/basebackup.c:1157 backup/basebackup.c:1358 +#: backup/basebackup.c:1155 backup/basebackup.c:1356 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "\"%s\"というファイルまたはディレクトリの情報を取得できませんでした。: %m" -#: backup/basebackup.c:1544 +#: backup/basebackup.c:1542 #, c-format msgid "skipping special file \"%s\"" msgstr "スペシャルファイル\"%s\"をスキップしています" -#: backup/basebackup.c:1751 +#: backup/basebackup.c:1749 #, 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:1813 +#: backup/basebackup.c:1811 #, 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:1917 +#: backup/basebackup.c:1915 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" msgstr "ファイル\"%s\"のブロック%uでチェックサム検証が失敗しました: 計算されたチェックサムは%Xですが想定は%Xです" -#: backup/basebackup.c:1924 +#: backup/basebackup.c:1922 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "ファイル\"%s\"における以降のチェックサムエラーは報告されません" -#: backup/basebackup.c:2048 +#: backup/basebackup.c:2046 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "ファイル名がtarフォーマットに対して長すぎます: \"%s\"" -#: backup/basebackup.c:2053 +#: backup/basebackup.c:2051 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "シンボリックリンクのリンク先tarのフォーマットにとって長すぎます: ファイル名 \"%s\", リンク先 \"%s\"" -#: backup/basebackup.c:2127 +#: backup/basebackup.c:2125 #, c-format msgid "could not read file \"%s\": read %zd of %zu" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$zdバイトを読み込みました" @@ -3739,7 +3758,7 @@ msgid "relative path not allowed for backup stored on server" msgstr "サーバー上に格納されるバックアップでは相対パスは指定できません" -#: backup/basebackup_server.c:102 commands/dbcommands.c:477 commands/tablespace.c:157 commands/tablespace.c:173 commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2024 storage/file/copydir.c:47 +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 commands/tablespace.c:157 commands/tablespace.c:173 commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2026 storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" @@ -3759,10 +3778,10 @@ 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 @@ -3789,22 +3808,27 @@ 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 %lld" msgstr "不正なタイムライン%lld" -#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3946 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:624 tcop/postgres.c:3966 #, c-format msgid "--%s requires a value" msgstr "--%sには値が必要です" -#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:628 tcop/postgres.c:3951 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:629 tcop/postgres.c:3971 #, c-format msgid "-c %s requires a value" msgstr "-c %sは値が必要です" -#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:746 postmaster/postmaster.c:759 +#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:747 postmaster/postmaster.c:760 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細については\"%s --help\"を実行してください。\n" @@ -3964,8 +3988,8 @@ msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "GRANT/REVOKE ON SCHEMAS を使っている時には IN SCHEMA 句は指定できません" -#: catalog/aclchk.c:1617 catalog/catalog.c:659 catalog/objectaddress.c:1523 catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:988 commands/sequence.c:1655 commands/tablecmds.c:7574 commands/tablecmds.c:7728 commands/tablecmds.c:7778 commands/tablecmds.c:7852 commands/tablecmds.c:7922 commands/tablecmds.c:8052 commands/tablecmds.c:8181 commands/tablecmds.c:8275 commands/tablecmds.c:8376 commands/tablecmds.c:8503 commands/tablecmds.c:8533 -#: commands/tablecmds.c:8675 commands/tablecmds.c:8768 commands/tablecmds.c:8902 commands/tablecmds.c:9014 commands/tablecmds.c:12838 commands/tablecmds.c:13030 commands/tablecmds.c:13191 commands/tablecmds.c:14403 commands/tablecmds.c:17030 commands/trigger.c:943 parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 parser/parse_type.c:144 parser/parse_utilcmd.c:3409 parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2940 +#: catalog/aclchk.c:1617 catalog/catalog.c:659 catalog/objectaddress.c:1523 catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:989 commands/sequence.c:1655 commands/tablecmds.c:7574 commands/tablecmds.c:7728 commands/tablecmds.c:7778 commands/tablecmds.c:7852 commands/tablecmds.c:7922 commands/tablecmds.c:8052 commands/tablecmds.c:8181 commands/tablecmds.c:8275 commands/tablecmds.c:8376 commands/tablecmds.c:8503 commands/tablecmds.c:8533 +#: commands/tablecmds.c:8675 commands/tablecmds.c:8768 commands/tablecmds.c:8902 commands/tablecmds.c:9014 commands/tablecmds.c:12838 commands/tablecmds.c:13030 commands/tablecmds.c:13191 commands/tablecmds.c:14403 commands/tablecmds.c:17030 commands/trigger.c:943 parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 parser/parse_type.c:144 parser/parse_utilcmd.c:3413 parser/parse_utilcmd.c:3453 parser/parse_utilcmd.c:3495 utils/adt/acl.c:2940 #: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" @@ -4438,7 +4462,7 @@ msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() はシステムカタログでのみ使用できます" -#: catalog/catalog.c:651 parser/parse_utilcmd.c:2270 +#: catalog/catalog.c:651 parser/parse_utilcmd.c:2274 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "インデックス\"%s\"はテーブル\"%s\"には属していません" @@ -4547,168 +4571,168 @@ msgstr "列名\"%s\"が複数指定されました" #. translator: first %s is an integer not a name -#: catalog/heap.c:580 +#: catalog/heap.c:584 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "パーティションキー列%sは疑似型%sです" -#: catalog/heap.c:585 +#: catalog/heap.c:589 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "列\"%s\"は疑似型%sです" -#: catalog/heap.c:616 +#: catalog/heap.c:620 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "複合型 %s がそれ自身のメンバーになることはできません" #. translator: first %s is an integer not a name -#: catalog/heap.c:671 +#: catalog/heap.c:685 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "照合可能な型 %2$s のパーティションキー列%1$sのための照合順序が見つかりませんでした" -#: catalog/heap.c:677 commands/createas.c:198 commands/createas.c:505 +#: catalog/heap.c:691 commands/createas.c:198 commands/createas.c:505 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "照合可能な型 %2$s を持つ列\"%1$s\"のための照合順序を決定できませんでした" -#: catalog/heap.c:1162 catalog/index.c:899 commands/createas.c:401 commands/tablecmds.c:4171 +#: catalog/heap.c:1179 catalog/index.c:899 commands/createas.c:401 commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "リレーション\"%s\"はすでに存在します" -#: catalog/heap.c:1178 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:1179 commands/typecmds.c:1405 commands/typecmds.c:1585 commands/typecmds.c:2556 +#: 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:1179 commands/typecmds.c:1405 commands/typecmds.c:1592 commands/typecmds.c:2563 #, c-format msgid "type \"%s\" already exists" msgstr "型\"%s\"はすでに存在します" -#: catalog/heap.c:1179 +#: catalog/heap.c:1196 #, 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:1219 +#: catalog/heap.c:1236 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にTOASTのrelfilenumberの値が設定されていません" -#: catalog/heap.c:1230 +#: catalog/heap.c:1247 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_classのヒープOIDが設定されていません" -#: catalog/heap.c:1240 +#: catalog/heap.c:1257 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にrelfilenumberの値が設定されていません" -#: catalog/heap.c:2185 +#: catalog/heap.c:2202 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"に NO INHERIT 制約は追加できません" -#: catalog/heap.c:2452 +#: catalog/heap.c:2469 #, c-format msgid "check constraint \"%s\" already exists" msgstr "検査制約\"%s\"はすでに存在します" -#: catalog/heap.c:2624 catalog/index.c:913 catalog/pg_constraint.c:725 commands/tablecmds.c:9389 +#: catalog/heap.c:2641 catalog/index.c:913 catalog/pg_constraint.c:725 commands/tablecmds.c:9389 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "すでに制約\"%s\"はリレーション\"%s\"に存在します" -#: catalog/heap.c:2631 +#: catalog/heap.c:2648 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承されていない制約と競合します" -#: catalog/heap.c:2642 +#: catalog/heap.c:2659 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承された制約と競合します" -#: catalog/heap.c:2652 +#: catalog/heap.c:2669 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の NOT VALID 制約と競合します" -#: catalog/heap.c:2657 +#: catalog/heap.c:2674 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "継承された定義により制約\"%s\"をマージしています" -#: catalog/heap.c:2683 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 commands/tablecmds.c:3377 commands/tablecmds.c:7089 commands/tablecmds.c:15971 commands/tablecmds.c:16102 +#: catalog/heap.c:2700 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 commands/tablecmds.c:3377 commands/tablecmds.c:7089 commands/tablecmds.c:15971 commands/tablecmds.c:16102 #, c-format msgid "too many inheritance parents" msgstr "継承の親テーブルが多すぎます" -#: catalog/heap.c:2767 +#: catalog/heap.c:2784 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "生成カラム\"%s\"はカラム生成式中では使用できません" -#: catalog/heap.c:2769 +#: catalog/heap.c:2786 #, c-format msgid "A generated column cannot reference another generated column." msgstr "生成カラムは他の生成カラムを参照できません。" -#: catalog/heap.c:2775 +#: catalog/heap.c:2792 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "列生成式内では行全体参照は使用できません" -#: catalog/heap.c:2776 +#: catalog/heap.c:2793 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "これは生成列を自身の値に依存させることにつながります。" -#: catalog/heap.c:2831 +#: catalog/heap.c:2848 #, c-format msgid "generation expression is not immutable" msgstr "生成式は不変ではありません" -#: catalog/heap.c:2859 rewrite/rewriteHandler.c:1279 +#: catalog/heap.c:2876 rewrite/rewriteHandler.c:1313 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "列\"%s\"の型は%sですが、デフォルト式の型は%sです" -#: catalog/heap.c:2864 commands/prepare.c:331 parser/analyze.c:2758 parser/parse_target.c:592 parser/parse_target.c:882 parser/parse_target.c:892 rewrite/rewriteHandler.c:1284 +#: catalog/heap.c:2881 commands/prepare.c:331 parser/analyze.c:2758 parser/parse_target.c:592 parser/parse_target.c:882 parser/parse_target.c:892 rewrite/rewriteHandler.c:1318 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "式を書き換えるかキャストする必要があります。" -#: catalog/heap.c:2911 +#: catalog/heap.c:2928 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "検査制約ではテーブル\"%s\"のみを参照することができます" -#: catalog/heap.c:3217 +#: catalog/heap.c:3234 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "ON COMMITと外部キーの組み合わせはサポートされていません" -#: catalog/heap.c:3218 +#: catalog/heap.c:3235 #, 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:3223 +#: catalog/heap.c:3240 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "外部キー制約で参照されているテーブルを削除できません" -#: catalog/heap.c:3224 +#: catalog/heap.c:3241 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "テーブル\"%s\"は\"%s\"を参照します。" -#: catalog/heap.c:3226 +#: catalog/heap.c:3243 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "同時にテーブル\"%s\"がtruncateされました。TRUNCATE ... CASCADEを使用してください。" -#: catalog/index.c:219 parser/parse_utilcmd.c:2176 +#: catalog/index.c:219 parser/parse_utilcmd.c:2180 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "テーブル\"%s\"に複数のプライマリキーを持たせることはできません" @@ -4963,7 +4987,7 @@ msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"の列\"%1$s\"に対するデフォルト値が存在しません" -#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 utils/adt/acl.c:4577 +#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3850 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 utils/adt/acl.c:4577 #, c-format msgid "type \"%s\" does not exist" msgstr "型\"%s\"は存在しません" @@ -4983,7 +5007,7 @@ msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "ユーザー\"%s\"に対するユーザーマッピングがサーバー\"%s\"には存在しません" -#: catalog/objectaddress.c:1834 commands/foreigncmds.c:441 commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 foreign/foreign.c:713 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:441 commands/foreigncmds.c:1009 commands/foreigncmds.c:1372 foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "サーバー\"%s\"は存在しません" @@ -5221,7 +5245,7 @@ msgid "role %s" msgstr "ロール%s" -#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 +#: catalog/objectaddress.c:3656 #, c-format msgid "membership of role %s in role %s" msgstr "ロール%sのロール%sへの所属" @@ -5439,7 +5463,7 @@ msgid "return type of inverse transition function %s is not %s" msgstr "逆遷移関数%sの戻り値の型が%sではありません" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2991 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3039 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "集約の前進と反転の遷移関数のSTRICT属性は一致している必要があります" @@ -5514,7 +5538,7 @@ msgid "cannot change number of direct arguments of an aggregate function" msgstr "集約関数の直接引数の数は変更できません" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 commands/typecmds.c:2380 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 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 commands/typecmds.c:1992 commands/typecmds.c:2038 commands/typecmds.c:2090 commands/typecmds.c:2127 commands/typecmds.c:2161 commands/typecmds.c:2195 commands/typecmds.c:2229 commands/typecmds.c:2258 commands/typecmds.c:2345 commands/typecmds.c:2387 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 #, c-format msgid "function %s does not exist" @@ -5635,31 +5659,41 @@ msgid "default conversion for %s to %s already exists" msgstr "%sから%sへのデフォルトの変換はすでに存在します" -#: catalog/pg_depend.c:225 commands/extension.c:3527 +#: catalog/pg_depend.c:236 commands/extension.c:3527 #, 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:3567 +#: catalog/pg_depend.c:243 catalog/pg_depend.c:294 commands/extension.c:3567 #, 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\"" @@ -6072,7 +6106,7 @@ msgid "alignment \"%c\" is invalid for variable-length type" msgstr "可変長型の場合、アラインメント\"%c\"は不正です" -#: catalog/pg_type.c:325 commands/typecmds.c:4363 +#: catalog/pg_type.c:325 commands/typecmds.c:4370 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "固定長型の場合はPLAIN格納方式でなければなりません" @@ -6087,7 +6121,7 @@ msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "\"multirange_type_name\"属性で複範囲型の型名を手動で指定することができます。" -#: catalog/storage.c:533 storage/buffer/bufmgr.c:1547 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1556 #, c-format msgid "invalid page in block %u of relation %s" msgstr "リレーション%2$sのブロック%1$uに不正なページ" @@ -6192,7 +6226,7 @@ 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\"はすでに存在します" @@ -6207,7 +6241,7 @@ msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"はすでに存在します" -#: commands/alter.c:98 commands/subscriptioncmds.c:669 +#: commands/alter.c:98 commands/subscriptioncmds.c:695 #, c-format msgid "subscription \"%s\" already exists" msgstr "サブスクリプション\"%s\"はすでに存在します" @@ -6247,12 +6281,12 @@ msgid "must be superuser to rename %s" msgstr "%sの名前を変更するにはスーパーユーザーである必要があります" -#: commands/alter.c:256 commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 commands/subscriptioncmds.c:1920 +#: commands/alter.c:256 commands/subscriptioncmds.c:674 commands/subscriptioncmds.c:1155 commands/subscriptioncmds.c:1238 commands/subscriptioncmds.c:1948 #, c-format msgid "password_required=false is superuser-only" msgstr "password_required=falseはスーパーユーザーのみ可能です" -#: commands/alter.c:257 commands/subscriptioncmds.c:649 commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 commands/subscriptioncmds.c:1921 +#: commands/alter.c:257 commands/subscriptioncmds.c:675 commands/subscriptioncmds.c:1156 commands/subscriptioncmds.c:1239 commands/subscriptioncmds.c:1949 #, 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に設定されたサブスクリプションはスーパーユーザのみ作成と変更が可能です。" @@ -6471,8 +6505,8 @@ msgid "collation attribute \"%s\" not recognized" msgstr "照合順序の属性\"%s\"が認識できません" -#: commands/collationcmds.c:123 commands/collationcmds.c:129 commands/define.c:388 commands/tablecmds.c:8162 replication/pgoutput/pgoutput.c:315 replication/pgoutput/pgoutput.c:338 replication/pgoutput/pgoutput.c:356 replication/pgoutput/pgoutput.c:366 replication/pgoutput/pgoutput.c:376 replication/pgoutput/pgoutput.c:386 replication/pgoutput/pgoutput.c:398 replication/walsender.c:1164 replication/walsender.c:1186 replication/walsender.c:1196 -#: replication/walsender.c:1205 replication/walsender.c:1444 +#: commands/collationcmds.c:123 commands/collationcmds.c:129 commands/define.c:388 commands/tablecmds.c:8162 replication/pgoutput/pgoutput.c:315 replication/pgoutput/pgoutput.c:338 replication/pgoutput/pgoutput.c:356 replication/pgoutput/pgoutput.c:366 replication/pgoutput/pgoutput.c:376 replication/pgoutput/pgoutput.c:386 replication/pgoutput/pgoutput.c:398 replication/walsender.c:1186 replication/walsender.c:1208 replication/walsender.c:1218 +#: replication/walsender.c:1227 replication/walsender.c:1466 #, c-format msgid "conflicting or redundant options" msgstr "競合するオプション、あるいは余計なオプションがあります" @@ -6541,7 +6575,7 @@ #. translator: %s is an SQL command #. translator: %s is an SQL ALTER command -#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 commands/tablecmds.c:7938 commands/tablecmds.c:7948 commands/tablecmds.c:7950 commands/tablecmds.c:14563 commands/tablecmds.c:17948 commands/tablecmds.c:17969 commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1402 commands/tablecmds.c:7938 commands/tablecmds.c:7948 commands/tablecmds.c:7950 commands/tablecmds.c:14563 commands/tablecmds.c:17948 commands/tablecmds.c:17969 commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4233 #, c-format msgid "Use %s instead." msgstr "代わりに%sを使用してください" @@ -6661,159 +6695,159 @@ msgid "Only roles with privileges of the \"%s\" role may COPY to a file." msgstr "\"%s\"ロールの権限を持つロールのみがCOPYによるファイルへの出力を行うことができます。" -#: commands/copy.c:180 +#: commands/copy.c:181 #, c-format msgid "generated columns are not supported in COPY FROM WHERE conditions" msgstr "生成列は COPY FROM の WHERE 条件ではサポートされていません" -#: commands/copy.c:181 commands/tablecmds.c:12858 commands/tablecmds.c:18092 commands/tablecmds.c:18171 commands/trigger.c:657 rewrite/rewriteHandler.c:944 rewrite/rewriteHandler.c:979 +#: commands/copy.c:182 commands/tablecmds.c:12858 commands/tablecmds.c:18092 commands/tablecmds.c:18171 commands/trigger.c:657 rewrite/rewriteHandler.c:978 rewrite/rewriteHandler.c:1013 #, c-format msgid "Column \"%s\" is a generated column." msgstr "列\"%s\"は生成カラムです。" -#: commands/copy.c:230 +#: commands/copy.c:231 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM で行レベルセキュリティはサポートされていません" -#: commands/copy.c:231 +#: commands/copy.c:232 #, c-format msgid "Use INSERT statements instead." msgstr "代わりにINSERTを文使用してください。" -#: commands/copy.c:412 +#: commands/copy.c:413 #, c-format msgid "cannot use \"%s\" with HEADER in COPY TO" msgstr "COPY TO の HEADERで\"%s\"は使用できません" -#: commands/copy.c:421 +#: commands/copy.c:422 #, 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:439 commands/copy.c:819 commands/copy.c:835 commands/copy.c:852 commands/copy.c:878 commands/copy.c:888 +#: commands/copy.c:440 commands/copy.c:820 commands/copy.c:836 commands/copy.c:853 commands/copy.c:879 commands/copy.c:889 #, 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:453 commands/copy.c:478 +#: commands/copy.c:454 commands/copy.c:479 #, c-format msgid "COPY %s \"%s\" not recognized" msgstr "COPY %s \"%s\"を認識できません" -#: commands/copy.c:539 +#: commands/copy.c:540 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "COPY フォーマット\"%s\"を認識できません" -#: commands/copy.c:597 commands/copy.c:612 commands/copy.c:627 commands/copy.c:646 +#: commands/copy.c:598 commands/copy.c:613 commands/copy.c:628 commands/copy.c:647 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "オプション\"%s\"の引数は列名のリストでなければなりません" -#: commands/copy.c:658 +#: commands/copy.c:659 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "オプション\"%s\"の引数は有効なエンコーディング名でなければなりません" -#: commands/copy.c:679 commands/dbcommands.c:866 commands/dbcommands.c:2381 +#: commands/copy.c:680 commands/dbcommands.c:866 commands/dbcommands.c:2381 #, 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:692 commands/copy.c:697 commands/copy.c:702 commands/copy.c:777 +#: commands/copy.c:693 commands/copy.c:698 commands/copy.c:703 commands/copy.c:778 #, c-format msgid "cannot specify %s in BINARY mode" msgstr "BINARYモードでは%sを指定できません" -#: commands/copy.c:707 +#: commands/copy.c:708 #, c-format msgid "only ON_ERROR STOP is allowed in BINARY mode" msgstr "BINARYモードではN_ERROR STOPのみ使用可能です" -#: commands/copy.c:729 +#: commands/copy.c:730 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "COPYの区切り文字は単一の1バイト文字でなければなりません" -#: commands/copy.c:736 +#: commands/copy.c:737 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPYの区切り文字は改行や復帰記号とすることができません" -#: commands/copy.c:742 +#: commands/copy.c:743 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPYのNULL表現には改行や復帰記号を使用することはできません" -#: commands/copy.c:752 +#: commands/copy.c:753 #, c-format msgid "COPY default representation cannot use newline or carriage return" msgstr "COPYのデフォルト表現には改行や復帰記号を使用することはできません" -#: commands/copy.c:770 +#: commands/copy.c:771 #, 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:784 commands/copy.c:801 commands/copy.c:813 commands/copy.c:828 commands/copy.c:844 +#: commands/copy.c:785 commands/copy.c:802 commands/copy.c:814 commands/copy.c:829 commands/copy.c:845 #, c-format msgid "COPY %s requires CSV mode" msgstr "COPY %s はCSVモードを要求します" -#: commands/copy.c:789 +#: commands/copy.c:790 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "COPYの引用符は単一の1バイト文字でなければなりません" -#: commands/copy.c:794 +#: commands/copy.c:795 #, c-format msgid "COPY delimiter and quote must be different" msgstr "COPYの区切り文字と引用符は異なる文字でなければなりません" -#: commands/copy.c:806 +#: commands/copy.c:807 #, 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:860 commands/copy.c:896 +#: commands/copy.c:861 commands/copy.c:897 #, 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:869 commands/copy.c:905 +#: commands/copy.c:870 commands/copy.c:906 #, c-format msgid "CSV quote character must not appear in the %s specification" msgstr "COPYの引用符は%s指定では使用できません" -#: commands/copy.c:914 +#: commands/copy.c:915 #, c-format msgid "NULL specification and DEFAULT specification cannot be the same" msgstr "NULL指定とDEFAULT指定は同じにはできません" -#: commands/copy.c:976 +#: commands/copy.c:977 #, c-format msgid "column \"%s\" is a generated column" msgstr "列\"%s\"は生成カラムです" -#: commands/copy.c:978 +#: commands/copy.c:979 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "生成カラムはCOPYでは使えません。" -#: commands/copy.c:993 commands/indexcmds.c:1890 commands/statscmds.c:260 commands/tablecmds.c:2526 commands/tablecmds.c:2997 commands/tablecmds.c:3808 parser/parse_relation.c:3692 parser/parse_relation.c:3702 parser/parse_relation.c:3720 parser/parse_relation.c:3727 parser/parse_relation.c:3741 utils/adt/tsvector_op.c:2857 +#: commands/copy.c:994 commands/indexcmds.c:1890 commands/statscmds.c:260 commands/tablecmds.c:2526 commands/tablecmds.c:2997 commands/tablecmds.c:3808 parser/parse_relation.c:3692 parser/parse_relation.c:3702 parser/parse_relation.c:3720 parser/parse_relation.c:3727 parser/parse_relation.c:3741 utils/adt/tsvector_op.c:2830 #, c-format msgid "column \"%s\" does not exist" msgstr "列\"%s\"は存在しません" -#: commands/copy.c:1000 commands/tablecmds.c:2552 commands/trigger.c:952 parser/parse_target.c:1083 parser/parse_target.c:1094 +#: commands/copy.c:1001 commands/tablecmds.c:2552 commands/trigger.c:952 parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format msgid "column \"%s\" specified more than once" msgstr "列\"%s\"が複数指定されました" @@ -6961,7 +6995,7 @@ msgid "could not read from COPY file: %m" msgstr "COPYファイルから読み込めませんでした: %m" -#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 replication/walsender.c:774 replication/walsender.c:800 tcop/postgres.c:381 +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 replication/walsender.c:774 replication/walsender.c:800 tcop/postgres.c:382 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "トランザクションを実行中のクライアント接続で想定外のEOFがありました" @@ -7441,7 +7475,7 @@ msgid "data directory with the specified OID %u already exists" msgstr "指定されたOID %uのデータディレクトリはすでに存在します" -#: commands/dbcommands.c:1571 commands/dbcommands.c:1586 utils/adt/pg_locale.c:2591 +#: commands/dbcommands.c:1571 commands/dbcommands.c:1586 utils/adt/pg_locale.c:2604 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "符号化方式\"%s\"がロケール\"%s\"に合いません" @@ -7750,7 +7784,7 @@ 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\"は存在しません、スキップします" @@ -7831,17 +7865,17 @@ 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はイベントトリガ関数でのみ呼び出すことができます" @@ -8146,7 +8180,7 @@ msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "スキーマ\"%s\"を拡張\"%s\"に追加できません。そのスキーマにその拡張が含まれているためです" -#: commands/extension.c:3621 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 +#: commands/extension.c:3621 commands/typecmds.c:4049 utils/fmgr/funcapi.c:725 #, c-format msgid "could not find multirange type for data type %s" msgstr "データ型%sの複範囲型がありませんでした" @@ -8221,47 +8255,47 @@ 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:404 +#: commands/foreigncmds.c:1523 foreign/foreign.c:404 #, 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\"をインポートします" @@ -8742,7 +8776,7 @@ msgid "functions in index predicate must be marked IMMUTABLE" msgstr "インデックスの述部の関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:1885 parser/parse_utilcmd.c:2519 parser/parse_utilcmd.c:2654 +#: commands/indexcmds.c:1885 parser/parse_utilcmd.c:2523 parser/parse_utilcmd.c:2658 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "キーとして指名された列\"%s\"は存在しません" @@ -8782,7 +8816,7 @@ msgid "could not determine which collation to use for index expression" msgstr "インデックス式で使用する照合順序を特定できませんでした" -#: commands/indexcmds.c:2028 commands/tablecmds.c:18259 commands/typecmds.c:811 parser/parse_expr.c:2794 parser/parse_type.c:568 parser/parse_utilcmd.c:3771 utils/adt/misc.c:630 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18259 commands/typecmds.c:811 parser/parse_expr.c:2794 parser/parse_type.c:568 parser/parse_utilcmd.c:3775 utils/adt/misc.c:630 #, c-format msgid "collations are not supported by type %s" msgstr "%s 型では照合順序はサポートされません" @@ -8817,7 +8851,7 @@ msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "アクセスメソッド\"%s\"はNULLS FIRST/LASTオプションをサポートしません" -#: commands/indexcmds.c:2210 commands/tablecmds.c:18284 commands/tablecmds.c:18290 commands/typecmds.c:2311 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18284 commands/tablecmds.c:18290 commands/typecmds.c:2318 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"にはデータ型%1$s用のデフォルトの演算子クラスがありません" @@ -8832,7 +8866,7 @@ msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"用の演算子クラス\"%1$s\"は存在しません" -#: commands/indexcmds.c:2263 commands/typecmds.c:2299 +#: commands/indexcmds.c:2263 commands/typecmds.c:2306 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "演算子クラス\"%s\"はデータ型%sを受け付けません" @@ -9352,7 +9386,7 @@ msgid "must be superuser to create custom procedural language" msgstr "手続き言語を生成するためにはスーパーユーザーである必要があります" -#: commands/publicationcmds.c:129 postmaster/postmaster.c:1110 postmaster/postmaster.c:1212 utils/init/miscinit.c:1866 +#: commands/publicationcmds.c:129 postmaster/postmaster.c:1111 postmaster/postmaster.c:1213 utils/init/miscinit.c:1866 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "パラメータ\"%s\"のリスト構文が不正です" @@ -9491,7 +9525,7 @@ msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "FOR ALL TABLES指定のパブリケーションではテーブルの追加や削除はできません。" -#: commands/publicationcmds.c:1390 commands/publicationcmds.c:1429 commands/publicationcmds.c:1966 utils/cache/lsyscache.c:3634 +#: commands/publicationcmds.c:1390 commands/publicationcmds.c:1429 commands/publicationcmds.c:1966 utils/cache/lsyscache.c:3747 #, c-format msgid "publication \"%s\" does not exist" msgstr "パブリケーション\"%s\"は存在しません" @@ -9814,191 +9848,191 @@ msgid "subscription with %s must also set %s" msgstr "%s としたサブスクリプションでは %s を設定する必要があります" -#: commands/subscriptioncmds.c:506 +#: commands/subscriptioncmds.c:532 #, c-format msgid "could not receive list of publications from the publisher: %s" msgstr "パブリケーション一覧をパブリッシャから受け取れませんでした: %s" -#: commands/subscriptioncmds.c:538 +#: commands/subscriptioncmds.c:564 #, 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:626 +#: commands/subscriptioncmds.c:652 #, c-format msgid "permission denied to create subscription" msgstr "サブスクリプションを作成する権限がありません" -#: commands/subscriptioncmds.c:627 +#: commands/subscriptioncmds.c:653 #, c-format msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "\"%s\"ロールの権限を持つロールのみがサブスクリプションを作成できます。" -#: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1371 replication/logical/worker.c:4524 +#: commands/subscriptioncmds.c:784 commands/subscriptioncmds.c:917 commands/subscriptioncmds.c:1550 replication/logical/tablesync.c:1372 replication/logical/worker.c:4539 #, c-format msgid "could not connect to the publisher: %s" msgstr "パブリッシャに接続できませんでした: %s" -#: commands/subscriptioncmds.c:829 +#: commands/subscriptioncmds.c:855 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "パブリッシャ上でレプリケーションスロット\"%s\"を作成しました" -#: commands/subscriptioncmds.c:841 +#: commands/subscriptioncmds.c:867 #, c-format msgid "subscription was created, but is not connected" msgstr "サブスクリプションは作成されましたが接続されていません" -#: commands/subscriptioncmds.c:842 +#: commands/subscriptioncmds.c:868 #, c-format msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." msgstr "レプリケーションを開始するにはレプリケーションスロットの作成、サブスクリプションの有効化そしてサブスクリプションのリフレッシュを手動で行う必要があります。" -#: commands/subscriptioncmds.c:1109 commands/subscriptioncmds.c:1592 commands/subscriptioncmds.c:1975 utils/cache/lsyscache.c:3684 +#: commands/subscriptioncmds.c:1135 commands/subscriptioncmds.c:1618 commands/subscriptioncmds.c:2003 utils/cache/lsyscache.c:3797 #, c-format msgid "subscription \"%s\" does not exist" msgstr "サブスクリプション\"%s\"は存在しません" -#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 +#: commands/subscriptioncmds.c:1192 commands/subscriptioncmds.c:1271 #, c-format msgid "cannot set %s for enabled subscription" msgstr "有効にされているサブスクリプションには %s を指定できません" -#: commands/subscriptioncmds.c:1233 +#: commands/subscriptioncmds.c:1259 #, c-format msgid "cannot set option \"%s\" for a subscription that does not have a slot name" msgstr "スロット名を指定されていないサブスクリプションのオプション\"%s\"を設定することはできません" -#: commands/subscriptioncmds.c:1279 +#: commands/subscriptioncmds.c:1305 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "スロット名を指定されていないサブスクリプションを有効にはできません" -#: commands/subscriptioncmds.c:1323 commands/subscriptioncmds.c:1374 +#: commands/subscriptioncmds.c:1349 commands/subscriptioncmds.c:1400 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "refresh指定された ALTER SUBSCRIPTION は無効化されているサブスクリプションには実行できません" -#: commands/subscriptioncmds.c:1324 +#: commands/subscriptioncmds.c:1350 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false) を使ってください。" -#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 +#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1414 #, 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:1334 +#: commands/subscriptioncmds.c:1360 #, 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:1390 +#: commands/subscriptioncmds.c:1416 #, 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:1412 +#: commands/subscriptioncmds.c:1438 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESHは無効化されているサブスクリプションには実行できません" -#: commands/subscriptioncmds.c:1437 +#: commands/subscriptioncmds.c:1463 #, 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:1438 +#: commands/subscriptioncmds.c:1464 #, 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:1473 +#: commands/subscriptioncmds.c:1499 #, 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:1596 +#: commands/subscriptioncmds.c:1622 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "サブスクリプション\"%s\"は存在しません、スキップします" -#: commands/subscriptioncmds.c:1865 +#: commands/subscriptioncmds.c:1893 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "パブリッシャ上でレプリケーションスロット\"%s\"を削除しました" -#: commands/subscriptioncmds.c:1874 commands/subscriptioncmds.c:1882 +#: commands/subscriptioncmds.c:1902 commands/subscriptioncmds.c:1910 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "パブリッシャ上でのレプリケーションスロット\"%s\"の削除に失敗しました: %s" -#: commands/subscriptioncmds.c:2007 +#: commands/subscriptioncmds.c:2035 #, c-format msgid "subscription with OID %u does not exist" msgstr "OID %uのサブスクリプションは存在しません" -#: commands/subscriptioncmds.c:2081 commands/subscriptioncmds.c:2206 +#: commands/subscriptioncmds.c:2114 commands/subscriptioncmds.c:2239 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "パブリッシャから複製テーブルの一覧を受け取れませんでした: %s" -#: commands/subscriptioncmds.c:2117 +#: commands/subscriptioncmds.c:2150 #, 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:2119 +#: commands/subscriptioncmds.c:2152 #, 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:2122 +#: commands/subscriptioncmds.c:2155 #, c-format msgid "Verify that initial data copied from the publisher tables did not come from other origins." msgstr "パブリッシャテーブルからコピーされた初期データが異なる起源からのものでないことを確認してください。" -#: commands/subscriptioncmds.c:2228 replication/logical/tablesync.c:932 replication/pgoutput/pgoutput.c:1159 +#: commands/subscriptioncmds.c:2261 replication/logical/tablesync.c:932 replication/pgoutput/pgoutput.c:1159 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "テーブル\"%s.%s\"に対して、異なるパブリケーションで異なる列リストを使用することはできません" -#: commands/subscriptioncmds.c:2278 +#: commands/subscriptioncmds.c:2311 #, 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:2281 +#: commands/subscriptioncmds.c:2314 #, 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:2312 +#: commands/subscriptioncmds.c:2345 #, c-format msgid "publication name \"%s\" used more than once" msgstr "パブリケーション名\"%s\"が2回以上使われています" -#: commands/subscriptioncmds.c:2356 +#: commands/subscriptioncmds.c:2389 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にすでに存在します" -#: commands/subscriptioncmds.c:2370 +#: commands/subscriptioncmds.c:2403 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にはありません" -#: commands/subscriptioncmds.c:2381 +#: commands/subscriptioncmds.c:2414 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "サブスクリプションからすべてのパブリケーションを削除することはできません" -#: commands/subscriptioncmds.c:2438 +#: commands/subscriptioncmds.c:2471 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "パラメータ\"%s\"はBoolean値または\"parallel\"のみを取ります" @@ -10059,7 +10093,7 @@ msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "実体化ビューを削除するにはDROP MATERIALIZED VIEWを使用してください。" -#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19891 parser/parse_utilcmd.c:2251 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19891 parser/parse_utilcmd.c:2255 #, c-format msgid "index \"%s\" does not exist" msgstr "インデックス\"%s\"は存在しません" @@ -10191,7 +10225,7 @@ msgid "cannot inherit from partition \"%s\"" msgstr "パーティション子テーブル\"%s\"からの継承はできません" -#: commands/tablecmds.c:2619 parser/parse_utilcmd.c:2481 parser/parse_utilcmd.c:2623 +#: commands/tablecmds.c:2619 parser/parse_utilcmd.c:2485 parser/parse_utilcmd.c:2627 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "継承しようとしたリレーション\"%s\"はテーブルまたは外部テーブルではありません" @@ -10301,7 +10335,7 @@ msgid "column \"%s\" has a collation conflict" msgstr "列\"%s\"の照合順序が競合しています" -#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 commands/tablecmds.c:7080 parser/parse_expr.c:4771 +#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 commands/tablecmds.c:7080 parser/parse_expr.c:4781 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\"対\"%s\"" @@ -11420,52 +11454,52 @@ msgid "partition \"%s\" was removed concurrently" msgstr "パーティション子テーブル\\\"%s\\\"は同時に削除されました" -#: commands/tablecmds.c:19925 commands/tablecmds.c:19945 commands/tablecmds.c:19966 commands/tablecmds.c:19985 commands/tablecmds.c:20027 +#: commands/tablecmds.c:19928 commands/tablecmds.c:19948 commands/tablecmds.c:19969 commands/tablecmds.c:19988 commands/tablecmds.c:20038 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "インデックス\"%s\"をインデックス\"%s\"の子インデックスとしてアタッチすることはできません" -#: commands/tablecmds.c:19928 +#: commands/tablecmds.c:19931 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "インデックス\"%s\"はすでに別のインデックスにアタッチされています。" -#: commands/tablecmds.c:19948 +#: commands/tablecmds.c:19951 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "インデックス\"%s\"はテーブル\"%s\"のどの子テーブルのインデックスでもありません。" -#: commands/tablecmds.c:19969 +#: commands/tablecmds.c:19972 #, c-format msgid "The index definitions do not match." msgstr "インデックス定義が合致しません。" -#: commands/tablecmds.c:19988 +#: commands/tablecmds.c:19991 #, 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:20030 +#: commands/tablecmds.c:20041 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "子テーブル\"%s\"にはすでに他のインデックスがアタッチされています。" -#: commands/tablecmds.c:20266 +#: commands/tablecmds.c:20277 #, c-format msgid "column data type %s does not support compression" msgstr "列データ型%sは圧縮をサポートしていません" -#: commands/tablecmds.c:20273 +#: commands/tablecmds.c:20284 #, c-format msgid "invalid compression method \"%s\"" msgstr "無効な圧縮方式\"%s\"" -#: commands/tablecmds.c:20299 +#: commands/tablecmds.c:20310 #, c-format msgid "invalid storage type \"%s\"" msgstr "不正な格納タイプ\"%s\"" -#: commands/tablecmds.c:20309 +#: commands/tablecmds.c:20320 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "列のデータ型%sは格納タイプPLAINしか取ることができません" @@ -11835,12 +11869,12 @@ msgid "cannot collect transition tuples from child foreign tables" msgstr "外部子テーブルからは遷移タプルを収集できません" -#: commands/trigger.c:3428 executor/nodeModifyTable.c:1563 executor/nodeModifyTable.c:1637 executor/nodeModifyTable.c:2400 executor/nodeModifyTable.c:2491 executor/nodeModifyTable.c:3146 executor/nodeModifyTable.c:3338 +#: commands/trigger.c:3428 executor/nodeModifyTable.c:1563 executor/nodeModifyTable.c:1637 executor/nodeModifyTable.c:2400 executor/nodeModifyTable.c:2491 executor/nodeModifyTable.c:3146 executor/nodeModifyTable.c:3343 #, 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:3470 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:335 executor/nodeModifyTable.c:1579 executor/nodeModifyTable.c:2417 executor/nodeModifyTable.c:2641 +#: commands/trigger.c:3470 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:335 executor/nodeModifyTable.c:1579 executor/nodeModifyTable.c:2417 executor/nodeModifyTable.c:2641 executor/nodeModifyTable.c:3184 #, c-format msgid "could not serialize access due to concurrent update" msgstr "更新が同時に行われたためアクセスの直列化ができませんでした" @@ -11970,7 +12004,7 @@ 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:1460 commands/typecmds.c:4480 +#: commands/typecmds.c:331 commands/typecmds.c:1467 commands/typecmds.c:4487 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "型の属性\"%s\"は不明です" @@ -11990,7 +12024,7 @@ msgid "alignment \"%s\" not recognized" msgstr "アライメント\"%s\"は不明です" -#: commands/typecmds.c:454 commands/typecmds.c:4354 +#: commands/typecmds.c:454 commands/typecmds.c:4361 #, c-format msgid "storage \"%s\" not recognized" msgstr "格納方式\"%s\"は不明です" @@ -12035,272 +12069,272 @@ msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "ドメインに対する検査制約はNO INHERITとマークすることができません" -#: commands/typecmds.c:980 commands/typecmds.c:2940 +#: commands/typecmds.c:980 commands/typecmds.c:2947 #, c-format msgid "unique constraints not possible for domains" msgstr "ドメインでは一意性制約は使用できません" -#: commands/typecmds.c:986 commands/typecmds.c:2946 +#: commands/typecmds.c:986 commands/typecmds.c:2953 #, c-format msgid "primary key constraints not possible for domains" msgstr "ドメインではプライマリキー制約はできません" -#: commands/typecmds.c:992 commands/typecmds.c:2952 +#: commands/typecmds.c:992 commands/typecmds.c:2959 #, c-format msgid "exclusion constraints not possible for domains" msgstr "ドメインでは排除制約は使用できません" -#: commands/typecmds.c:998 commands/typecmds.c:2958 +#: commands/typecmds.c:998 commands/typecmds.c:2965 #, c-format msgid "foreign key constraints not possible for domains" msgstr "ドメイン用の外部キー制約はできません" -#: commands/typecmds.c:1007 commands/typecmds.c:2967 +#: commands/typecmds.c:1007 commands/typecmds.c:2974 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "ドメインでは制約遅延の指定はサポートしていません" -#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2563 #, c-format msgid "%s is not an enum" msgstr "%s は数値ではありません" -#: commands/typecmds.c:1468 +#: commands/typecmds.c:1475 #, c-format msgid "type attribute \"subtype\" is required" msgstr "型の属性\"subtype\"が必要です" -#: commands/typecmds.c:1473 +#: commands/typecmds.c:1480 #, c-format msgid "range subtype cannot be %s" msgstr "範囲の派生元型を%sにすることはできません" -#: commands/typecmds.c:1492 +#: commands/typecmds.c:1499 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "範囲の照合順序が指定されましたが、派生もと型が照合順序をサポートしていません" -#: commands/typecmds.c:1502 +#: commands/typecmds.c:1509 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "事前にシェル型を生成せずに正規化関数を指定することはできません" -#: commands/typecmds.c:1503 +#: commands/typecmds.c:1510 #, 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:1975 +#: commands/typecmds.c:1982 #, c-format msgid "type input function %s has multiple matches" msgstr "型の入力関数%sが複数合致します" -#: commands/typecmds.c:1993 +#: commands/typecmds.c:2000 #, c-format msgid "type input function %s must return type %s" msgstr "型の入力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2009 +#: commands/typecmds.c:2016 #, c-format msgid "type input function %s should not be volatile" msgstr "型の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2037 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s must return type %s" msgstr "型の出力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2044 +#: commands/typecmds.c:2051 #, c-format msgid "type output function %s should not be volatile" msgstr "型の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2073 +#: commands/typecmds.c:2080 #, c-format msgid "type receive function %s has multiple matches" msgstr "型の受信関数 %s が複数合致しました" -#: commands/typecmds.c:2091 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s must return type %s" msgstr "型の受信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2098 +#: commands/typecmds.c:2105 #, c-format msgid "type receive function %s should not be volatile" msgstr "型の受信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2126 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s must return type %s" msgstr "型の送信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2133 +#: commands/typecmds.c:2140 #, c-format msgid "type send function %s should not be volatile" msgstr "型の送信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2160 +#: commands/typecmds.c:2167 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2167 +#: commands/typecmds.c:2174 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "型修正子の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2194 +#: commands/typecmds.c:2201 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2201 +#: commands/typecmds.c:2208 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "型修正子の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2228 +#: commands/typecmds.c:2235 #, c-format msgid "type analyze function %s must return type %s" msgstr "型のANALYZE関数%sは%s型を返す必要があります" -#: commands/typecmds.c:2257 +#: commands/typecmds.c:2264 #, c-format msgid "type subscripting function %s must return type %s" msgstr "型の添字処理関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2267 +#: commands/typecmds.c:2274 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "ユーザー定義型は添字処理関数%sを使用できません" -#: commands/typecmds.c:2313 +#: commands/typecmds.c:2320 #, 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:2344 +#: commands/typecmds.c:2351 #, c-format msgid "range canonical function %s must return range type" msgstr "範囲の正規化関数 %s は範囲型を返す必要があります" -#: commands/typecmds.c:2350 +#: commands/typecmds.c:2357 #, c-format msgid "range canonical function %s must be immutable" msgstr "範囲の正規化関数 %s は不変関数でなければなりません" -#: commands/typecmds.c:2386 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "範囲の派生元の型の差分関数 %s は %s型を返す必要があります" -#: commands/typecmds.c:2393 +#: commands/typecmds.c:2400 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "範囲の派生元の型の差分関数 %s は不変関数である必要があります" -#: commands/typecmds.c:2420 +#: commands/typecmds.c:2427 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_typeの配列型OIDが設定されていません" -#: commands/typecmds.c:2453 +#: commands/typecmds.c:2460 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_typeの複範囲型OIDの値が設定されていません" -#: commands/typecmds.c:2486 +#: commands/typecmds.c:2493 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にpg_typeの複範囲配列型OIDの値が設定されていません" -#: commands/typecmds.c:2868 commands/typecmds.c:3093 +#: commands/typecmds.c:2875 commands/typecmds.c:3100 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は存在しません" -#: commands/typecmds.c:2872 +#: commands/typecmds.c:2879 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/typecmds.c:3100 +#: commands/typecmds.c:3107 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は検査制約ではありません" -#: commands/typecmds.c:3180 +#: commands/typecmds.c:3187 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "テーブル\"%2$s\"の列\"%1$s\"にNULL値があります" -#: commands/typecmds.c:3269 +#: commands/typecmds.c:3276 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "テーブル\"%2$s\"の列\"%1$s\"に新しい制約に違反する値があります" -#: commands/typecmds.c:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 commands/typecmds.c:4073 +#: commands/typecmds.c:3505 commands/typecmds.c:3779 commands/typecmds.c:3864 commands/typecmds.c:4080 #, c-format msgid "%s is not a domain" msgstr "%s はドメインではありません" -#: commands/typecmds.c:3532 commands/typecmds.c:3686 +#: commands/typecmds.c:3539 commands/typecmds.c:3693 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"はすでに存在します" -#: commands/typecmds.c:3583 +#: commands/typecmds.c:3590 #, c-format msgid "cannot use table references in domain check constraint" msgstr "ドメインの検査制約ではテーブル参照を使用できません" -#: commands/typecmds.c:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 +#: commands/typecmds.c:3791 commands/typecmds.c:3876 commands/typecmds.c:4230 #, c-format msgid "%s is a table's row type" msgstr "%sはテーブルの行型です" -#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 +#: commands/typecmds.c:3801 commands/typecmds.c:3886 commands/typecmds.c:4128 #, c-format msgid "cannot alter array type %s" msgstr "配列型%sを変更できません" -#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 +#: commands/typecmds.c:3803 commands/typecmds.c:3888 commands/typecmds.c:4130 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "型%sを変更することができます。これは同時にその配列型も変更します。" -#: commands/typecmds.c:3892 +#: commands/typecmds.c:3899 #, c-format msgid "cannot alter multirange type %s" msgstr "複範囲型%sを変更できません" -#: commands/typecmds.c:3895 +#: commands/typecmds.c:3902 #, c-format msgid "You can alter type %s, which will alter the multirange type as well." msgstr "型%sを変更することができます。これは同時にその複範囲型も変更します。" -#: commands/typecmds.c:4202 +#: commands/typecmds.c:4209 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "型\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/typecmds.c:4382 +#: commands/typecmds.c:4389 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "型の格納方式をPLAINには変更できません" -#: commands/typecmds.c:4475 +#: commands/typecmds.c:4482 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "型の属性\"%s\"は変更できません" -#: commands/typecmds.c:4493 +#: commands/typecmds.c:4500 #, c-format msgid "must be superuser to alter a type" msgstr "型の変更を行うにはスーパーユーザーである必要があります" -#: commands/typecmds.c:4514 commands/typecmds.c:4523 +#: commands/typecmds.c:4521 commands/typecmds.c:4530 #, c-format msgid "%s is not a base type" msgstr "\"%s\"は基本型ではありません" @@ -12719,20 +12753,29 @@ msgid "cutoff for removing and freezing tuples is far in the past" msgstr "タプルの削除およびフリーズのカットオフ値が古すぎます" -#: commands/vacuum.c:1152 commands/vacuum.c:1157 +#: commands/vacuum.c:1152 #, 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:1156 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "マルチトランザクションのフリーズのカットオフ値が古すぎます" +#: commands/vacuum.c:1157 +#, 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:1912 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" @@ -12996,17 +13039,17 @@ msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "カーソル\"%s\"はテーブル\"%s\"を単純な更新可能スキャンではありません" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2555 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2563 #, 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:2567 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2575 #, c-format msgid "no value found for parameter %d" msgstr "パラメータ%dの値がありません" -#: executor/execExpr.c:642 executor/execExpr.c:649 executor/execExpr.c:655 executor/execExprInterp.c:4851 executor/execExprInterp.c:4868 executor/execExprInterp.c:4967 executor/nodeModifyTable.c:204 executor/nodeModifyTable.c:223 executor/nodeModifyTable.c:240 executor/nodeModifyTable.c:250 executor/nodeModifyTable.c:260 +#: executor/execExpr.c:642 executor/execExpr.c:649 executor/execExpr.c:655 executor/execExprInterp.c:4922 executor/execExprInterp.c:4939 executor/execExprInterp.c:5038 executor/nodeModifyTable.c:204 executor/nodeModifyTable.c:223 executor/nodeModifyTable.c:240 executor/nodeModifyTable.c:250 executor/nodeModifyTable.c:260 #, c-format msgid "table row type and query-specified row type do not match" msgstr "テーブルの行型と問い合わせで指定した行型が一致しません" @@ -13021,7 +13064,7 @@ msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "問い合わせで %d 番目に削除される列の値を指定しています。" -#: executor/execExpr.c:656 executor/execExprInterp.c:4869 executor/nodeModifyTable.c:251 +#: executor/execExpr.c:656 executor/execExprInterp.c:4940 executor/nodeModifyTable.c:251 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "テーブルでは %2$d 番目の型は %1$s ですが、問い合わせでは %3$s を想定しています。" @@ -13062,95 +13105,95 @@ msgid "type %s does not support subscripted assignment" msgstr "型%sは添字を使った代入をサポートしません" -#: executor/execExprInterp.c:2019 +#: executor/execExprInterp.c:2027 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "%2$s型の属性%1$dが削除されています" -#: executor/execExprInterp.c:2025 +#: executor/execExprInterp.c:2033 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "型%2$sの属性%1$dの型が間違っています" -#: executor/execExprInterp.c:2027 executor/execExprInterp.c:3226 executor/execExprInterp.c:3272 +#: executor/execExprInterp.c:2035 executor/execExprInterp.c:3234 executor/execExprInterp.c:3280 #, c-format msgid "Table has type %s, but query expects %s." msgstr "テーブルの型は%sですが、問い合わせでは%sを想定しています。" -#: executor/execExprInterp.c:2107 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 utils/fmgr/funcapi.c:569 +#: executor/execExprInterp.c:2115 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1745 utils/cache/typcache.c:1904 utils/cache/typcache.c:2051 utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" msgstr "型%sは複合型ではありません" -#: executor/execExprInterp.c:2710 +#: executor/execExprInterp.c:2718 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "このタイプのテーブルではWHERE CURRENT OFをサポートしません" -#: executor/execExprInterp.c:2923 +#: executor/execExprInterp.c:2931 #, c-format msgid "cannot merge incompatible arrays" msgstr "互換性がない配列をマージできません" -#: executor/execExprInterp.c:2924 +#: executor/execExprInterp.c:2932 #, 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:2945 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5599 utils/adt/arrayfuncs.c:6118 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 +#: executor/execExprInterp.c:2953 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5608 utils/adt/arrayfuncs.c:6125 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "配列の次数(%d)が上限(%d)を超えています" -#: executor/execExprInterp.c:2965 executor/execExprInterp.c:3000 +#: executor/execExprInterp.c:2973 executor/execExprInterp.c:3008 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "多次元配列の配列式の次数があっていなければなりません" -#: executor/execExprInterp.c:2977 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:3533 utils/adt/arrayfuncs.c:5371 -#: utils/adt/arrayfuncs.c:6210 utils/adt/arrayfuncs.c:6554 utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 utils/adt/arrayutils.c:99 +#: executor/execExprInterp.c:2985 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:3533 utils/adt/arrayfuncs.c:5371 +#: utils/adt/arrayfuncs.c:6217 utils/adt/arrayfuncs.c:6561 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:3225 executor/execExprInterp.c:3271 +#: executor/execExprInterp.c:3233 executor/execExprInterp.c:3279 #, c-format msgid "attribute %d has wrong type" msgstr "属性%dの型が間違っています" -#: executor/execExprInterp.c:3857 utils/adt/domains.c:158 +#: executor/execExprInterp.c:3928 utils/adt/domains.c:158 #, c-format msgid "domain %s does not allow null values" msgstr "ドメイン%sはnull値を許しません" -#: executor/execExprInterp.c:3872 utils/adt/domains.c:196 +#: executor/execExprInterp.c:3943 utils/adt/domains.c:196 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "ドメイン%sの値が検査制約\"%s\"に違反しています" -#: executor/execExprInterp.c:4447 +#: executor/execExprInterp.c:4518 #, c-format msgid "no SQL/JSON item found for specified path of column \"%s\"" msgstr "列\"%s\"の指定されたパスに対応するSQL/JSON項目が見つかりません" -#: executor/execExprInterp.c:4452 +#: executor/execExprInterp.c:4523 #, 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:4652 executor/execExprInterp.c:4660 +#: executor/execExprInterp.c:4723 executor/execExprInterp.c:4731 #, c-format msgid "could not coerce %s expression (%s) to the RETURNING type" msgstr "%s式(%s)をRETURNING型に強制変換できませんでした" -#: executor/execExprInterp.c:4852 +#: executor/execExprInterp.c:4923 #, 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:4968 executor/execSRF.c:977 +#: executor/execExprInterp.c:5039 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "序数位置%dの削除された属性における物理格納形式が一致しません。" @@ -13350,7 +13393,7 @@ msgid "concurrent delete, retrying" msgstr "並行する削除がありました、リトライします" -#: executor/execReplication.c:352 parser/parse_cte.c:303 parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1334 utils/adt/array_userfuncs.c:1477 utils/adt/arrayfuncs.c:3858 utils/adt/arrayfuncs.c:4413 utils/adt/arrayfuncs.c:6434 utils/adt/rowtypes.c:1220 +#: executor/execReplication.c:352 parser/parse_cte.c:303 parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1343 utils/adt/array_userfuncs.c:1486 utils/adt/arrayfuncs.c:3858 utils/adt/arrayfuncs.c:4413 utils/adt/arrayfuncs.c:6441 utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" msgstr "型%sの等価演算子を特定できませんでした" @@ -13543,7 +13586,7 @@ msgid "return type %s is not supported for SQL functions" msgstr "戻り値型%sはSQL関数でサポートされていません" -#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2975 +#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:3023 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "集約%uは入力データ型と遷移用の型間で互換性が必要です" @@ -13629,7 +13672,7 @@ msgstr "テーブル\"%s\"上に外部キー制約を定義することを検討してください。" #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2619 executor/nodeModifyTable.c:3152 executor/nodeModifyTable.c:3344 +#: executor/nodeModifyTable.c:2619 executor/nodeModifyTable.c:3152 executor/nodeModifyTable.c:3349 #, c-format msgid "%s command cannot affect row a second time" msgstr "%sコマンドは単一の行に2度は適用できません" @@ -13639,17 +13682,17 @@ msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "同じコマンドでの挿入候補の行が同じ制約値を持つことがないようにしてください" -#: executor/nodeModifyTable.c:3145 executor/nodeModifyTable.c:3337 +#: executor/nodeModifyTable.c:3145 executor/nodeModifyTable.c:3342 #, c-format msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" msgstr "更新または削除対象のタプルは、現在のコマンドによって発火した操作トリガーによってすでに更新されています" -#: executor/nodeModifyTable.c:3154 executor/nodeModifyTable.c:3346 +#: executor/nodeModifyTable.c:3154 executor/nodeModifyTable.c:3351 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "ソース行が2行以上ターゲット行に合致しないようにしてください。" -#: executor/nodeModifyTable.c:3223 +#: executor/nodeModifyTable.c:3228 #, c-format msgid "tuple to be merged was already moved to another partition due to concurrent update" msgstr "マージ対象のタプルは同時に行われた更新によってすでに他の子テーブルに移動されています" @@ -13694,32 +13737,32 @@ 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:2083 +#: executor/nodeWindowAgg.c:2131 #, c-format msgid "frame starting offset must not be null" msgstr "フレームの開始オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2096 +#: executor/nodeWindowAgg.c:2144 #, c-format msgid "frame starting offset must not be negative" msgstr "フレームの開始オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2108 +#: executor/nodeWindowAgg.c:2156 #, c-format msgid "frame ending offset must not be null" msgstr "フレームの終了オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2121 +#: executor/nodeWindowAgg.c:2169 #, c-format msgid "frame ending offset must not be negative" msgstr "フレームの終了オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2891 +#: executor/nodeWindowAgg.c:2939 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "集約関数 %s はウィンドウ関数としての使用をサポートしていません" @@ -13945,7 +13988,7 @@ msgid "duplicate trigger events specified" msgstr "重複したトリガーイベントが指定されました" -#: gram.y:6114 parser/parse_utilcmd.c:3692 parser/parse_utilcmd.c:3718 +#: gram.y:6114 parser/parse_utilcmd.c:3696 parser/parse_utilcmd.c:3722 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "INITIALLY DEFERREDと宣言された制約はDEFERRABLEでなければなりません" @@ -14129,7 +14172,7 @@ msgid "improper use of \"*\"" msgstr "\"*\"の使い方が不適切です" -#: gram.y:18742 gram.y:18759 tsearch/spell.c:962 tsearch/spell.c:978 tsearch/spell.c:994 tsearch/spell.c:1010 tsearch/spell.c:1075 +#: gram.y:18742 gram.y:18759 tsearch/spell.c:971 tsearch/spell.c:988 tsearch/spell.c:1005 tsearch/spell.c:1022 tsearch/spell.c:1087 #, c-format msgid "syntax error" msgstr "構文エラー" @@ -14267,7 +14310,7 @@ msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "多くの構文エラーがありました。ファイル\"%s\"を断念します" -#: jsonpath_gram.y:266 jsonpath_gram.y:598 jsonpath_scan.l:640 jsonpath_scan.l:651 jsonpath_scan.l:661 jsonpath_scan.l:712 utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:659 utils/adt/varlena.c:333 utils/adt/varlena.c:374 +#: jsonpath_gram.y:266 jsonpath_gram.y:598 jsonpath_scan.l:640 jsonpath_scan.l:651 jsonpath_scan.l:661 jsonpath_scan.l:712 utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:659 utils/adt/varlena.c:334 utils/adt/varlena.c:375 #, c-format msgid "invalid input syntax for type %s" msgstr "%s型に対する不正な入力構文" @@ -14304,7 +14347,7 @@ msgid "unexpected end after backslash" msgstr "バックスラッシュの後の想定外の終了" -#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 +#: jsonpath_scan.l:201 repl_scanner.l:215 scan.l:756 msgid "unterminated quoted string" msgstr "文字列の引用符が閉じていません" @@ -15412,12 +15455,12 @@ msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "ユーザー\"%s\"のパスワードはMD5認証で使用不能です。" -#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 +#: libpq/crypt.c:204 libpq/crypt.c:246 libpq/crypt.c:267 #, c-format msgid "Password does not match for user \"%s\"." msgstr "ユーザー\"%s\"のパスワードが合致しません。" -#: libpq/crypt.c:284 +#: libpq/crypt.c:286 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "ユーザー\"%s\"のパスワードは識別不能な形式です。" @@ -15895,7 +15938,7 @@ msgid "could not receive data from client: %m" msgstr "クライアントからデータを受信できませんでした: %m" -#: libpq/pqcomm.c:1149 tcop/postgres.c:4533 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4553 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "プロトコルの同期が失われたためコネクションを終了します" @@ -15940,7 +15983,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:797 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:798 utils/adt/arrayfuncs.c:1481 utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" msgstr "メッセージ内に残るデータが不十分です" @@ -16249,7 +16292,7 @@ msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\"は登録されていません" -#: nodes/makefuncs.c:152 nodes/makefuncs.c:178 statistics/extended_stats.c:2290 +#: nodes/makefuncs.c:152 nodes/makefuncs.c:178 statistics/extended_stats.c:2300 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "リレーション\"%s\"は複合型を持っていません" @@ -16274,7 +16317,7 @@ msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN はマージ結合可能もしくはハッシュ結合可能な場合のみサポートされています" -#: optimizer/plan/createplan.c:7177 parser/parse_merge.c:203 rewrite/rewriteHandler.c:1683 +#: optimizer/plan/createplan.c:7177 parser/parse_merge.c:203 rewrite/rewriteHandler.c:1717 #, c-format msgid "cannot execute MERGE on relation \"%s\"" msgstr "リレーション\"%s\"に対してMERGEは実行できません" @@ -16342,7 +16385,7 @@ msgid "could not implement %s" msgstr "%sを実行できませんでした" -#: optimizer/util/clauses.c:4962 +#: optimizer/util/clauses.c:4965 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL関数\"%s\"のインライン化処理中" @@ -17199,7 +17242,7 @@ msgid "Cast the offset value to the exact intended type." msgstr "オフセット値を意図した型そのものにキャストしてください。" -#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2155 parser/parse_expr.c:2763 parser/parse_expr.c:3414 parser/parse_expr.c:3643 parser/parse_target.c:998 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2155 parser/parse_expr.c:2763 parser/parse_expr.c:3414 parser/parse_expr.c:3643 parser/parse_expr.c:4079 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "型%sから%sへの型変換ができません" @@ -17802,55 +17845,55 @@ msgid "aggregate ORDER BY is not implemented for window functions" msgstr "ウィンドウ関数に対する集約の ORDER BY は実装されていません" -#: parser/parse_expr.c:4081 +#: parser/parse_expr.c:4091 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" msgstr "bytrea以外の入力型に対しては JSON FORMAT ENCODING句は使用できません" -#: parser/parse_expr.c:4101 +#: parser/parse_expr.c:4111 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "JSON述語では型%sを使用できません" -#: parser/parse_expr.c:4127 parser/parse_expr.c:4248 +#: parser/parse_expr.c:4137 parser/parse_expr.c:4258 #, c-format msgid "cannot use type %s in RETURNING clause of %s" msgstr "%s()のRETURNING節では型%sは指定できません" -#: parser/parse_expr.c:4129 +#: parser/parse_expr.c:4139 #, c-format msgid "Try returning json or jsonb." msgstr "jsonまたはjsonbでの返却を試してください。" -#: parser/parse_expr.c:4177 +#: parser/parse_expr.c:4187 #, c-format msgid "cannot use non-string types with WITH UNIQUE KEYS clause" msgstr "非文字列型はWITH UNIQUE KEYS句とともには使用できません" -#: parser/parse_expr.c:4251 +#: parser/parse_expr.c:4261 #, c-format msgid "Try returning a string type or bytea." msgstr "文字列型またはBYTEA型での返却を試してください。" -#: parser/parse_expr.c:4319 +#: parser/parse_expr.c:4329 #, c-format msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" msgstr "%s()のRETURNING節ではFORMAT JSONは指定できません" -#: parser/parse_expr.c:4332 +#: parser/parse_expr.c:4342 #, 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:4346 parser/parse_expr.c:4375 parser/parse_expr.c:4406 parser/parse_expr.c:4432 parser/parse_expr.c:4458 parser/parse_jsontable.c:94 +#: parser/parse_expr.c:4356 parser/parse_expr.c:4385 parser/parse_expr.c:4416 parser/parse_expr.c:4442 parser/parse_expr.c:4468 parser/parse_jsontable.c:94 #, 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:4349 parser/parse_expr.c:4378 +#: parser/parse_expr.c:4359 parser/parse_expr.c:4388 #, 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式のみが使用可能です。" @@ -17858,72 +17901,72 @@ #. 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:4356 parser/parse_expr.c:4385 parser/parse_expr.c:4414 parser/parse_expr.c:4442 parser/parse_expr.c:4468 +#: parser/parse_expr.c:4366 parser/parse_expr.c:4395 parser/parse_expr.c:4424 parser/parse_expr.c:4452 parser/parse_expr.c:4478 #, 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:4359 parser/parse_expr.c:4388 +#: parser/parse_expr.c:4369 parser/parse_expr.c:4398 #, 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:4407 +#: parser/parse_expr.c:4417 #, 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:4417 +#: parser/parse_expr.c:4427 #, 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:4435 parser/parse_expr.c:4461 +#: parser/parse_expr.c:4445 parser/parse_expr.c:4471 #, 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:4445 parser/parse_expr.c:4471 +#: parser/parse_expr.c:4455 parser/parse_expr.c:4481 #, 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:4505 +#: parser/parse_expr.c:4515 #, 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:4745 +#: parser/parse_expr.c:4755 #, c-format msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" msgstr "DEFAULTには定数、非集約関数、および演算子式のみ指定可能です" -#: parser/parse_expr.c:4750 +#: parser/parse_expr.c:4760 #, c-format msgid "DEFAULT expression must not contain column references" msgstr "DEFAULT式は列参照を含むことができません" -#: parser/parse_expr.c:4755 +#: parser/parse_expr.c:4765 #, c-format msgid "DEFAULT expression must not return a set" msgstr "DEFAULT式は集合を返してはなりません" -#: parser/parse_expr.c:4770 +#: parser/parse_expr.c:4780 #, c-format msgid "collation of DEFAULT expression conflicts with RETURNING clause" msgstr "DEFAULT式の照合順序がRETURNING句と競合しています" -#: parser/parse_expr.c:4849 parser/parse_expr.c:4858 +#: parser/parse_expr.c:4859 parser/parse_expr.c:4868 #, c-format msgid "cannot cast behavior expression of type %s to %s" msgstr "型%sの挙動式の%sへの型変換はできません" -#: parser/parse_expr.c:4852 +#: parser/parse_expr.c:4862 #, c-format msgid "You will need to explicitly cast the expression to type %s." msgstr "式を%s型に明示的にキャストする必要があります。" @@ -18349,7 +18392,7 @@ msgid "inconsistent types deduced for parameter $%d" msgstr "パラメータ$%dについて推定された型が不整合です" -#: parser/parse_param.c:309 tcop/postgres.c:744 +#: parser/parse_param.c:309 tcop/postgres.c:745 #, c-format msgid "could not determine data type of parameter $%d" msgstr "パラメータ$%dのデータ型が特定できませんでした" @@ -18699,227 +18742,227 @@ msgid "Index \"%s\" contains a whole-row table reference." msgstr "インデックス\"%s\"には行全体テーブル参照が含まれます" -#: parser/parse_utilcmd.c:2242 +#: parser/parse_utilcmd.c:2246 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "CREATE TABLE では既存のインデックスを使えません" -#: parser/parse_utilcmd.c:2262 +#: parser/parse_utilcmd.c:2266 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "インデックス\"%s\"はすでに1つの制約に割り当てられています" -#: parser/parse_utilcmd.c:2283 +#: parser/parse_utilcmd.c:2287 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\"はユニークインデックスではありません" -#: parser/parse_utilcmd.c:2284 parser/parse_utilcmd.c:2291 parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2375 +#: parser/parse_utilcmd.c:2288 parser/parse_utilcmd.c:2295 parser/parse_utilcmd.c:2302 parser/parse_utilcmd.c:2379 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "このようなインデックスを使ってプライマリキーや一意性制約を作成することはできません" -#: parser/parse_utilcmd.c:2290 +#: parser/parse_utilcmd.c:2294 #, c-format msgid "index \"%s\" contains expressions" msgstr "インデックス\"%s\"は式を含んでいます" -#: parser/parse_utilcmd.c:2297 +#: parser/parse_utilcmd.c:2301 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\"は部分インデックスです" -#: parser/parse_utilcmd.c:2309 +#: parser/parse_utilcmd.c:2313 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\"は遅延可能インデックスです" -#: parser/parse_utilcmd.c:2310 +#: parser/parse_utilcmd.c:2314 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "遅延可能インデックスを使った遅延不可制約は作れません。" -#: parser/parse_utilcmd.c:2374 +#: parser/parse_utilcmd.c:2378 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "インデックス\"%s\"の列番号%dにはデフォルトのソート動作がありません" -#: parser/parse_utilcmd.c:2531 +#: parser/parse_utilcmd.c:2535 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "列\"%s\"がプライマリキー制約内に2回出現します" -#: parser/parse_utilcmd.c:2537 +#: parser/parse_utilcmd.c:2541 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "列\"%s\"が一意性制約内に2回出現します" -#: parser/parse_utilcmd.c:2871 +#: parser/parse_utilcmd.c:2875 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "インデックス式と述語はインデックス付けされるテーブルのみを参照できます" -#: parser/parse_utilcmd.c:2943 +#: parser/parse_utilcmd.c:2947 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "統計情報式は参照されているテーブルのみを参照できます" -#: parser/parse_utilcmd.c:2986 +#: parser/parse_utilcmd.c:2990 #, c-format msgid "rules on materialized views are not supported" msgstr "実体化ビューに対するルールはサポートされません" -#: parser/parse_utilcmd.c:3046 +#: parser/parse_utilcmd.c:3050 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "ルールのWHERE条件に他のリレーションへの参照を持たせられません" -#: parser/parse_utilcmd.c:3118 +#: parser/parse_utilcmd.c:3122 #, 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:3136 parser/parse_utilcmd.c:3237 rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1096 +#: parser/parse_utilcmd.c:3140 parser/parse_utilcmd.c:3241 rewrite/rewriteHandler.c:545 rewrite/rewriteManip.c:1096 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "条件付きのUNION/INTERSECT/EXCEPT文は実装されていません" -#: parser/parse_utilcmd.c:3154 +#: parser/parse_utilcmd.c:3158 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:3158 +#: parser/parse_utilcmd.c:3162 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECTルールではNEWを使用できません" -#: parser/parse_utilcmd.c:3167 +#: parser/parse_utilcmd.c:3171 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:3173 +#: parser/parse_utilcmd.c:3177 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETEルールではNEWを使用できません" -#: parser/parse_utilcmd.c:3201 +#: parser/parse_utilcmd.c:3205 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "WITH 問い合わせ内では OLD は参照できません" -#: parser/parse_utilcmd.c:3208 +#: parser/parse_utilcmd.c:3212 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "WITH 問い合わせ内では NEW は参照できません" -#: parser/parse_utilcmd.c:3664 +#: parser/parse_utilcmd.c:3668 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3669 parser/parse_utilcmd.c:3684 +#: parser/parse_utilcmd.c:3673 parser/parse_utilcmd.c:3688 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "複数のDEFERRABLE/NOT DEFERRABLE句を使用できません" -#: parser/parse_utilcmd.c:3679 +#: parser/parse_utilcmd.c:3683 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "NOT DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3700 +#: parser/parse_utilcmd.c:3704 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "INITIALLY DEFERRED句の場所が間違っています<" -#: parser/parse_utilcmd.c:3705 parser/parse_utilcmd.c:3731 +#: parser/parse_utilcmd.c:3709 parser/parse_utilcmd.c:3735 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "複数のINITIALLY IMMEDIATE/DEFERRED句を使用できません" -#: parser/parse_utilcmd.c:3726 +#: parser/parse_utilcmd.c:3730 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "INITIALLY IMMEDIATE句の場所が間違っています<" -#: parser/parse_utilcmd.c:3919 +#: parser/parse_utilcmd.c:3923 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATEで指定したスキーマ(%s)が作成先のスキーマ(%s)と異なります" -#: parser/parse_utilcmd.c:3954 +#: parser/parse_utilcmd.c:3958 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\"はパーティションテーブルではありません" -#: parser/parse_utilcmd.c:3961 +#: parser/parse_utilcmd.c:3965 #, c-format msgid "table \"%s\" is not partitioned" msgstr "テーブル\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:3968 +#: parser/parse_utilcmd.c:3972 #, c-format msgid "index \"%s\" is not partitioned" msgstr "インデックス\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:4008 +#: parser/parse_utilcmd.c:4012 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "ハッシュパーティションテーブルはデフォルトパーティションを持つことができません" -#: parser/parse_utilcmd.c:4025 +#: parser/parse_utilcmd.c:4029 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ハッシュパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4031 partitioning/partbounds.c:4802 +#: parser/parse_utilcmd.c:4035 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:4038 partitioning/partbounds.c:4810 +#: parser/parse_utilcmd.c:4042 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "ハッシュパーティションの剰余は法よりも小さくなければなりません" -#: parser/parse_utilcmd.c:4051 +#: parser/parse_utilcmd.c:4055 #, c-format msgid "invalid bound specification for a list partition" msgstr "リストパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4104 +#: parser/parse_utilcmd.c:4108 #, c-format msgid "invalid bound specification for a range partition" msgstr "範囲パーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4110 +#: parser/parse_utilcmd.c:4114 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROMは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:4114 +#: parser/parse_utilcmd.c:4118 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TOは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:4230 +#: parser/parse_utilcmd.c:4234 #, c-format msgid "cannot specify NULL in range bound" msgstr "範囲境界でNULLは使用できません" -#: parser/parse_utilcmd.c:4278 +#: parser/parse_utilcmd.c:4282 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "MAXVALUEに続く境界値はMAXVALUEでなければなりません" -#: parser/parse_utilcmd.c:4285 +#: parser/parse_utilcmd.c:4289 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "MINVALUEに続く境界値はMINVALUEでなければなりません" -#: parser/parse_utilcmd.c:4328 +#: parser/parse_utilcmd.c:4332 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "指定した値は列\"%s\"の%s型に変換できません" @@ -18937,7 +18980,7 @@ msgid "invalid Unicode escape value" msgstr "不正なUnicodeエスケープシーケンスの値" -#: parser/parser.c:494 scan.l:716 utils/adt/varlena.c:6650 +#: parser/parser.c:494 scan.l:716 utils/adt/varlena.c:6688 #, c-format msgid "invalid Unicode escape" msgstr "不正なUnicodeエスケープ" @@ -18947,7 +18990,7 @@ msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicodeエスケープは\\XXXXまたは\\+XXXXXXでなければなりません。" -#: parser/parser.c:523 scan.l:677 scan.l:693 scan.l:709 utils/adt/varlena.c:6675 +#: parser/parser.c:523 scan.l:677 scan.l:693 scan.l:709 utils/adt/varlena.c:6713 #, c-format msgid "invalid Unicode surrogate pair" msgstr "不正なUnicodeサロゲートペア" @@ -19302,7 +19345,7 @@ msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "バックグラウンドワーカー\"%s\": パラレルワーカーは再起動するように設定してはいけません" -#: postmaster/bgworker.c:715 tcop/postgres.c:3312 +#: postmaster/bgworker.c:715 tcop/postgres.c:3313 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "管理者コマンドによりバックグラウンドワーカー\"%s\"を終了しています" @@ -19484,138 +19527,138 @@ msgid "archive modules must register an archive callback" msgstr "アーカイブモジュールはアーカイブコールバックを登録しなくてはなりません" -#: postmaster/postmaster.c:661 +#: postmaster/postmaster.c:662 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: -fオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:734 +#: postmaster/postmaster.c:735 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: -tオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:757 +#: postmaster/postmaster.c:758 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: 不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:825 +#: postmaster/postmaster.c:826 #, 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:833 +#: postmaster/postmaster.c:834 #, c-format msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" msgstr "\"wal_level\"が\"minimal\"の時はWALアーカイブは有効にできません" -#: postmaster/postmaster.c:836 +#: postmaster/postmaster.c:837 #, 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:839 +#: postmaster/postmaster.c:840 #, c-format msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" msgstr "\"wal_level\"が\"minimal\"の時はWALは集約できません" -#: postmaster/postmaster.c:847 +#: postmaster/postmaster.c:848 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: データトークンテーブルが不正です、修復してください\n" -#: postmaster/postmaster.c:1006 +#: postmaster/postmaster.c:1007 #, c-format msgid "could not create I/O completion port for child queue" msgstr "子キュー向けのI/O終了ポートを作成できませんでした" -#: postmaster/postmaster.c:1071 +#: postmaster/postmaster.c:1072 #, c-format msgid "ending log output to stderr" msgstr "標準エラー出力へのログ出力を終了しています" -#: postmaster/postmaster.c:1072 +#: postmaster/postmaster.c:1073 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "この後のログ出力はログ配送先\"%s\"に出力されます。" -#: postmaster/postmaster.c:1083 +#: postmaster/postmaster.c:1084 #, c-format msgid "starting %s" msgstr "%s を起動しています" -#: postmaster/postmaster.c:1145 +#: postmaster/postmaster.c:1146 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "\"%s\"に関する監視用ソケットを作成できませんでした" -#: postmaster/postmaster.c:1151 +#: postmaster/postmaster.c:1152 #, c-format msgid "could not create any TCP/IP sockets" msgstr "TCP/IPソケットを作成できませんでした" -#: postmaster/postmaster.c:1183 +#: postmaster/postmaster.c:1184 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister()が失敗しました: エラーコード %ld" -#: postmaster/postmaster.c:1236 +#: postmaster/postmaster.c:1237 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "ディレクトリ\"%s\"においてUnixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1242 +#: postmaster/postmaster.c:1243 #, c-format msgid "could not create any Unix-domain sockets" msgstr "Unixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1253 +#: postmaster/postmaster.c:1254 #, c-format msgid "no socket created for listening" msgstr "監視用に作成するソケットはありません" -#: postmaster/postmaster.c:1284 +#: postmaster/postmaster.c:1285 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %m\n" msgstr "%s: 外部PIDファイル\"%s\"の権限を変更できませんでした: %m\n" -#: postmaster/postmaster.c:1288 +#: postmaster/postmaster.c:1289 #, 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:1316 utils/init/postinit.c:221 +#: postmaster/postmaster.c:1317 utils/init/postinit.c:221 #, c-format msgid "could not load %s" msgstr "%s\"をロードできませんでした" -#: postmaster/postmaster.c:1344 +#: postmaster/postmaster.c:1345 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmasterは起動処理中はマルチスレッドで動作します" -#: postmaster/postmaster.c:1345 postmaster/postmaster.c:3686 +#: postmaster/postmaster.c:1346 postmaster/postmaster.c:3672 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "LC_ALL環境変数を使用可能なロケールに設定してください。" -#: postmaster/postmaster.c:1444 +#: postmaster/postmaster.c:1445 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: 自身の実行ファイルのパスが特定できません" -#: postmaster/postmaster.c:1451 +#: postmaster/postmaster.c:1452 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: 一致するpostgres実行ファイルがありませんでした" -#: postmaster/postmaster.c:1474 utils/misc/tzparser.c:341 +#: postmaster/postmaster.c:1475 utils/misc/tzparser.c:341 #, 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:1501 +#: postmaster/postmaster.c:1502 #, c-format msgid "" "%s: could not find the database system\n" @@ -19627,239 +19670,234 @@ "ファイル\"%s\"をオープンできませんでした: %m\n" #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1791 +#: postmaster/postmaster.c:1792 #, c-format msgid "issuing %s to recalcitrant children" msgstr "手に負えない子プロセスに%sを送出します" -#: postmaster/postmaster.c:1813 +#: postmaster/postmaster.c:1814 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "データディレクトリのロックファイルが不正なため、即時シャットダウンを実行中です" -#: postmaster/postmaster.c:1876 +#: postmaster/postmaster.c:1877 #, c-format msgid "wrong key in cancel request for process %d" msgstr "プロセス%dに対するキャンセル要求においてキーが間違っています" -#: postmaster/postmaster.c:1888 +#: postmaster/postmaster.c:1889 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "キャンセル要求内のPID %dがどのプロセスにも一致しません" -#: postmaster/postmaster.c:2108 +#: postmaster/postmaster.c:2109 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUPを受け取りました。設定ファイルをリロードしています" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2136 postmaster/postmaster.c:2140 +#: postmaster/postmaster.c:2137 postmaster/postmaster.c:2141 #, c-format msgid "%s was not reloaded" msgstr "%s は再読み込みされていません" -#: postmaster/postmaster.c:2150 +#: postmaster/postmaster.c:2151 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL設定は再読み込みされていません" -#: postmaster/postmaster.c:2236 +#: postmaster/postmaster.c:2237 #, c-format msgid "received smart shutdown request" msgstr "スマートシャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2277 +#: postmaster/postmaster.c:2278 #, c-format msgid "received fast shutdown request" msgstr "高速シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2295 +#: postmaster/postmaster.c:2296 #, c-format msgid "aborting any active transactions" msgstr "活動中の全トランザクションをアボートしています" -#: postmaster/postmaster.c:2319 +#: postmaster/postmaster.c:2320 #, c-format msgid "received immediate shutdown request" msgstr "即時シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2391 +#: postmaster/postmaster.c:2392 #, c-format msgid "shutdown at recovery target" msgstr "リカバリ目標でシャットダウンします" -#: postmaster/postmaster.c:2409 postmaster/postmaster.c:2445 +#: postmaster/postmaster.c:2430 msgid "startup process" msgstr "起動プロセス" -#: postmaster/postmaster.c:2412 -#, c-format -msgid "aborting startup due to startup process failure" -msgstr "起動プロセスの失敗のため起動を中断しています" - -#: postmaster/postmaster.c:2487 +#: postmaster/postmaster.c:2472 #, c-format msgid "database system is ready to accept connections" msgstr "データベースシステムの接続受け付け準備が整いました" -#: postmaster/postmaster.c:2508 +#: postmaster/postmaster.c:2493 msgid "background writer process" msgstr "バックグランドライタプロセス" -#: postmaster/postmaster.c:2555 +#: postmaster/postmaster.c:2540 msgid "checkpointer process" msgstr "チェックポイント処理プロセス" -#: postmaster/postmaster.c:2571 +#: postmaster/postmaster.c:2556 msgid "WAL writer process" msgstr "WALライタプロセス" -#: postmaster/postmaster.c:2586 +#: postmaster/postmaster.c:2571 msgid "WAL receiver process" msgstr "WAL 受信プロセス" -#: postmaster/postmaster.c:2600 +#: postmaster/postmaster.c:2585 msgid "WAL summarizer process" msgstr "WAL集約プロセス" -#: postmaster/postmaster.c:2615 +#: postmaster/postmaster.c:2600 msgid "autovacuum launcher process" msgstr "自動VACUUM起動プロセス" -#: postmaster/postmaster.c:2633 +#: postmaster/postmaster.c:2618 msgid "archiver process" msgstr "アーカイバプロセス" -#: postmaster/postmaster.c:2646 +#: postmaster/postmaster.c:2631 msgid "system logger process" msgstr "システムログ取得プロセス" -#: postmaster/postmaster.c:2663 +#: postmaster/postmaster.c:2648 msgid "slot sync worker process" msgstr "スロット同期ワーカープロセス" -#: postmaster/postmaster.c:2719 +#: postmaster/postmaster.c:2704 #, c-format msgid "background worker \"%s\"" msgstr "バックグラウンドワーカー\"%s\"" -#: postmaster/postmaster.c:2798 postmaster/postmaster.c:2818 postmaster/postmaster.c:2825 postmaster/postmaster.c:2843 +#: postmaster/postmaster.c:2783 postmaster/postmaster.c:2803 postmaster/postmaster.c:2810 postmaster/postmaster.c:2828 msgid "server process" msgstr "サーバープロセス" -#: postmaster/postmaster.c:2897 +#: postmaster/postmaster.c:2882 #, 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:3084 +#: postmaster/postmaster.c:3070 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d)は終了コード%dで終了しました" -#: postmaster/postmaster.c:3086 postmaster/postmaster.c:3098 postmaster/postmaster.c:3108 postmaster/postmaster.c:3119 +#: postmaster/postmaster.c:3072 postmaster/postmaster.c:3084 postmaster/postmaster.c:3094 postmaster/postmaster.c:3105 #, 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:3095 +#: postmaster/postmaster.c:3081 #, 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:3105 +#: postmaster/postmaster.c:3091 #, 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:3117 +#: postmaster/postmaster.c:3103 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d)は認識できないステータス%dで終了しました" -#: postmaster/postmaster.c:3333 +#: postmaster/postmaster.c:3319 #, c-format msgid "abnormal database system shutdown" msgstr "データベースシステムは異常にシャットダウンしました" -#: postmaster/postmaster.c:3359 +#: postmaster/postmaster.c:3345 #, c-format msgid "shutting down due to startup process failure" msgstr "起動プロセスの失敗のためシャットダウンしています" -#: postmaster/postmaster.c:3365 +#: postmaster/postmaster.c:3351 #, c-format msgid "shutting down because \"restart_after_crash\" is off" msgstr "\"restart_after_crash\"がoffであるためシャットダウンします" -#: postmaster/postmaster.c:3377 +#: postmaster/postmaster.c:3363 #, c-format msgid "all server processes terminated; reinitializing" msgstr "全てのサーバープロセスが終了しました: 再初期化しています" -#: postmaster/postmaster.c:3576 postmaster/postmaster.c:3987 postmaster/postmaster.c:4376 +#: postmaster/postmaster.c:3562 postmaster/postmaster.c:3973 postmaster/postmaster.c:4362 #, c-format msgid "could not generate random cancel key" msgstr "ランダムなキャンセルキーを生成できませんでした" -#: postmaster/postmaster.c:3609 +#: postmaster/postmaster.c:3595 #, c-format msgid "could not fork new process for connection: %m" msgstr "接続用の新しいプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:3651 +#: postmaster/postmaster.c:3637 msgid "could not fork new process for connection: " msgstr "接続用の新しいプロセスをforkできませんでした" -#: postmaster/postmaster.c:3685 +#: postmaster/postmaster.c:3671 #, c-format msgid "postmaster became multithreaded" msgstr "postmasterがマルチスレッド動作になっています" -#: postmaster/postmaster.c:3754 +#: postmaster/postmaster.c:3740 #, c-format msgid "database system is ready to accept read-only connections" msgstr "データベースシステムはリードオンリー接続の受け付け準備ができました" -#: postmaster/postmaster.c:3937 +#: postmaster/postmaster.c:3923 #, c-format msgid "could not fork \"%s\" process: %m" msgstr "\"%s\"プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:4175 postmaster/postmaster.c:4209 +#: postmaster/postmaster.c:4161 postmaster/postmaster.c:4195 #, c-format msgid "database connection requirement not indicated during registration" msgstr "登録時にデータベース接続の必要性が示されていません" -#: postmaster/postmaster.c:4185 postmaster/postmaster.c:4219 +#: postmaster/postmaster.c:4171 postmaster/postmaster.c:4205 #, c-format msgid "invalid processing mode in background worker" msgstr "バックグラウンドワーカー内の不正な処理モード" -#: postmaster/postmaster.c:4279 +#: postmaster/postmaster.c:4265 #, c-format msgid "could not fork background worker process: %m" msgstr "バックグランドワーカープロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:4362 +#: postmaster/postmaster.c:4348 #, c-format msgid "no slot available for new background worker process" msgstr "新しいバックグラウンドワーカープロセスに割り当て可能なスロットがありません" -#: postmaster/postmaster.c:4625 +#: postmaster/postmaster.c:4611 #, c-format msgid "could not read exit code for process\n" msgstr "子プロセスの終了コードの読み込みができませんでした\n" -#: postmaster/postmaster.c:4667 +#: postmaster/postmaster.c:4653 #, c-format msgid "could not post child completion status\n" msgstr "個プロセスの終了コードを投稿できませんでした\n" @@ -19914,38 +19952,38 @@ msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "自動ローテーションを無効にしています(再度有効にするにはSIGHUPを使用してください)" -#: postmaster/walsummarizer.c:740 +#: postmaster/walsummarizer.c:741 #, c-format msgid "WAL summarization is not progressing" msgstr "WAL集計が進んでいません" -#: postmaster/walsummarizer.c:741 +#: postmaster/walsummarizer.c:742 #, 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:755 +#: postmaster/walsummarizer.c:756 #, 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:760 +#: postmaster/walsummarizer.c:761 #, c-format msgid "Summarization has reached %X/%X on disk and %X/%X in memory." msgstr "集計がディスク上で%X/%X、メモリ上で%X/%Xに到達しました。" -#: postmaster/walsummarizer.c:1000 +#: postmaster/walsummarizer.c:1001 #, c-format msgid "could not find a valid record after %X/%X" msgstr "%X/%Xの後に有効なレコードが見つかりませんでした" -#: postmaster/walsummarizer.c:1045 +#: postmaster/walsummarizer.c:1046 #, c-format msgid "could not read WAL from timeline %u at %X/%X: %s" msgstr "%X/%Xでタイムライン%uのWALを読み取れませんでした: %s" -#: postmaster/walsummarizer.c:1051 +#: postmaster/walsummarizer.c:1052 #, c-format msgid "could not read WAL from timeline %u at %X/%X" msgstr "%X/%Xでタイムライン%uのWALを読み取れませんでした" @@ -20009,7 +20047,7 @@ msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "プライマリサーバーからデータベースシステムの識別子とタイムライン ID を受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:489 replication/libpqwalreceiver/libpqwalreceiver.c:788 +#: replication/libpqwalreceiver/libpqwalreceiver.c:489 replication/libpqwalreceiver/libpqwalreceiver.c:807 #, c-format msgid "invalid response from primary server" msgstr "プライマリサーバーからの応答が不正です" @@ -20019,86 +20057,86 @@ 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:631 replication/libpqwalreceiver/libpqwalreceiver.c:638 replication/libpqwalreceiver/libpqwalreceiver.c:668 +#: replication/libpqwalreceiver/libpqwalreceiver.c:687 #, c-format msgid "could not start WAL streaming: %s" msgstr "WAL ストリーミングを開始できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:692 +#: replication/libpqwalreceiver/libpqwalreceiver.c:711 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "プライマリにストリーミングの終了メッセージを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:715 +#: replication/libpqwalreceiver/libpqwalreceiver.c:734 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "ストリーミングの終了後の想定外の結果セット" -#: replication/libpqwalreceiver/libpqwalreceiver.c:730 +#: replication/libpqwalreceiver/libpqwalreceiver.c:749 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ストリーミングCOPY終了中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:740 +#: replication/libpqwalreceiver/libpqwalreceiver.c:759 #, c-format msgid "error reading result of streaming command: %s" msgstr "ストリーミングコマンドの結果読み取り中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:749 replication/libpqwalreceiver/libpqwalreceiver.c:982 +#: replication/libpqwalreceiver/libpqwalreceiver.c:768 replication/libpqwalreceiver/libpqwalreceiver.c:1001 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "CommandComplete後の想定外の結果: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:776 +#: replication/libpqwalreceiver/libpqwalreceiver.c:795 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "プライマリサーバーからタイムライン履歴ファイルを受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:789 +#: replication/libpqwalreceiver/libpqwalreceiver.c:808 #, 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:945 replication/libpqwalreceiver/libpqwalreceiver.c:998 replication/libpqwalreceiver/libpqwalreceiver.c:1005 +#: replication/libpqwalreceiver/libpqwalreceiver.c:964 replication/libpqwalreceiver/libpqwalreceiver.c:1017 replication/libpqwalreceiver/libpqwalreceiver.c:1024 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL ストリームからデータを受信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1025 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1044 #, c-format msgid "could not send data to WAL stream: %s" msgstr "WAL ストリームにデータを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1126 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1146 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を作成できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1165 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1186 #, c-format msgid "could not alter replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を変更できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1199 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1220 #, c-format msgid "invalid query response" msgstr "不正な問い合わせ応答" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1200 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1221 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d個の列を期待していましたが、%d列を受信しました。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1270 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1291 #, c-format msgid "the query interface requires a database connection" msgstr "クエリインタフェースの動作にはデータベースコネクションが必要です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1302 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1323 msgid "empty query" msgstr "空の問い合わせ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1308 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1329 msgid "unexpected pipeline mode" msgstr "想定されていないパイプラインモード" @@ -20107,31 +20145,31 @@ 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の残りの変更をシリアライズしてファイルに格納します" @@ -20151,7 +20189,7 @@ msgid "out of logical replication worker slots" msgstr "論理レプリケーションワーカースロットは全て使用中です" -#: replication/logical/launcher.c:441 replication/logical/launcher.c:527 replication/slot.c:1585 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 +#: replication/logical/launcher.c:441 replication/logical/launcher.c:527 replication/slot.c:1587 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 #, c-format msgid "You might need to increase \"%s\"." msgstr "\"%s\"を大きくする必要があるかもしれません。" @@ -20201,7 +20239,7 @@ msgid "cannot use replication slot \"%s\" for logical decoding" msgstr "レプリケーションスロット\"%s\"は論理デコードには使用できません" -#: replication/logical/logical.c:546 replication/slot.c:827 replication/slot.c:858 +#: replication/logical/logical.c:546 replication/slot.c:829 replication/slot.c:860 #, c-format msgid "This replication slot is being synchronized from the primary server." msgstr "このレプリケーションスロットはプライマリサーバーからの同期中です。" @@ -20351,7 +20389,7 @@ msgid "could not find free replication state slot for replication origin with ID %d" msgstr "ID%dのレプリケーション基点に対するレプリケーション状態スロットの空きがありません" -#: replication/logical/origin.c:957 replication/logical/origin.c:1158 replication/slot.c:2446 +#: replication/logical/origin.c:957 replication/logical/origin.c:1158 replication/slot.c:2448 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "\"max_replication_slots\"を増やして再度試してください" @@ -20402,88 +20440,88 @@ msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "論理レプリケーション先のリレーション\"%s.%s\"は存在しません" -#: replication/logical/reorderbuffer.c:4129 +#: replication/logical/reorderbuffer.c:4127 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "XID%uのためのデータファイルの書き出しに失敗しました: %m" -#: replication/logical/reorderbuffer.c:4475 replication/logical/reorderbuffer.c:4500 +#: replication/logical/reorderbuffer.c:4473 replication/logical/reorderbuffer.c:4498 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "並べ替えバッファのあふれファイルの読み込みに失敗しました: %m" -#: replication/logical/reorderbuffer.c:4479 replication/logical/reorderbuffer.c:4504 +#: replication/logical/reorderbuffer.c:4477 replication/logical/reorderbuffer.c:4502 #, 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:4754 +#: replication/logical/reorderbuffer.c:4752 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "pg_replslot/%2$s/xid* の削除中にファイル\"%1$s\"が削除できませんでした: %3$m" -#: replication/logical/reorderbuffer.c:5250 +#: replication/logical/reorderbuffer.c:5248 #, 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:215 replication/logical/slotsync.c:580 +#: replication/logical/slotsync.c:226 replication/logical/slotsync.c:607 #, c-format msgid "could not synchronize replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を同期できませんでした" -#: replication/logical/slotsync.c:217 +#: replication/logical/slotsync.c:228 #, 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:459 +#: replication/logical/slotsync.c:482 #, c-format msgid "dropped replication slot \"%s\" of database with OID %u" msgstr "OID %2$uのデータベースのレプリケーションスロット\"%1$s\"を削除しました" -#: replication/logical/slotsync.c:581 +#: replication/logical/slotsync.c:608 #, 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:590 +#: replication/logical/slotsync.c:617 #, c-format msgid "newly created replication slot \"%s\" is sync-ready now" msgstr "新規に作成したレプリケーションスロット\"%s\"が同期可能になりました" -#: replication/logical/slotsync.c:629 +#: replication/logical/slotsync.c:656 #, 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:651 +#: replication/logical/slotsync.c:678 #, c-format msgid "exiting from slot synchronization because same name slot \"%s\" already exists on the standby" msgstr "スタンバイに同名のスロット\"%s\"がすでに存在するため、スロット同期を終了しました" -#: replication/logical/slotsync.c:822 +#: replication/logical/slotsync.c:849 #, c-format msgid "could not fetch failover logical slots info from the primary server: %s" msgstr "プライマリサーバーからフェイルオーバー属性を持つ論理スロットを取得できませんでした: %s" -#: replication/logical/slotsync.c:968 +#: replication/logical/slotsync.c:995 #, c-format msgid "could not fetch primary_slot_name \"%s\" info from the primary server: %s" msgstr "プライマリサーバーから primary_slot_name \"%s\"の情報を取得できませんでした: %s" -#: replication/logical/slotsync.c:970 +#: replication/logical/slotsync.c:997 #, c-format msgid "Check if primary_slot_name is configured correctly." msgstr "\"primary_slot_name\"が正しく設定されているか確認してください。" -#: replication/logical/slotsync.c:990 +#: replication/logical/slotsync.c:1017 #, c-format msgid "cannot synchronize replication slots from a standby server" msgstr "スタンバイサーバーからのリプリケーションスロットの同期ができませんでした" #. translator: second %s is a GUC variable name -#: replication/logical/slotsync.c:999 +#: replication/logical/slotsync.c:1026 #, c-format msgid "replication slot \"%s\" specified by \"%s\" does not exist on primary server" msgstr "%2$sで指定されたレプリケーションスロット\"%1$s\"はプライマリサーバーに存在しません" @@ -20491,60 +20529,75 @@ #. translator: first %s is a connection option; second %s is a GUC #. variable name #. -#: replication/logical/slotsync.c:1032 +#: replication/logical/slotsync.c:1059 #, c-format msgid "replication slot synchronization requires \"%s\" to be specified in \"%s\"" msgstr "レプリケーションスロットの同期を行う際は\"%2$s\"で\"%1$s\"が指定されている必要があります" -#: replication/logical/slotsync.c:1051 +#: replication/logical/slotsync.c:1078 #, 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:1066 replication/logical/slotsync.c:1094 +#: replication/logical/slotsync.c:1093 replication/logical/slotsync.c:1121 #, c-format msgid "replication slot synchronization requires \"%s\" to be set" msgstr "レプリケーションスロットの同期を行う際は\"%s\"が設定されている必要があります" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1080 +#: replication/logical/slotsync.c:1107 #, c-format msgid "replication slot synchronization requires \"%s\" to be enabled" msgstr "レプリケーションスロットの同期を行う際は\"%s\"が有効になっている必要があります" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1132 +#: replication/logical/slotsync.c:1164 #, 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:1141 +#: replication/logical/slotsync.c:1182 #, c-format msgid "replication slot synchronization worker will restart because of a parameter change" msgstr "パラメータの変更があったため、レプリケーションスロット同期ワーカーが再起動します" -#: replication/logical/slotsync.c:1165 +#: replication/logical/slotsync.c:1207 +#, c-format +msgid "replication slot synchronization will stop because of a parameter change" +msgstr "パラメータの変更があったため、レプリケーションスロット同期が停止します" + +#: replication/logical/slotsync.c:1243 +#, c-format +msgid "replication slot synchronization worker will stop because promotion is triggered" +msgstr "昇格がトリガーされたため、レプリケーションスロット同期ワーカーが停止します" + +#: replication/logical/slotsync.c:1257 +#, c-format +msgid "replication slot synchronization will stop because promotion is triggered" +msgstr "昇格がトリガーされたため、レプリケーションスロット同期が停止します" + +#: replication/logical/slotsync.c:1377 #, c-format -msgid "replication slot synchronization worker is shutting down because promotion is triggered" -msgstr "昇格がトリガーされたため、レプリケーションスロット同期ワーカーがシャットダウンします" +msgid "replication slot synchronization worker will not start because promotion was triggered" +msgstr "昇格がトリガーされたため、レプリケーションスロット同期ワーカーは起動されません" -#: replication/logical/slotsync.c:1290 +#: replication/logical/slotsync.c:1389 #, c-format -msgid "cannot synchronize replication slots when standby promotion is ongoing" -msgstr "スタンバイの昇格処理中はリプリケーションスロットの同期はできません" +msgid "replication slot synchronization will not start because promotion was triggered" +msgstr "昇格がトリガーされたため、レプリケーションスロット同期は開始されません" -#: replication/logical/slotsync.c:1298 +#: replication/logical/slotsync.c:1398 #, c-format msgid "cannot synchronize replication slots concurrently" msgstr "複数のレプリケーションスロットの並行同期はできません" -#: replication/logical/slotsync.c:1406 +#: replication/logical/slotsync.c:1510 #, c-format msgid "slot sync worker started" msgstr "スロット同期ワーカーが起動しました" -#: replication/logical/slotsync.c:1469 replication/slotfuncs.c:926 replication/walreceiver.c:307 +#: replication/logical/slotsync.c:1573 replication/slotfuncs.c:926 replication/walreceiver.c:307 #, c-format msgid "could not connect to the primary server: %s" msgstr "プライマリサーバーへの接続ができませんでした: %s" @@ -20650,17 +20703,17 @@ msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "テーブル\"%s.%s\"の初期内容のコピーを開始できませんでした: %s" -#: replication/logical/tablesync.c:1469 +#: replication/logical/tablesync.c:1470 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "テーブルコピー中にパブリッシャ上でのトランザクション開始に失敗しました: %s" -#: replication/logical/tablesync.c:1529 replication/logical/worker.c:2363 +#: replication/logical/tablesync.c:1530 replication/logical/worker.c:2373 #, c-format msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" msgstr "ユーザー\"%s\"は行レベルセキュリティが有効なリレーションへのレプリケーションはできません: \"%s\"" -#: replication/logical/tablesync.c:1542 +#: replication/logical/tablesync.c:1543 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "テーブルコピー中にパブリッシャ上でのトランザクション終了に失敗しました: %s" @@ -20675,147 +20728,152 @@ msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." msgstr "すべてのテーブルの同期が完了するまでは、ストリームされたトランザクションを適用ワーカーで扱うことはできません。" -#: replication/logical/worker.c:854 replication/logical/worker.c:969 +#: replication/logical/worker.c:821 replication/logical/worker.c:938 replication/logical/worker.c:2615 +#, c-format +msgid "logical replication column %d not found in tuple: only %d column(s) received" +msgstr "論理レプリケーションの列 %d がタプル中にありません: %d 個の列しか受信していません" + +#: replication/logical/worker.c:860 replication/logical/worker.c:979 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "論理レプリケーション列%dのバイナリデータ書式が不正です" -#: replication/logical/worker.c:2506 +#: replication/logical/worker.c:2516 #, 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:2513 +#: replication/logical/worker.c:2523 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "論理レプリケーション先のリレーション\"%s.%s\"が識別列インデックスも主キーをもっておらず、かつパブリッシュされたリレーションがREPLICA IDENTITY FULLとなっていません" -#: replication/logical/worker.c:3384 +#: replication/logical/worker.c:3399 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "不正な論理レプリケーションのメッセージタイプ \"??? (%d)\"" -#: replication/logical/worker.c:3556 +#: replication/logical/worker.c:3571 #, c-format msgid "data stream from publisher has ended" msgstr "パブリッシャからのデータストリームが終了しました" -#: replication/logical/worker.c:3710 +#: replication/logical/worker.c:3725 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "タイムアウトにより論理レプリケーションワーカーを終了しています" -#: replication/logical/worker.c:3904 +#: replication/logical/worker.c:3919 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" msgstr "サブスクリプション\"%s\"が削除されたため、このサブスクリプションに対応する論理レプリケーションワーカーが停止します" -#: replication/logical/worker.c:3918 +#: replication/logical/worker.c:3933 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "サブスクリプション\"%s\"が無効化されたため、このサブスクリプションに対応する論理レプリケーションワーカーが停止します" -#: replication/logical/worker.c:3949 +#: replication/logical/worker.c:3964 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーション並列適用ワーカーが停止します" -#: replication/logical/worker.c:3953 +#: replication/logical/worker.c:3968 #, c-format msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーションワーカーが再起動します" -#: replication/logical/worker.c:3967 +#: replication/logical/worker.c:3982 #, 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:3971 +#: replication/logical/worker.c:3986 #, 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:4499 +#: replication/logical/worker.c:4514 #, c-format msgid "subscription has no replication slot set" msgstr "サブスクリプションにレプリケーションスロットが設定されていません" -#: replication/logical/worker.c:4627 +#: replication/logical/worker.c:4642 #, 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:4643 +#: replication/logical/worker.c:4658 #, 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:4667 +#: replication/logical/worker.c:4682 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "サブスクリプション\"%s\"、テーブル\"%s\"に対応する論理レプリケーションテーブル同期ワーカーが起動しました" -#: replication/logical/worker.c:4672 +#: replication/logical/worker.c:4687 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカーが起動しました" -#: replication/logical/worker.c:4806 +#: replication/logical/worker.c:4821 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "サブスクリプション\"%s\"はエラーのため無効化されました" -#: replication/logical/worker.c:4854 +#: replication/logical/worker.c:4869 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "論理レプリケーションは%X/%Xででトランザクションのスキップを開始します" -#: replication/logical/worker.c:4868 +#: replication/logical/worker.c:4883 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "論理レプリケーションは%X/%Xでトランザクションのスキップを完了しました" -#: replication/logical/worker.c:4956 +#: replication/logical/worker.c:4971 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "サブスクリプションの\"%s\"スキップLSNをクリアしました" -#: replication/logical/worker.c:4957 +#: replication/logical/worker.c:4972 #, 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:4985 +#: replication/logical/worker.c:5000 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "メッセージタイプ \"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:4989 +#: replication/logical/worker.c:5004 #, 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:4994 +#: replication/logical/worker.c:5009 #, 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:5005 +#: replication/logical/worker.c:5020 #, 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:5012 +#: replication/logical/worker.c:5027 #, 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:5023 +#: replication/logical/worker.c:5038 #, 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:5031 +#: replication/logical/worker.c:5046 #, 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\"のリモートからのデータを処理中" @@ -20899,7 +20957,7 @@ msgid "cannot enable failover for a replication slot created on the standby" msgstr "スタンバイ上で作成したレプリケーションスロットのフェイルオーバーを有効にすることはできません" -#: replication/slot.c:374 replication/slot.c:878 +#: replication/slot.c:374 replication/slot.c:880 #, c-format msgid "cannot enable failover for a temporary replication slot" msgstr "一時レプリケーションスロットのフェイルオーバーを有効にすることはできません" @@ -20924,7 +20982,7 @@ msgid "replication slot \"%s\" does not exist" msgstr "レプリケーションスロット\"%s\"は存在しません" -#: replication/slot.c:635 replication/slot.c:1395 +#: replication/slot.c:635 replication/slot.c:1397 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "レプリケーションスロット\"%s\"はPID%dで使用中です" @@ -20939,187 +20997,187 @@ msgid "acquired physical replication slot \"%s\"" msgstr "物理レプリケーションスロット\"%s\"を取得しました" -#: replication/slot.c:758 +#: replication/slot.c:760 #, c-format msgid "released logical replication slot \"%s\"" msgstr "論理レプリケーションスロット\"%s\"を解放しました" -#: replication/slot.c:760 +#: replication/slot.c:762 #, c-format msgid "released physical replication slot \"%s\"" msgstr "物理レプリケーションスロット\"%s\"を解放しました" -#: replication/slot.c:826 +#: replication/slot.c:828 #, c-format msgid "cannot drop replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を削除できませんでした" -#: replication/slot.c:845 +#: replication/slot.c:847 #, c-format msgid "cannot use %s with a physical replication slot" msgstr "%sは物理レプリケーションスロットでは使用できません" -#: replication/slot.c:857 +#: replication/slot.c:859 #, c-format msgid "cannot alter replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を変更できませんでした" -#: replication/slot.c:867 +#: replication/slot.c:869 #, c-format msgid "cannot enable failover for a replication slot on the standby" msgstr "スタンバイ上ではレプリケーションスロットのフェイルオーバーを有効にすることはできません" -#: replication/slot.c:998 replication/slot.c:1965 replication/slot.c:2356 +#: replication/slot.c:1000 replication/slot.c:1967 replication/slot.c:2358 #, c-format msgid "could not remove directory \"%s\"" msgstr "ディレクトリ\"%s\"を削除できませんでした" -#: replication/slot.c:1430 +#: replication/slot.c:1432 #, c-format msgid "replication slots can only be used if \"max_replication_slots\" > 0" msgstr "レプリケーションスロットは\"max_replication_slots\" > 0 のときだけ使用できます" -#: replication/slot.c:1435 +#: replication/slot.c:1437 #, c-format msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" msgstr "レプリケーションスロットは\"wal_level\" >= \"replica\" のときだけ使用できます" -#: replication/slot.c:1447 +#: replication/slot.c:1449 #, c-format msgid "permission denied to use replication slots" msgstr "レプリケーションスロットを使用する権限がありません" -#: replication/slot.c:1448 +#: replication/slot.c:1450 #, c-format msgid "Only roles with the %s attribute may use replication slots." msgstr "%s属性を持つロールのみがレプリケーションスロットを使用できます。" -#: replication/slot.c:1559 +#: replication/slot.c:1561 #, c-format msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." msgstr[0] "このスロットのrestart_lsn %X/%Xは制限を%lluバイト超過しています。" -#: replication/slot.c:1567 +#: replication/slot.c:1569 #, c-format msgid "The slot conflicted with xid horizon %u." msgstr "このスロットはXID地平線%uと競合しました。" -#: replication/slot.c:1572 +#: replication/slot.c:1574 msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." msgstr "論理デコードを行うためにはプライマリサーバー上で\"wal_level\" >= \"logical\" である必要があります。" -#: replication/slot.c:1580 +#: replication/slot.c:1582 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "プロセス%dを終了してレプリケーションスロット\"%s\"を解放します" -#: replication/slot.c:1582 +#: replication/slot.c:1584 #, c-format msgid "invalidating obsolete replication slot \"%s\"" msgstr "使用不能のレプリケーションスロット\"%s\"を無効化します" -#: replication/slot.c:2294 +#: replication/slot.c:2296 #, 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:2301 +#: replication/slot.c:2303 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "レプリケーションスロットファイル\"%s\"はサポート外のバージョン%uです" -#: replication/slot.c:2308 +#: replication/slot.c:2310 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "レプリケーションスロットファイル\"%s\"のサイズ%uは異常です" -#: replication/slot.c:2344 +#: replication/slot.c:2346 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "レプリケーションスロットファイル\"%s\"のチェックサムが一致しません: %uですが、%uであるべきです" -#: replication/slot.c:2380 +#: replication/slot.c:2382 #, c-format msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" msgstr "論理レプリケーションスロット\"%s\"がありますが、\"wal_level\" < \"logical\" です" -#: replication/slot.c:2382 +#: replication/slot.c:2384 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "\"wal_level\"を\"logical\"もしくはそれより上位の設定にしてください。" -#: replication/slot.c:2394 +#: replication/slot.c:2396 #, c-format msgid "logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = \"off\"" msgstr "論理レプリケーションスロット\"%s\"がありますが、\"hot_standby\" = \"off\" です" -#: replication/slot.c:2396 +#: replication/slot.c:2398 #, c-format msgid "Change \"hot_standby\" to be \"on\"." msgstr "\"hot_standby\" を \"on\" に変更してください。" -#: replication/slot.c:2401 +#: replication/slot.c:2403 #, c-format msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "物理レプリケーションスロット\"%s\"がありますが、\"wal_level\" < \"replica\" です" -#: replication/slot.c:2403 +#: replication/slot.c:2405 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "\"wal_level\"を\"replica\"もしくはそれより上位の設定にしてください。" -#: replication/slot.c:2445 +#: replication/slot.c:2447 #, c-format msgid "too many replication slots active before shutdown" msgstr "シャットダウン前のアクティブなレプリケーションスロットの数が多すぎます" -#: replication/slot.c:2672 +#: replication/slot.c:2674 #, c-format msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" msgstr "パラメータ\"%2$s\"で指定されているレプリケーションスロット\"%1$s\"は存在しません" -#: replication/slot.c:2674 replication/slot.c:2708 replication/slot.c:2723 +#: replication/slot.c:2676 replication/slot.c:2710 replication/slot.c:2725 #, c-format msgid "Logical replication is waiting on the standby associated with replication slot \"%s\"." msgstr "論理レプリケーションはレプリケーションスロット”%s\"に対応するスタンバイを待っています。 " -#: replication/slot.c:2676 +#: replication/slot.c:2678 #, c-format msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." msgstr "レプリケーションスロット\"%s\"を作成するか、パラメータ\"%s\"を修正してください。" -#: replication/slot.c:2686 +#: replication/slot.c:2688 #, c-format msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" msgstr "パラメータ\"%2$s\"では論理レプリケーションスロット\"%1$s\"は指定できません" -#: replication/slot.c:2688 +#: replication/slot.c:2690 #, c-format msgid "Logical replication is waiting for correction on replication slot \"%s\"." msgstr "論理レプリケーションはレプリケーションスロット\"%s\"が修正されるのを待っています。" -#: replication/slot.c:2690 +#: replication/slot.c:2692 #, c-format msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." msgstr "論理レプリケーションスロット\"%s\"をパラメータ\"%s\"から削除してください。" -#: replication/slot.c:2706 +#: replication/slot.c:2708 #, c-format msgid "physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated" msgstr "パラメータ\"%2$s\"で指定された物理レプリケーションスロット\"%1$s\"は無効化されています" -#: replication/slot.c:2710 +#: replication/slot.c:2712 #, c-format msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." msgstr "レプリケーションスロット\"%s\"を削除して再作成するか、パラメータ\"%s\"を修正してください。" -#: replication/slot.c:2721 +#: replication/slot.c:2723 #, 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:2725 +#: replication/slot.c:2727 #, c-format msgid "Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\"." msgstr "レプリケーションスロット\"%s\"に関連付けられているスタンバイを起動するか、パラメータ%sを修正してください。" @@ -21340,88 +21398,88 @@ msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "要求された開始ポイント%X/%XはサーバーのWALフラッシュ位置%X/%Xより進んでいます" -#: replication/walsender.c:1178 +#: replication/walsender.c:1200 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "CREATE_REPLICATION_SLOTのオプション\"%s\"に対する認識できない値: \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1284 +#: replication/walsender.c:1306 #, c-format msgid "%s must not be called inside a transaction" msgstr "%sはトランザクション内では呼び出せません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1294 +#: replication/walsender.c:1316 #, c-format msgid "%s must be called inside a transaction" msgstr "%sはトランザクション内で呼び出さなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1300 +#: replication/walsender.c:1322 #, 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:1305 +#: replication/walsender.c:1327 #, 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:1311 +#: replication/walsender.c:1333 #, c-format msgid "%s must be called before any query" msgstr "%s は問い合わせの実行前に呼び出されなければなりません" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1317 +#: replication/walsender.c:1339 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s はサブトランザクション内では呼び出せません" -#: replication/walsender.c:1490 +#: replication/walsender.c:1512 #, c-format msgid "terminating walsender process after promotion" msgstr "昇格後にWAL送信プロセスを終了します" -#: replication/walsender.c:2029 +#: replication/walsender.c:2057 #, 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:2097 +#: replication/walsender.c:2125 #, c-format msgid "received replication command: %s" msgstr "レプリケーションコマンドを受信しました: %s" -#: replication/walsender.c:2105 tcop/fastpath.c:209 tcop/postgres.c:1142 tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2234 tcop/postgres.c:2672 tcop/postgres.c:2749 +#: replication/walsender.c:2133 tcop/fastpath.c:209 tcop/postgres.c:1143 tcop/postgres.c:1501 tcop/postgres.c:1753 tcop/postgres.c:2235 tcop/postgres.c:2673 tcop/postgres.c:2750 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "現在のトランザクションがアボートしました。トランザクションブロックが終わるまでコマンドは無視されます" -#: replication/walsender.c:2262 replication/walsender.c:2297 +#: replication/walsender.c:2290 replication/walsender.c:2325 #, c-format msgid "unexpected EOF on standby connection" msgstr "スタンバイ接続で想定外のEOFがありました" -#: replication/walsender.c:2285 +#: replication/walsender.c:2313 #, c-format msgid "invalid standby message type \"%c\"" msgstr "スタンバイのメッセージタイプ\"%c\"は不正です" -#: replication/walsender.c:2374 +#: replication/walsender.c:2402 #, c-format msgid "unexpected message type \"%c\"" msgstr "想定しないメッセージタイプ\"%c\"" -#: replication/walsender.c:2792 +#: replication/walsender.c:2823 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "レプリケーションタイムアウトにより WAL 送信プロセスを終了しています" @@ -21601,270 +21659,270 @@ msgid "renaming an ON SELECT rule is not allowed" msgstr "ON SELECTルールの名前を変更することはできません" -#: rewrite/rewriteHandler.c:588 +#: 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:618 +#: 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:671 +#: rewrite/rewriteHandler.c:705 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "複数ルールではRETURNINGリストを持つことはできません" -#: rewrite/rewriteHandler.c:903 rewrite/rewriteHandler.c:942 +#: rewrite/rewriteHandler.c:937 rewrite/rewriteHandler.c:976 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "列\"%s\"への非デフォルト値の挿入はできません" -#: rewrite/rewriteHandler.c:905 rewrite/rewriteHandler.c:971 +#: rewrite/rewriteHandler.c:939 rewrite/rewriteHandler.c:1005 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "列\"%s\"は GENERATED ALWAYS として定義されています。" -#: rewrite/rewriteHandler.c:907 +#: rewrite/rewriteHandler.c:941 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "OVERRIDING SYSTEM VALUE を指定することで挿入を強制できます。" -#: rewrite/rewriteHandler.c:969 rewrite/rewriteHandler.c:977 +#: rewrite/rewriteHandler.c:1003 rewrite/rewriteHandler.c:1011 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "列\"%s\"はDEFAULTにのみ更新可能です" -#: rewrite/rewriteHandler.c:1112 rewrite/rewriteHandler.c:1130 +#: rewrite/rewriteHandler.c:1146 rewrite/rewriteHandler.c:1164 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "同じ列\"%s\"に複数の代入があります" -#: rewrite/rewriteHandler.c:1685 +#: rewrite/rewriteHandler.c:1719 #, c-format msgid "MERGE is not supported for relations with rules." msgstr "MERGEはルールを持つリレーションに対してはサポートされません。" -#: rewrite/rewriteHandler.c:1725 rewrite/rewriteHandler.c:3265 +#: rewrite/rewriteHandler.c:1759 rewrite/rewriteHandler.c:3330 #, c-format msgid "access to non-system view \"%s\" is restricted" msgstr "非システムのビュー\"%s\"へのアクセスは制限されています" -#: rewrite/rewriteHandler.c:2125 rewrite/rewriteHandler.c:4274 +#: rewrite/rewriteHandler.c:2159 rewrite/rewriteHandler.c:4339 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "リレーション\"%s\"のルールで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2230 +#: rewrite/rewriteHandler.c:2264 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "リレーション\"%s\"のポリシで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2592 +#: rewrite/rewriteHandler.c:2657 msgid "Junk view columns are not updatable." msgstr "ジャンクビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2597 +#: rewrite/rewriteHandler.c:2662 msgid "View columns that are not columns of their base relation are not updatable." msgstr "基底リレーションの列ではないビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2600 +#: rewrite/rewriteHandler.c:2665 msgid "View columns that refer to system columns are not updatable." msgstr "システム列を参照するビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2603 +#: rewrite/rewriteHandler.c:2668 msgid "View columns that return whole-row references are not updatable." msgstr "行全体参照を返すビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2664 +#: rewrite/rewriteHandler.c:2729 msgid "Views containing DISTINCT are not automatically updatable." msgstr "DISTINCTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2667 +#: rewrite/rewriteHandler.c:2732 msgid "Views containing GROUP BY are not automatically updatable." msgstr "GROUP BYを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2670 +#: rewrite/rewriteHandler.c:2735 msgid "Views containing HAVING are not automatically updatable." msgstr "HAVINGを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2673 +#: rewrite/rewriteHandler.c:2738 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "UNION、INTERSECT、EXCEPTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2676 +#: rewrite/rewriteHandler.c:2741 msgid "Views containing WITH are not automatically updatable." msgstr "WITHを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2679 +#: rewrite/rewriteHandler.c:2744 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "LIMIT、OFFSETを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2691 +#: rewrite/rewriteHandler.c:2756 msgid "Views that return aggregate functions are not automatically updatable." msgstr "集約関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2694 +#: rewrite/rewriteHandler.c:2759 msgid "Views that return window functions are not automatically updatable." msgstr "ウィンドウ関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2697 +#: rewrite/rewriteHandler.c:2762 msgid "Views that return set-returning functions are not automatically updatable." msgstr "集合返却関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2704 rewrite/rewriteHandler.c:2708 rewrite/rewriteHandler.c:2716 +#: rewrite/rewriteHandler.c:2769 rewrite/rewriteHandler.c:2773 rewrite/rewriteHandler.c:2781 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "単一のテーブルまたはビューからselectしていないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2719 +#: rewrite/rewriteHandler.c:2784 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "TABLESAMPLEを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2743 +#: rewrite/rewriteHandler.c:2808 msgid "Views that have no updatable columns are not automatically updatable." msgstr "更新可能な列を持たないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:3124 rewrite/rewriteHandler.c:3159 +#: rewrite/rewriteHandler.c:3189 rewrite/rewriteHandler.c:3224 #, c-format msgid "cannot insert into view \"%s\"" msgstr "ビュー\"%s\"へは挿入(INSERT)できません" -#: rewrite/rewriteHandler.c:3127 +#: rewrite/rewriteHandler.c:3192 #, 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:3132 rewrite/rewriteHandler.c:3168 +#: rewrite/rewriteHandler.c:3197 rewrite/rewriteHandler.c:3233 #, c-format msgid "cannot update view \"%s\"" msgstr "ビュー\"%s\"は更新できません" -#: rewrite/rewriteHandler.c:3135 +#: rewrite/rewriteHandler.c:3200 #, 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:3140 rewrite/rewriteHandler.c:3177 +#: rewrite/rewriteHandler.c:3205 rewrite/rewriteHandler.c:3242 #, c-format msgid "cannot delete from view \"%s\"" msgstr "ビュー\"%s\"からは削除できません" -#: rewrite/rewriteHandler.c:3143 +#: rewrite/rewriteHandler.c:3208 #, 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:3162 +#: rewrite/rewriteHandler.c:3227 #, 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:3171 +#: rewrite/rewriteHandler.c:3236 #, c-format msgid "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger." msgstr "MERGEを用いたビューの更新を可能にするには、INSTEAD OF UPDATEトリガーを作成してください。" -#: rewrite/rewriteHandler.c:3180 +#: rewrite/rewriteHandler.c:3245 #, 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:3355 +#: rewrite/rewriteHandler.c:3420 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"への挿入はできません" -#: rewrite/rewriteHandler.c:3363 +#: rewrite/rewriteHandler.c:3428 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"は更新できません" -#: rewrite/rewriteHandler.c:3371 +#: rewrite/rewriteHandler.c:3436 #, c-format msgid "cannot merge into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"への統合はできません" -#: rewrite/rewriteHandler.c:3399 +#: rewrite/rewriteHandler.c:3464 #, c-format msgid "cannot merge into view \"%s\"" msgstr "ビュー\"%s\"への統合はできません" -#: rewrite/rewriteHandler.c:3401 +#: rewrite/rewriteHandler.c:3466 #, 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:3402 +#: rewrite/rewriteHandler.c:3467 #, 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:3931 +#: rewrite/rewriteHandler.c:3996 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "DO INSTEAD NOTIFYルールはWITH内のデータ更新文に対してはサポートされません" -#: rewrite/rewriteHandler.c:3942 +#: rewrite/rewriteHandler.c:4007 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は DO INSTEAD NOTHING ルールはサポートされません" -#: rewrite/rewriteHandler.c:3956 +#: rewrite/rewriteHandler.c:4021 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は、条件付き DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:3960 +#: rewrite/rewriteHandler.c:4025 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合は DO ALSO ルールはサポートされません" -#: rewrite/rewriteHandler.c:3965 +#: rewrite/rewriteHandler.c:4030 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH にデータを変更するステートメントがある場合はマルチステートメントの DO INSTEAD ルールはサポートされません" -#: rewrite/rewriteHandler.c:4226 +#: rewrite/rewriteHandler.c:4291 msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "条件付きDO INSTEADルールを持つビューは自動更新できません。" -#: rewrite/rewriteHandler.c:4324 +#: rewrite/rewriteHandler.c:4389 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのINSERT RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4326 +#: rewrite/rewriteHandler.c:4391 #, 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:4331 +#: rewrite/rewriteHandler.c:4396 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのUPDATE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4333 +#: rewrite/rewriteHandler.c:4398 #, 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:4338 +#: rewrite/rewriteHandler.c:4403 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのDELETE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4340 +#: rewrite/rewriteHandler.c:4405 #, 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:4358 +#: rewrite/rewriteHandler.c:4423 #, 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:4415 +#: rewrite/rewriteHandler.c:4480 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "複数問い合わせに対するルールにより書き換えられた問い合わせでは WITH を使用できません" @@ -22039,42 +22097,42 @@ msgid "function returning record called in context that cannot accept type record" msgstr "レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されました" -#: storage/buffer/bufmgr.c:656 storage/buffer/bufmgr.c:812 +#: storage/aio/read_stream.c:417 storage/buffer/bufmgr.c:656 storage/buffer/bufmgr.c:1215 storage/buffer/bufmgr.c:1283 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "他のセッションの一時テーブルにはアクセスできません" -#: storage/buffer/bufmgr.c:1539 +#: storage/buffer/bufmgr.c:1548 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "リレーション %2$s の %1$u ブロック目のページが不正です: ページをゼロで埋めました" -#: storage/buffer/bufmgr.c:2284 storage/buffer/localbuf.c:361 +#: storage/buffer/bufmgr.c:2293 storage/buffer/localbuf.c:361 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "リレーション\"%s\"を%uブロックを超えて拡張できません" -#: storage/buffer/bufmgr.c:2355 +#: storage/buffer/bufmgr.c:2364 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "リレーション %2$s の %1$u ブロック目で、EOF の先に想定外のデータを検出しました" -#: storage/buffer/bufmgr.c:2357 +#: storage/buffer/bufmgr.c:2366 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "これはカーネルの不具合で発生した模様です。システムの更新を検討してください。" -#: storage/buffer/bufmgr.c:5721 +#: storage/buffer/bufmgr.c:5730 #, c-format msgid "could not write block %u of %s" msgstr "%u ブロックを %s に書き出せませんでした" -#: storage/buffer/bufmgr.c:5723 +#: storage/buffer/bufmgr.c:5732 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "複数回失敗しました ---ずっと書き込みエラーが続くかもしれません。" -#: storage/buffer/bufmgr.c:5745 storage/buffer/bufmgr.c:5765 +#: storage/buffer/bufmgr.c:5754 storage/buffer/bufmgr.c:5774 #, c-format msgid "writing block %u of relation %s" msgstr "ブロック %u を リレーション %s に書き込んでいます" @@ -22384,7 +22442,7 @@ 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:416 +#: storage/ipc/procsignal.c:424 #, c-format msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "PID %dのバックエンドがProcSignalBarrierを受け付けるのを待っています" @@ -22424,17 +22482,12 @@ 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:72 #, c-format msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %dはPostgreSQLバックエンドプロセスではありません" -#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 utils/adt/mcxtfuncs.c:182 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1486 utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" msgstr "プロセス%dにシグナルを送信できませんでした: %m" @@ -22485,12 +22538,12 @@ msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "リカバリは%ld.%03dミリ秒で待機終了: %s" -#: storage/ipc/standby.c:920 tcop/postgres.c:3196 +#: storage/ipc/standby.c:920 tcop/postgres.c:3197 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "リカバリで競合が発生したためステートメントをキャンセルしています" -#: storage/ipc/standby.c:921 tcop/postgres.c:2557 +#: storage/ipc/standby.c:921 tcop/postgres.c:2558 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "リカバリ時にユーザーのトランザクションがバッファのデッドロックを引き起こしました。" @@ -22747,27 +22800,27 @@ msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" msgstr "要求されたスタンバイ接続が\"max_wal_senders を超えています\" (現在は %d)" -#: storage/lmgr/proc.c:1546 +#: storage/lmgr/proc.c:1579 #, 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:1561 +#: storage/lmgr/proc.c:1594 #, 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:1570 +#: storage/lmgr/proc.c:1603 #, 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:1577 +#: storage/lmgr/proc.c:1610 #, 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:1594 +#: storage/lmgr/proc.c:1627 #, 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を獲得することに失敗しました" @@ -22917,77 +22970,77 @@ msgid "direct SSL connection rejected" msgstr "直接SSL接続が拒否されました" -#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#: tcop/backend_startup.c:490 tcop/backend_startup.c:518 #, c-format msgid "incomplete startup packet" msgstr "開始パケットが不完全です" -#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#: tcop/backend_startup.c:502 tcop/backend_startup.c:539 #, c-format msgid "invalid length of startup packet" msgstr "不正な開始パケット長" -#: tcop/backend_startup.c:573 +#: tcop/backend_startup.c:574 #, c-format msgid "SSLRequest accepted" msgstr "SSLRequestを受け付けました" -#: tcop/backend_startup.c:576 +#: tcop/backend_startup.c:577 #, c-format msgid "SSLRequest rejected" msgstr "SSLRequestを拒否しました" -#: tcop/backend_startup.c:585 +#: tcop/backend_startup.c:586 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "SSLネゴシエーション応答の送信に失敗しました: %m" -#: tcop/backend_startup.c:603 +#: tcop/backend_startup.c:604 #, c-format msgid "received unencrypted data after SSL request" msgstr "SSL要求の後に非暗号化データを受信しました" -#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 +#: tcop/backend_startup.c:605 tcop/backend_startup.c:668 #, 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:627 +#: tcop/backend_startup.c:637 #, c-format msgid "GSSENCRequest accepted" msgstr "GSSENCRequestを受け付けました" -#: tcop/backend_startup.c:630 +#: tcop/backend_startup.c:640 #, c-format msgid "GSSENCRequest rejected" msgstr "GSSENCRequestを拒否しました" -#: tcop/backend_startup.c:639 +#: tcop/backend_startup.c:649 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "GSSAPIネゴシエーション応答の送信に失敗しました: %m" -#: tcop/backend_startup.c:657 +#: tcop/backend_startup.c:667 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "GSSAPI暗号化リクエストの後に非暗号化データを受信" -#: tcop/backend_startup.c:681 +#: tcop/backend_startup.c:700 #, 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:744 +#: tcop/backend_startup.c:763 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "有効な値: \"false\", 0, \"true\", 1, \"database\"。" -#: tcop/backend_startup.c:785 +#: tcop/backend_startup.c:804 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "開始パケットの配置が不正です: 最終バイトはターミネータであるはずです" -#: tcop/backend_startup.c:802 +#: tcop/backend_startup.c:821 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "開始パケットで指定されたPostgreSQLユーザー名は存在しません" @@ -23007,7 +23060,7 @@ msgid "fastpath function call: \"%s\" (OID %u)" msgstr "近道関数呼び出し: \"%s\"(OID %u))" -#: tcop/fastpath.c:313 tcop/postgres.c:1369 tcop/postgres.c:1605 tcop/postgres.c:2071 tcop/postgres.c:2333 +#: tcop/fastpath.c:313 tcop/postgres.c:1370 tcop/postgres.c:1606 tcop/postgres.c:2072 tcop/postgres.c:2334 #, c-format msgid "duration: %s ms" msgstr "期間: %s ミリ秒" @@ -23037,155 +23090,155 @@ msgid "incorrect binary data format in function argument %d" msgstr "関数引数%dのバイナリデータ書式が不正です" -#: tcop/postgres.c:467 tcop/postgres.c:5012 +#: tcop/postgres.c:468 tcop/postgres.c:5032 #, c-format msgid "invalid frontend message type %d" msgstr "フロントエンドメッセージタイプ%dが不正です" -#: tcop/postgres.c:1076 +#: tcop/postgres.c:1077 #, c-format msgid "statement: %s" msgstr "文: %s" -#: tcop/postgres.c:1374 +#: tcop/postgres.c:1375 #, c-format msgid "duration: %s ms statement: %s" msgstr "期間: %s ミリ秒 文: %s" -#: tcop/postgres.c:1480 +#: tcop/postgres.c:1481 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "準備された文に複数のコマンドを挿入できません" -#: tcop/postgres.c:1610 +#: tcop/postgres.c:1611 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "期間: %s ミリ秒 パース%s : %s" -#: tcop/postgres.c:1677 tcop/postgres.c:2653 +#: tcop/postgres.c:1678 tcop/postgres.c:2654 #, c-format msgid "unnamed prepared statement does not exist" msgstr "無名の準備された文が存在しません" -#: tcop/postgres.c:1729 +#: tcop/postgres.c:1730 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "バインドメッセージは%dパラメータ書式ありましたがパラメータは%dでした" -#: tcop/postgres.c:1735 +#: tcop/postgres.c:1736 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "バインドメッセージは%dパラメータを提供しましたが、準備された文\"%s\"では%d必要でした" -#: tcop/postgres.c:1949 +#: tcop/postgres.c:1950 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "バインドパラメータ%dにおいてバイナリデータ書式が不正です" -#: tcop/postgres.c:2076 +#: tcop/postgres.c:2077 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "期間: %s ミリ秒 バインド %s%s%s: %s" -#: tcop/postgres.c:2131 tcop/postgres.c:2735 +#: tcop/postgres.c:2132 tcop/postgres.c:2736 #, c-format msgid "portal \"%s\" does not exist" msgstr "ポータル\"%s\"は存在しません" -#: tcop/postgres.c:2213 +#: tcop/postgres.c:2214 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2215 tcop/postgres.c:2341 +#: tcop/postgres.c:2216 tcop/postgres.c:2342 msgid "execute fetch from" msgstr "取り出し実行" -#: tcop/postgres.c:2216 tcop/postgres.c:2342 +#: tcop/postgres.c:2217 tcop/postgres.c:2343 msgid "execute" msgstr "実行" -#: tcop/postgres.c:2338 +#: tcop/postgres.c:2339 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "期間: %s ミリ秒 %s %s%s%s: %s" -#: tcop/postgres.c:2486 +#: tcop/postgres.c:2487 #, c-format msgid "prepare: %s" msgstr "準備: %s" -#: tcop/postgres.c:2511 +#: tcop/postgres.c:2512 #, c-format msgid "Parameters: %s" msgstr "パラメータ: %s" -#: tcop/postgres.c:2526 +#: tcop/postgres.c:2527 #, c-format msgid "Abort reason: recovery conflict" msgstr "異常終了の理由: リカバリ衝突" -#: tcop/postgres.c:2542 +#: tcop/postgres.c:2543 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "ユーザーが共有バッファ・ピンを長く保持し過ぎていました" -#: tcop/postgres.c:2545 +#: tcop/postgres.c:2546 #, c-format msgid "User was holding a relation lock for too long." msgstr "ユーザーリレーションのロックを長く保持し過ぎていました" -#: tcop/postgres.c:2548 +#: tcop/postgres.c:2549 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "削除されるべきテーブルスペースをユーザーが使っていました(もしくはその可能性がありました)。" -#: tcop/postgres.c:2551 +#: tcop/postgres.c:2552 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "削除されるべきバージョンの行をユーザー問い合わせが参照しなければならなかった可能性がありました。" -#: tcop/postgres.c:2554 +#: tcop/postgres.c:2555 #, c-format msgid "User was using a logical replication slot that must be invalidated." msgstr "無効化されるべき論理レプリケーションスロットをユーザーが使用していました。" -#: tcop/postgres.c:2560 +#: tcop/postgres.c:2561 #, c-format msgid "User was connected to a database that must be dropped." msgstr "削除されるべきデータベースにユーザーが接続していました。" -#: tcop/postgres.c:2599 +#: tcop/postgres.c:2600 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "ポータル\"%s\" パラメータ$%d = %s" -#: tcop/postgres.c:2602 +#: tcop/postgres.c:2603 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "ポータル\"%s\" パラメータ $%d" -#: tcop/postgres.c:2608 +#: tcop/postgres.c:2609 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "無名ポータルパラメータ $%d = %s" -#: tcop/postgres.c:2611 +#: tcop/postgres.c:2612 #, c-format msgid "unnamed portal parameter $%d" msgstr "無名ポータルパラメータ $%d" -#: tcop/postgres.c:2955 +#: tcop/postgres.c:2956 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "予期しないSIGQUITシグナルによりコネクションを終了します" -#: tcop/postgres.c:2961 +#: tcop/postgres.c:2962 #, c-format msgid "terminating connection because of crash of another server process" msgstr "他のサーバープロセスがクラッシュしたため接続を終了します" -#: tcop/postgres.c:2962 +#: tcop/postgres.c:2963 #, 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 "" @@ -23193,167 +23246,167 @@ "postmasterはこのサーバープロセスに対し、現在のトランザクションをロールバック\n" "し終了するよう指示しました。" -#: tcop/postgres.c:2966 tcop/postgres.c:3219 +#: tcop/postgres.c:2967 tcop/postgres.c:3220 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "この後、データベースに再接続し、コマンドを繰り返さなければなりません。" -#: tcop/postgres.c:2973 +#: tcop/postgres.c:2974 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "即時シャットダウンコマンドによりコネクションを終了します" -#: tcop/postgres.c:3051 +#: tcop/postgres.c:3052 #, c-format msgid "floating-point exception" msgstr "浮動小数点例外" -#: tcop/postgres.c:3052 +#: tcop/postgres.c:3053 #, 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:3217 +#: tcop/postgres.c:3218 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "リカバリで競合が発生したため、接続を終了しています" -#: tcop/postgres.c:3289 +#: tcop/postgres.c:3290 #, c-format msgid "canceling authentication due to timeout" msgstr "タイムアウトにより認証処理をキャンセルしています" -#: tcop/postgres.c:3293 +#: tcop/postgres.c:3294 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "管理者コマンドにより自動VACUUM処理を終了しています" -#: tcop/postgres.c:3297 +#: tcop/postgres.c:3298 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "管理者コマンドにより、論理レプリケーションワーカーを終了します" -#: tcop/postgres.c:3317 +#: tcop/postgres.c:3318 #, c-format msgid "terminating connection due to administrator command" msgstr "管理者コマンドにより接続を終了しています" -#: tcop/postgres.c:3348 +#: tcop/postgres.c:3349 #, c-format msgid "connection to client lost" msgstr "クライアントへの接続が切れました。" -#: tcop/postgres.c:3400 +#: tcop/postgres.c:3401 #, c-format msgid "canceling statement due to lock timeout" msgstr "ロックのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3407 +#: tcop/postgres.c:3408 #, c-format msgid "canceling statement due to statement timeout" msgstr "ステートメントのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3414 +#: tcop/postgres.c:3415 #, c-format msgid "canceling autovacuum task" msgstr "自動VACUUM処理をキャンセルしています" -#: tcop/postgres.c:3427 +#: tcop/postgres.c:3428 #, c-format msgid "canceling statement due to user request" msgstr "ユーザーからの要求により文をキャンセルしています" -#: tcop/postgres.c:3448 +#: tcop/postgres.c:3449 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "トランザクション中アイドルタイムアウトのため接続を終了します" -#: tcop/postgres.c:3461 +#: tcop/postgres.c:3462 #, c-format msgid "terminating connection due to transaction timeout" msgstr "トランザクションタイムアウトのため接続を終了します" -#: tcop/postgres.c:3474 +#: tcop/postgres.c:3475 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "アイドルセッションタイムアウトにより接続を終了します" -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3569 #, c-format msgid "stack depth limit exceeded" msgstr "スタック長制限を越えました" -#: tcop/postgres.c:3565 +#: tcop/postgres.c:3570 #, 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)を増やしてください。" -#: tcop/postgres.c:3612 +#: tcop/postgres.c:3632 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\"は%ldkBを越えてはなりません。" -#: tcop/postgres.c:3614 +#: tcop/postgres.c:3634 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "プラットフォームのスタック長制限を\"ulimit -s\"または同等の機能を使用して増加してください" -#: tcop/postgres.c:3637 +#: tcop/postgres.c:3657 #, c-format msgid "\"client_connection_check_interval\" must be set to 0 on this platform." msgstr "このプラットフォームでは\"client_connection_check_interval\"を0に設定する必要があります。" -#: tcop/postgres.c:3658 +#: tcop/postgres.c:3678 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "\"log_statement_stats\"が真の場合、パラメータを有効にできません" -#: tcop/postgres.c:3673 +#: tcop/postgres.c:3693 #, 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:4098 +#: tcop/postgres.c:4118 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "サーバープロセスに対する不正なコマンドライン引数: %s" -#: tcop/postgres.c:4099 tcop/postgres.c:4105 +#: tcop/postgres.c:4119 tcop/postgres.c:4125 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細は\"%s --help\"を実行してください。" -#: tcop/postgres.c:4103 +#: tcop/postgres.c:4123 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: 不正なコマンドライン引数: %s" -#: tcop/postgres.c:4156 +#: tcop/postgres.c:4176 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: データベース名もユーザー名も指定されていません" -#: tcop/postgres.c:4909 +#: tcop/postgres.c:4929 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "不正なCLOSEメッセージのサブタイプ%d" -#: tcop/postgres.c:4946 +#: tcop/postgres.c:4966 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "不正なDESCRIBEメッセージのサブタイプ%d" -#: tcop/postgres.c:5033 +#: tcop/postgres.c:5053 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "レプリケーション接続では高速関数呼び出しはサポートされていません" -#: tcop/postgres.c:5037 +#: tcop/postgres.c:5057 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "レプリケーション接続では拡張問い合わせプロトコルはサポートされていません" -#: tcop/postgres.c:5217 +#: tcop/postgres.c:5237 #, 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" @@ -23454,17 +23507,17 @@ msgid "unrecognized simple dictionary parameter: \"%s\"" msgstr "認識できない単純辞書パラメータ: \"%s\"" -#: tsearch/dict_synonym.c:118 +#: tsearch/dict_synonym.c:117 #, c-format msgid "unrecognized synonym parameter: \"%s\"" msgstr "認識できない類義語パラメータ: \"%s\"" -#: tsearch/dict_synonym.c:125 +#: tsearch/dict_synonym.c:124 #, c-format msgid "missing Synonyms parameter" msgstr "類義語パラメータがありません" -#: tsearch/dict_synonym.c:132 +#: tsearch/dict_synonym.c:131 #, c-format msgid "could not open synonym file \"%s\": %m" msgstr "類義語ファイル\"%s\"をオープンできませんでした: %m" @@ -23539,12 +23592,12 @@ msgid "missing Dictionary parameter" msgstr "Dictionaryパラメータがありません" -#: tsearch/spell.c:383 tsearch/spell.c:400 tsearch/spell.c:409 tsearch/spell.c:1040 +#: tsearch/spell.c:383 tsearch/spell.c:400 tsearch/spell.c:409 tsearch/spell.c:1052 #, c-format msgid "invalid affix flag \"%s\"" msgstr "不正な接辞フラグ\"%s\"" -#: tsearch/spell.c:387 tsearch/spell.c:1044 +#: tsearch/spell.c:387 tsearch/spell.c:1056 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "接辞フラグ\"%s\"は範囲外です" @@ -23564,37 +23617,37 @@ msgid "could not open dictionary file \"%s\": %m" msgstr "辞書ファイル\"%s\"をオープンできませんでした: %m" -#: tsearch/spell.c:1167 tsearch/spell.c:1179 tsearch/spell.c:1739 tsearch/spell.c:1744 tsearch/spell.c:1749 +#: tsearch/spell.c:1181 tsearch/spell.c:1193 tsearch/spell.c:1753 tsearch/spell.c:1758 tsearch/spell.c:1763 #, c-format msgid "invalid affix alias \"%s\"" msgstr "不正な接辞の別名 \"%s\"" -#: tsearch/spell.c:1220 tsearch/spell.c:1291 tsearch/spell.c:1440 +#: tsearch/spell.c:1234 tsearch/spell.c:1305 tsearch/spell.c:1454 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "affixファイル\"%s\"をオープンできませんでした: %m" -#: tsearch/spell.c:1274 +#: tsearch/spell.c:1288 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Ispell辞書はフラグ値\"default\"、\"long\"および\"num\"のみをサポートします" -#: tsearch/spell.c:1318 +#: tsearch/spell.c:1332 #, c-format msgid "invalid number of flag vector aliases" msgstr "不正な数のフラグベクタの別名" -#: tsearch/spell.c:1341 +#: tsearch/spell.c:1355 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "別名の数が指定された数 %d を超えています" -#: tsearch/spell.c:1555 +#: tsearch/spell.c:1569 #, 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バイト)" @@ -23634,62 +23687,67 @@ 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以上でなければなりません" -#: utils/activity/pgstat.c:435 +#: 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:436 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "永続統計情報ファイル\"%s\"をunlinkできませんでした: %m" -#: utils/activity/pgstat.c:1254 +#: utils/activity/pgstat.c:1265 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "不正な統計情報種別: \"%s\"" -#: utils/activity/pgstat.c:1334 +#: utils/activity/pgstat.c:1345 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をオープンできませんでした: %m" -#: utils/activity/pgstat.c:1454 +#: utils/activity/pgstat.c:1465 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"に書き込みできませんでした: %m" -#: utils/activity/pgstat.c:1463 +#: utils/activity/pgstat.c:1474 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をクローズできませんでした: %m" -#: utils/activity/pgstat.c:1471 +#: utils/activity/pgstat.c:1482 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" -#: utils/activity/pgstat.c:1520 +#: utils/activity/pgstat.c:1531 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "統計情報ファイル\"%s\"をオープンできませんでした: %m" -#: utils/activity/pgstat.c:1692 +#: utils/activity/pgstat.c:1703 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "統計情報ファイル\"%s\"が破損しています" @@ -23819,68 +23877,73 @@ msgid "must be able to SET ROLE \"%s\"" msgstr "SET ROLE\"%s\"ができなければなりません" -#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 utils/adt/array_userfuncs.c:866 utils/adt/json.c:602 utils/adt/json.c:740 utils/adt/json.c:790 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:103 utils/adt/array_userfuncs.c:490 utils/adt/array_userfuncs.c:867 utils/adt/json.c:602 utils/adt/json.c:740 utils/adt/json.c:790 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:107 +#: utils/adt/array_userfuncs.c:108 #, c-format msgid "input data type is not an array" msgstr "入力データ型は配列ではありません" -#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 utils/adt/float.c:4060 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:1918 utils/adt/numeric.c:4455 utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1140 utils/adt/varlena.c:3144 +#: utils/adt/array_userfuncs.c:152 utils/adt/array_userfuncs.c:204 utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 utils/adt/float.c:4060 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:1924 utils/adt/numeric.c:4461 utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1178 utils/adt/varlena.c:3182 #, c-format msgid "integer out of range" msgstr "integerの範囲外です" -#: utils/adt/array_userfuncs.c:158 utils/adt/array_userfuncs.c:213 +#: utils/adt/array_userfuncs.c:159 utils/adt/array_userfuncs.c:214 #, c-format msgid "argument must be empty or one-dimensional array" msgstr "引数は空か1次元の配列でなければなりません" -#: utils/adt/array_userfuncs.c:295 utils/adt/array_userfuncs.c:334 utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:400 utils/adt/array_userfuncs.c:428 +#: utils/adt/array_userfuncs.c:296 utils/adt/array_userfuncs.c:335 utils/adt/array_userfuncs.c:372 utils/adt/array_userfuncs.c:401 utils/adt/array_userfuncs.c:429 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "互換性がない配列を連結できません" -#: utils/adt/array_userfuncs.c:296 +#: utils/adt/array_userfuncs.c:297 #, c-format msgid "Arrays with element types %s and %s are not compatible for concatenation." msgstr "要素型%sと%sの配列の連結には互換性がありません" -#: utils/adt/array_userfuncs.c:335 +#: utils/adt/array_userfuncs.c:336 #, c-format msgid "Arrays of %d and %d dimensions are not compatible for concatenation." msgstr "要素数%dと%dの配列の連結には互換性がありません" -#: utils/adt/array_userfuncs.c:372 +#: utils/adt/array_userfuncs.c:373 #, c-format msgid "Arrays with differing element dimensions are not compatible for concatenation." msgstr "異なる要素次数の配列の連結には互換性がありません。" -#: utils/adt/array_userfuncs.c:401 utils/adt/array_userfuncs.c:429 +#: utils/adt/array_userfuncs.c:402 utils/adt/array_userfuncs.c:430 #, c-format msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "異なる次数の配列の連結には互換性がありません。" -#: utils/adt/array_userfuncs.c:975 utils/adt/array_userfuncs.c:983 utils/adt/arrayfuncs.c:5622 utils/adt/arrayfuncs.c:5628 +#: utils/adt/array_userfuncs.c:977 utils/adt/array_userfuncs.c:985 utils/adt/arrayfuncs.c:5631 utils/adt/arrayfuncs.c:5637 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "次元の異なる配列は結合できません" -#: utils/adt/array_userfuncs.c:1272 utils/adt/array_userfuncs.c:1426 +#: utils/adt/array_userfuncs.c:997 utils/adt/arrayfuncs.c:5593 +#, c-format +msgid "array size exceeds the maximum allowed (%zu)" +msgstr "配列のサイズが上限(%zu)を超えています" + +#: utils/adt/array_userfuncs.c:1281 utils/adt/array_userfuncs.c:1435 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "多次元配列内の要素の検索はサポートされません" -#: utils/adt/array_userfuncs.c:1301 +#: utils/adt/array_userfuncs.c:1310 #, c-format msgid "initial position must not be null" msgstr "初期位置nullであってはなりません" -#: utils/adt/array_userfuncs.c:1674 +#: utils/adt/array_userfuncs.c:1683 #, c-format msgid "sample size must be between 0 and %d" msgstr "サンプルの大きさは0と%dの間でなければなりません" @@ -23970,7 +24033,7 @@ msgid "Unexpected end of input." msgstr "想定外の入力の終端。" -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 utils/adt/arrayfuncs.c:6114 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 utils/adt/arrayfuncs.c:6121 #, c-format msgid "invalid number of dimensions: %d" msgstr "不正な次元数: %d" @@ -23985,7 +24048,7 @@ 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:351 utils/cache/lsyscache.c:2958 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:451 utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:3071 #, c-format msgid "no binary input function available for type %s" msgstr "型%sにはバイナリ入力関数がありません" @@ -23995,7 +24058,7 @@ msgid "improper binary format in array element %d" msgstr "配列要素%dのバイナリ書式が不適切です" -#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:2991 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:456 utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:3104 #, c-format msgid "no binary output function available for type %s" msgstr "型%sにはバイナリ出力関数がありません" @@ -24005,7 +24068,7 @@ 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:6100 utils/adt/arrayfuncs.c:6126 utils/adt/arrayfuncs.c:6137 utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 +#: 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:6107 utils/adt/arrayfuncs.c:6133 utils/adt/arrayfuncs.c:6144 utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 #, c-format msgid "wrong number of array subscripts" msgstr "配列の添え字が不正な数値です" @@ -24050,7 +24113,7 @@ msgid "cannot compare arrays of different element types" msgstr "要素型の異なる配列を比較できません" -#: utils/adt/arrayfuncs.c:4183 utils/adt/multirangetypes.c:2806 utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1361 utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 +#: utils/adt/arrayfuncs.c:4183 utils/adt/multirangetypes.c:2807 utils/adt/multirangetypes.c:2879 utils/adt/rangetypes.c:1361 utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" msgstr "型 %s のハッシュ関数を特定できません" @@ -24065,52 +24128,52 @@ msgid "data type %s is not an array type" msgstr "データ型%sは配列型ではありません" -#: utils/adt/arrayfuncs.c:5567 +#: utils/adt/arrayfuncs.c:5568 #, c-format msgid "cannot accumulate null arrays" msgstr "null配列は連結できません" -#: utils/adt/arrayfuncs.c:5595 +#: utils/adt/arrayfuncs.c:5604 #, c-format msgid "cannot accumulate empty arrays" msgstr "空の配列は連結できません" -#: utils/adt/arrayfuncs.c:5998 utils/adt/arrayfuncs.c:6038 +#: utils/adt/arrayfuncs.c:6005 utils/adt/arrayfuncs.c:6045 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "次元配列もしくは下限値配列が NULL であってはなりません" -#: utils/adt/arrayfuncs.c:6101 utils/adt/arrayfuncs.c:6127 +#: utils/adt/arrayfuncs.c:6108 utils/adt/arrayfuncs.c:6134 #, c-format msgid "Dimension array must be one dimensional." msgstr "次元配列は1次元でなければなりません" -#: utils/adt/arrayfuncs.c:6106 utils/adt/arrayfuncs.c:6132 +#: utils/adt/arrayfuncs.c:6113 utils/adt/arrayfuncs.c:6139 #, c-format msgid "dimension values cannot be null" msgstr "次元値にnullにはできません" -#: utils/adt/arrayfuncs.c:6138 +#: utils/adt/arrayfuncs.c:6145 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "下限配列が次元配列のサイズと異なっています" -#: utils/adt/arrayfuncs.c:6419 +#: utils/adt/arrayfuncs.c:6426 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "多次元配列からの要素削除はサポートされません" -#: utils/adt/arrayfuncs.c:6696 +#: utils/adt/arrayfuncs.c:6703 #, c-format msgid "thresholds must be one-dimensional array" msgstr "閾値は1次元の配列でなければなりません" -#: utils/adt/arrayfuncs.c:6701 +#: utils/adt/arrayfuncs.c:6708 #, c-format msgid "thresholds array must not contain NULLs" msgstr "閾値配列にはNULL値を含めてはいけません" -#: utils/adt/arrayfuncs.c:6934 +#: utils/adt/arrayfuncs.c:6941 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "削除する要素の数は0と%dとの間でなければなりません" @@ -24152,7 +24215,7 @@ #. translator: first %s is inet or cidr #: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 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:803 utils/adt/numeric.c:7222 utils/adt/numeric.c:7425 utils/adt/numeric.c:8372 utils/adt/numutils.c:356 utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 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:803 utils/adt/numeric.c:7228 utils/adt/numeric.c:7431 utils/adt/numeric.c:8378 utils/adt/numutils.c:356 utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 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:510 utils/adt/uuid.c:140 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" @@ -24163,8 +24226,8 @@ msgid "money out of range" msgstr "マネー型の値が範囲外です" -#: utils/adt/cash.c:161 utils/adt/cash.c:723 utils/adt/float.c:99 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:3192 utils/adt/numeric.c:3215 utils/adt/numeric.c:3300 utils/adt/numeric.c:3318 utils/adt/numeric.c:3414 utils/adt/numeric.c:8921 -#: utils/adt/numeric.c:9234 utils/adt/numeric.c:9582 utils/adt/numeric.c:9698 utils/adt/numeric.c:11209 utils/adt/timestamp.c:3713 +#: utils/adt/cash.c:161 utils/adt/cash.c:723 utils/adt/float.c:99 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:3198 utils/adt/numeric.c:3221 utils/adt/numeric.c:3306 utils/adt/numeric.c:3324 utils/adt/numeric.c:3420 utils/adt/numeric.c:8927 +#: utils/adt/numeric.c:9240 utils/adt/numeric.c:9588 utils/adt/numeric.c:9704 utils/adt/numeric.c:11215 utils/adt/timestamp.c:3717 #, c-format msgid "division by zero" msgstr "0 による除算が行われました" @@ -24199,7 +24262,7 @@ msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%sの位取りを許容最大値%dまで減らしました" -#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4424 utils/adt/formatting.c:4433 utils/adt/formatting.c:4538 utils/adt/formatting.c:4548 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4426 utils/adt/formatting.c:4435 utils/adt/formatting.c:4540 utils/adt/formatting.c:4550 #, c-format msgid "date out of range: \"%s\"" msgstr "日付が範囲外です: \"%s\"" @@ -24229,25 +24292,25 @@ msgid "date out of range for timestamp" msgstr "タイムスタンプで日付が範囲外です" -#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 utils/adt/timestamp.c:6070 +#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4730 utils/adt/timestamp.c:4945 utils/adt/timestamp.c:5093 utils/adt/timestamp.c:5346 utils/adt/timestamp.c:5547 utils/adt/timestamp.c:5594 utils/adt/timestamp.c:5818 utils/adt/timestamp.c:5865 utils/adt/timestamp.c:5945 utils/adt/timestamp.c:6074 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "単位\"%s\"は型%sに対してはサポートされていません" -#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 +#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 utils/adt/timestamp.c:4744 utils/adt/timestamp.c:4962 utils/adt/timestamp.c:5107 utils/adt/timestamp.c:5306 utils/adt/timestamp.c:5603 utils/adt/timestamp.c:5874 utils/adt/timestamp.c:5915 utils/adt/timestamp.c:6135 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "単位\"%s\"は型%sに対しては認識できません" -#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 utils/adt/formatting.c:4269 utils/adt/formatting.c:4305 utils/adt/formatting.c:4392 utils/adt/formatting.c:4514 utils/adt/json.c:366 utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 -#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 utils/adt/timestamp.c:3266 -#: utils/adt/timestamp.c:3279 utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 -#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2575 utils/adt/xml.c:2582 utils/adt/xml.c:2602 utils/adt/xml.c:2609 +#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 utils/adt/formatting.c:4271 utils/adt/formatting.c:4307 utils/adt/formatting.c:4394 utils/adt/formatting.c:4516 utils/adt/json.c:366 utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 +#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 utils/adt/timestamp.c:3070 utils/adt/timestamp.c:3079 utils/adt/timestamp.c:3096 utils/adt/timestamp.c:3101 utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3133 utils/adt/timestamp.c:3144 utils/adt/timestamp.c:3150 utils/adt/timestamp.c:3156 utils/adt/timestamp.c:3161 utils/adt/timestamp.c:3214 utils/adt/timestamp.c:3223 utils/adt/timestamp.c:3244 utils/adt/timestamp.c:3249 utils/adt/timestamp.c:3270 +#: utils/adt/timestamp.c:3283 utils/adt/timestamp.c:3297 utils/adt/timestamp.c:3305 utils/adt/timestamp.c:3311 utils/adt/timestamp.c:3316 utils/adt/timestamp.c:4384 utils/adt/timestamp.c:4536 utils/adt/timestamp.c:4612 utils/adt/timestamp.c:4648 utils/adt/timestamp.c:4738 utils/adt/timestamp.c:4817 utils/adt/timestamp.c:4853 utils/adt/timestamp.c:4956 utils/adt/timestamp.c:5411 utils/adt/timestamp.c:5685 utils/adt/timestamp.c:6203 utils/adt/timestamp.c:6213 +#: utils/adt/timestamp.c:6218 utils/adt/timestamp.c:6224 utils/adt/timestamp.c:6264 utils/adt/timestamp.c:6351 utils/adt/timestamp.c:6392 utils/adt/timestamp.c:6396 utils/adt/timestamp.c:6450 utils/adt/timestamp.c:6454 utils/adt/timestamp.c:6460 utils/adt/timestamp.c:6501 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:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4597 +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4599 #, c-format msgid "time out of range" msgstr "時刻が範囲外です" @@ -24272,7 +24335,7 @@ msgid "cannot subtract infinite interval from time" msgstr "無限大のintervalのtimeからの減算できません" -#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 utils/adt/float.c:1112 utils/adt/int.c:664 utils/adt/int.c:711 utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2596 utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 utils/adt/timestamp.c:3888 +#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 utils/adt/float.c:1112 utils/adt/int.c:664 utils/adt/int.c:711 utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2602 utils/adt/timestamp.c:3814 utils/adt/timestamp.c:3851 utils/adt/timestamp.c:3892 #, c-format msgid "invalid preceding or following size in window function" msgstr "ウィンドウ関数での不正なサイズの PRECEDING または FOLLOWING 指定" @@ -24282,12 +24345,12 @@ msgid "time zone displacement out of range" msgstr "タイムゾーンの置換が範囲外です" -#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6246 utils/adt/timestamp.c:6483 #, c-format msgid "interval time zone \"%s\" must be finite" msgstr "タイムゾーンのインターバル\"%s\"は有限でなければなりません" -#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6253 utils/adt/timestamp.c:6490 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "intervalによるタイムゾーン\"%s\"には月または日を含めてはいけません" @@ -24442,32 +24505,32 @@ msgid "\"%s\" is out of range for type double precision" msgstr "型double precisionでは\"%s\"は範囲外です" -#: utils/adt/float.c:1247 utils/adt/float.c:1321 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:4594 utils/adt/numeric.c:4599 +#: utils/adt/float.c:1247 utils/adt/float.c:1321 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:4600 utils/adt/numeric.c:4605 #, c-format msgid "smallint out of range" msgstr "smallintの範囲外です" -#: utils/adt/float.c:1447 utils/adt/numeric.c:3710 utils/adt/numeric.c:10113 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3716 utils/adt/numeric.c:10119 #, c-format msgid "cannot take square root of a negative number" msgstr "負の値の平方根を取ることができません" -#: utils/adt/float.c:1515 utils/adt/numeric.c:3998 utils/adt/numeric.c:4110 +#: utils/adt/float.c:1515 utils/adt/numeric.c:4004 utils/adt/numeric.c:4116 #, c-format msgid "zero raised to a negative power is undefined" msgstr "0 の負数乗は定義されていません" -#: utils/adt/float.c:1519 utils/adt/numeric.c:4002 utils/adt/numeric.c:11004 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4008 utils/adt/numeric.c:11010 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "負数を整数でない数でべき乗すると、結果が複雑になります" -#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3910 utils/adt/numeric.c:10784 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3916 utils/adt/numeric.c:10790 #, c-format msgid "cannot take logarithm of zero" msgstr "ゼロの対数を取ることができません" -#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3848 utils/adt/numeric.c:3905 utils/adt/numeric.c:10788 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3854 utils/adt/numeric.c:3911 utils/adt/numeric.c:10794 #, c-format msgid "cannot take logarithm of a negative number" msgstr "負の値の対数を取ることができません" @@ -24477,22 +24540,22 @@ msgid "input is out of range" msgstr "入力が範囲外です" -#: utils/adt/float.c:4000 utils/adt/numeric.c:1858 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1864 #, c-format msgid "count must be greater than zero" msgstr "カウントは0より大きくなければなりません" -#: utils/adt/float.c:4005 utils/adt/numeric.c:1869 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1875 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "オペランド、下限、上限をNaNにすることはできません" -#: utils/adt/float.c:4011 utils/adt/numeric.c:1874 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1880 #, c-format msgid "lower and upper bounds must be finite" msgstr "下限および上限は有限でなければなりません" -#: utils/adt/float.c:4077 utils/adt/numeric.c:1888 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1894 #, c-format msgid "lower bound cannot equal upper bound" msgstr "下限を上限と同じにできません" @@ -24507,247 +24570,247 @@ msgid "Intervals are not tied to specific calendar dates." msgstr "時間間隔が特定の暦日付に結びついていません" -#: utils/adt/formatting.c:1161 +#: utils/adt/formatting.c:1163 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\"は最終パターンでなければなりません。" -#: utils/adt/formatting.c:1169 +#: utils/adt/formatting.c:1171 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1185 +#: utils/adt/formatting.c:1187 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1212 +#: utils/adt/formatting.c:1214 #, c-format msgid "multiple decimal points" msgstr "複数の小数点があります" -#: utils/adt/formatting.c:1216 utils/adt/formatting.c:1299 +#: utils/adt/formatting.c:1218 utils/adt/formatting.c:1301 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "\"V\"と小数点を混在できません" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1230 #, c-format msgid "cannot use \"S\" twice" msgstr "\"S\"は1回しか使用できません" -#: utils/adt/formatting.c:1232 +#: utils/adt/formatting.c:1234 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "\"S\"と\"PL\"/\"MI\"/\"SG\"/\"PR\"を混在できません" -#: utils/adt/formatting.c:1252 +#: utils/adt/formatting.c:1254 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "\"S\"と\"MI\"を混在できません" -#: utils/adt/formatting.c:1262 +#: utils/adt/formatting.c:1264 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "\"S\"と\"PL\"を混在できません" -#: utils/adt/formatting.c:1272 +#: utils/adt/formatting.c:1274 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "\"S\"と\"SG\"を混在できません" -#: utils/adt/formatting.c:1281 +#: utils/adt/formatting.c:1283 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "\"PR\"と\"S\"/\"PL\"/\"MI\"/\"SG\"を混在できません" -#: utils/adt/formatting.c:1307 +#: utils/adt/formatting.c:1309 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "\"EEEE\"は1回しか使用できません" -#: utils/adt/formatting.c:1313 +#: utils/adt/formatting.c:1315 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\"が他のフォーマットと互換性がありません" -#: utils/adt/formatting.c:1314 +#: utils/adt/formatting.c:1316 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\"は数値および小数点パターンと共にのみ使用できます。" -#: utils/adt/formatting.c:1398 +#: utils/adt/formatting.c:1400 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "不正なdatetime書式のセパレータ: \"%s\"" -#: utils/adt/formatting.c:1525 +#: utils/adt/formatting.c:1527 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\"は数値ではありません" -#: utils/adt/formatting.c:1603 +#: utils/adt/formatting.c:1605 #, c-format msgid "case conversion failed: %s" msgstr "文字ケースの変換に失敗しました: %s" -#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 utils/adt/formatting.c:1989 +#: utils/adt/formatting.c:1653 utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 #, c-format msgid "could not determine which collation to use for %s function" msgstr "%s 関数に対して使用する照合順序を特定できませんでした" -#: utils/adt/formatting.c:2410 +#: utils/adt/formatting.c:2412 #, c-format msgid "invalid combination of date conventions" msgstr "不正な暦法の組み合わせ" -#: utils/adt/formatting.c:2411 +#: utils/adt/formatting.c:2413 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "単一の書式テンプレートの中では、グレゴリオ暦とISO歴週日付を混在させないでください。" -#: utils/adt/formatting.c:2433 +#: utils/adt/formatting.c:2435 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "書式文字列中で\"%s\"フィールドの値が衝突しています" -#: utils/adt/formatting.c:2435 +#: utils/adt/formatting.c:2437 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "この値は同じフィールド型に対する以前の設定と矛盾しています" -#: utils/adt/formatting.c:2502 +#: utils/adt/formatting.c:2504 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "書式フィールド\"%s\"に対して元の文字列が短すぎます" -#: utils/adt/formatting.c:2504 +#: utils/adt/formatting.c:2506 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "フィールドには%d文字必要ですが、%d文字しか残っていません。" -#: utils/adt/formatting.c:2506 utils/adt/formatting.c:2520 +#: utils/adt/formatting.c:2508 utils/adt/formatting.c:2522 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "元の文字列が固定長でない場合は、修飾子\"FM\"を試してみてください。" -#: utils/adt/formatting.c:2516 utils/adt/formatting.c:2529 utils/adt/formatting.c:2750 utils/adt/formatting.c:3650 +#: utils/adt/formatting.c:2518 utils/adt/formatting.c:2531 utils/adt/formatting.c:2752 utils/adt/formatting.c:3652 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "\"%2$s\"に対する不正な値\"%1$s\"" -#: utils/adt/formatting.c:2518 +#: utils/adt/formatting.c:2520 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "このフィールドには%d文字必要ですが、%d文字しかパースされませんでした。" -#: utils/adt/formatting.c:2531 +#: utils/adt/formatting.c:2533 #, c-format msgid "Value must be an integer." msgstr "値は整数でなければなりません。" -#: utils/adt/formatting.c:2536 +#: utils/adt/formatting.c:2538 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "もとの文字列において\"%s\"に対応する値が範囲外です" -#: utils/adt/formatting.c:2538 +#: utils/adt/formatting.c:2540 #, c-format msgid "Value must be in the range %d to %d." msgstr "値は%dから%dまでの範囲でなければなりません。" -#: utils/adt/formatting.c:2752 +#: utils/adt/formatting.c:2754 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "与えられた値がこの項目に対して許されるいずれの値ともマッチしません。" -#: utils/adt/formatting.c:2968 utils/adt/formatting.c:2988 utils/adt/formatting.c:3008 utils/adt/formatting.c:3028 utils/adt/formatting.c:3047 utils/adt/formatting.c:3066 utils/adt/formatting.c:3090 utils/adt/formatting.c:3108 utils/adt/formatting.c:3126 utils/adt/formatting.c:3144 utils/adt/formatting.c:3161 utils/adt/formatting.c:3178 +#: utils/adt/formatting.c:2970 utils/adt/formatting.c:2990 utils/adt/formatting.c:3010 utils/adt/formatting.c:3030 utils/adt/formatting.c:3049 utils/adt/formatting.c:3068 utils/adt/formatting.c:3092 utils/adt/formatting.c:3110 utils/adt/formatting.c:3128 utils/adt/formatting.c:3146 utils/adt/formatting.c:3163 utils/adt/formatting.c:3180 #, c-format msgid "localized string format value too long" msgstr "地域化した文字列のフォーマットが長すぎます" -#: utils/adt/formatting.c:3458 +#: utils/adt/formatting.c:3460 #, c-format msgid "unmatched format separator \"%c\"" msgstr "合致しないフォーマットセパレータ \"%c\"" -#: utils/adt/formatting.c:3519 +#: utils/adt/formatting.c:3521 #, c-format msgid "unmatched format character \"%s\"" msgstr "合致しないフォーマット文字\"%s\"" -#: utils/adt/formatting.c:3652 +#: utils/adt/formatting.c:3654 #, c-format msgid "Time zone abbreviation is not recognized." msgstr "タイムゾーン省略名が認識されません。" -#: utils/adt/formatting.c:3853 +#: utils/adt/formatting.c:3855 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr " \"Y,YYY\"に対応する入力文字列が不正です" -#: utils/adt/formatting.c:3942 +#: utils/adt/formatting.c:3944 #, c-format msgid "input string is too short for datetime format" msgstr "datetime書式に対して入力文字列が短すぎます" -#: utils/adt/formatting.c:3950 +#: utils/adt/formatting.c:3952 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "datetimeフォーマット後に文字が入力文字列中に残っています" -#: utils/adt/formatting.c:4494 +#: utils/adt/formatting.c:4496 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "timestamptz型に対応する入力に時間帯がありません" -#: utils/adt/formatting.c:4500 +#: utils/adt/formatting.c:4502 #, c-format msgid "timestamptz out of range" msgstr "timestamptzの範囲外です" -#: utils/adt/formatting.c:4528 +#: utils/adt/formatting.c:4530 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetimeフォーマットで時間帯は指定されていますが、時刻が指定されていません" -#: utils/adt/formatting.c:4577 +#: utils/adt/formatting.c:4579 #, c-format msgid "missing time zone in input string for type timetz" msgstr "timetz型に対する入力文字列中に時間帯がありません" -#: utils/adt/formatting.c:4583 +#: utils/adt/formatting.c:4585 #, c-format msgid "timetz out of range" msgstr "timetzの範囲外です" -#: utils/adt/formatting.c:4609 +#: utils/adt/formatting.c:4611 #, c-format msgid "datetime format is not dated and not timed" msgstr "datetimeフォーマットで日付は指定されていますが、時間が指定されていません" -#: utils/adt/formatting.c:4786 +#: utils/adt/formatting.c:4788 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "12時間形式では\"%d\"時は不正です" -#: utils/adt/formatting.c:4788 +#: utils/adt/formatting.c:4790 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "24時間形式を使うか、もしくは 1 から 12 の間で指定してください。" -#: utils/adt/formatting.c:4900 +#: utils/adt/formatting.c:4902 #, c-format msgid "cannot calculate day of year without year information" msgstr "年の情報なしでは年内の日数は計算できません" -#: utils/adt/formatting.c:5854 +#: utils/adt/formatting.c:5867 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\"は入力としてサポートしていません" -#: utils/adt/formatting.c:5866 +#: utils/adt/formatting.c:5879 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\"は入力としてサポートしていません" @@ -24837,13 +24900,13 @@ msgid "invalid int2vector data" msgstr "不正なint2vectorデータ" -#: utils/adt/int.c:1558 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 +#: utils/adt/int.c:1558 utils/adt/int8.c:1403 utils/adt/numeric.c:1771 utils/adt/timestamp.c:6550 utils/adt/timestamp.c:6636 #, 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:4543 utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 utils/adt/varbit.c:1676 +#: 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:4549 utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigintの範囲外です" @@ -25271,7 +25334,7 @@ msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" msgstr "NaNとInifinityはjsonpath項目メソッド .%s() では使用できません" -#: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 +#: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1581 #, c-format msgid "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "jsonpath 項目メソッド .%s() は文字列または数値にのみ適用可能です" @@ -25291,142 +25354,142 @@ msgid "jsonpath item method .%s() can only be applied to a boolean, string, or numeric value" msgstr "jsonpath 項目メソッド .%s() は真偽値、文字列または数値にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1528 +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1517 #, c-format msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" msgstr "jsonpath項目メソッド .%2$s() の引数\"%1$s\"がnumeric型に適合しません" -#: utils/adt/jsonpath_exec.c:1487 +#: utils/adt/jsonpath_exec.c:1483 #, 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:1501 +#: utils/adt/jsonpath_exec.c:1497 #, 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:1561 utils/adt/jsonpath_exec.c:1585 +#: utils/adt/jsonpath_exec.c:1549 utils/adt/jsonpath_exec.c:1573 #, c-format msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" msgstr "jsonpath項目メソッド .%2$s() の引数\"%1$s\"がinteger型に適合しません" -#: utils/adt/jsonpath_exec.c:1648 +#: utils/adt/jsonpath_exec.c:1636 #, 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:2137 +#: utils/adt/jsonpath_exec.c:2125 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "jsonpath演算子 %s の左辺値が単一の数値ではありません" -#: utils/adt/jsonpath_exec.c:2144 +#: utils/adt/jsonpath_exec.c:2132 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "jsonpath演算子 %s の右辺値が単一の数値ではありません" -#: utils/adt/jsonpath_exec.c:2212 +#: utils/adt/jsonpath_exec.c:2200 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "単項jsonpath演算子 %s のオペランドが数値ではありません" -#: utils/adt/jsonpath_exec.c:2311 +#: utils/adt/jsonpath_exec.c:2299 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "jsonpath 項目メソッド .%s() は数値にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:2357 +#: utils/adt/jsonpath_exec.c:2345 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "jsonpath 項目メソッド .%s() は文字列にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:2450 +#: utils/adt/jsonpath_exec.c:2438 #, 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:2484 utils/adt/jsonpath_exec.c:2490 utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 utils/adt/jsonpath_exec.c:2720 +#: utils/adt/jsonpath_exec.c:2472 utils/adt/jsonpath_exec.c:2478 utils/adt/jsonpath_exec.c:2505 utils/adt/jsonpath_exec.c:2533 utils/adt/jsonpath_exec.c:2586 utils/adt/jsonpath_exec.c:2637 utils/adt/jsonpath_exec.c:2708 #, c-format msgid "%s format is not recognized: \"%s\"" msgstr "%sの書式を認識できません: \"%s\"" -#: utils/adt/jsonpath_exec.c:2486 +#: utils/adt/jsonpath_exec.c:2474 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "datetimeテンプレート引数を使って入力データフォーマットを指定してください。" -#: utils/adt/jsonpath_exec.c:2679 utils/adt/jsonpath_exec.c:2760 +#: utils/adt/jsonpath_exec.c:2667 utils/adt/jsonpath_exec.c:2748 #, c-format msgid "time precision of jsonpath item method .%s() is invalid" msgstr "jsonpath項目メソッド .%s() の日付時刻精度が不正です" -#: utils/adt/jsonpath_exec.c:2840 +#: utils/adt/jsonpath_exec.c:2828 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "jsonpath項目メソッド .%s() はオブジェクトに対してのみ適用可能です" -#: utils/adt/jsonpath_exec.c:3124 +#: utils/adt/jsonpath_exec.c:3112 #, c-format msgid "could not convert value of type %s to jsonpath" msgstr "型%sの値のjsonpathへ変換ができませんでした" -#: utils/adt/jsonpath_exec.c:3158 +#: utils/adt/jsonpath_exec.c:3146 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "jsonpath変数\"%s\"が見つかりませんでした" -#: utils/adt/jsonpath_exec.c:3211 +#: utils/adt/jsonpath_exec.c:3199 #, c-format msgid "\"vars\" argument is not an object" msgstr "引数\"vars\"がオブジェクトではありません" -#: utils/adt/jsonpath_exec.c:3212 +#: utils/adt/jsonpath_exec.c:3200 #, 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:3475 +#: utils/adt/jsonpath_exec.c:3463 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "jsonpath配列添え字が単一の数値ではありません" -#: utils/adt/jsonpath_exec.c:3487 +#: utils/adt/jsonpath_exec.c:3475 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "jsonpath配列の添え字が整数の範囲外です" -#: utils/adt/jsonpath_exec.c:3671 +#: utils/adt/jsonpath_exec.c:3659 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "時間帯を使用せずに%sから%sへの値の変換はできません" -#: utils/adt/jsonpath_exec.c:3673 +#: utils/adt/jsonpath_exec.c:3661 #, c-format msgid "Use *_tz() function for time zone support." msgstr "*_tz() 関数を使用することで時間帯がサポートされます。" -#: utils/adt/jsonpath_exec.c:3981 +#: utils/adt/jsonpath_exec.c:3969 #, 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:3983 utils/adt/jsonpath_exec.c:3988 +#: utils/adt/jsonpath_exec.c:3971 utils/adt/jsonpath_exec.c:3976 #, 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:3987 +#: utils/adt/jsonpath_exec.c:3975 #, 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:4045 utils/adt/jsonpath_exec.c:4069 +#: utils/adt/jsonpath_exec.c:4033 utils/adt/jsonpath_exec.c:4057 #, c-format msgid "JSON path expression for column \"%s\" must return single scalar item" msgstr "列\"%s\"に対するJSONパス式は単一のスカラー要素を返却する必要があります" -#: utils/adt/jsonpath_exec.c:4050 utils/adt/jsonpath_exec.c:4074 +#: utils/adt/jsonpath_exec.c:4038 utils/adt/jsonpath_exec.c:4062 #, c-format msgid "JSON path expression in JSON_VALUE must return single scalar item" msgstr "JSON_VALUE中のJSONパス式は単一のスカラー要素を返却する必要があります" @@ -25585,12 +25648,12 @@ 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の要素を持てません" @@ -25668,7 +25731,7 @@ msgid "cannot subtract inet values of different sizes" msgstr "サイズが異なるinet値の引き算はできません" -#: utils/adt/numeric.c:793 utils/adt/numeric.c:3660 utils/adt/numeric.c:7217 utils/adt/numeric.c:7420 utils/adt/numeric.c:7892 utils/adt/numeric.c:10587 utils/adt/numeric.c:11062 utils/adt/numeric.c:11156 utils/adt/numeric.c:11291 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3666 utils/adt/numeric.c:7223 utils/adt/numeric.c:7426 utils/adt/numeric.c:7898 utils/adt/numeric.c:10593 utils/adt/numeric.c:11068 utils/adt/numeric.c:11162 utils/adt/numeric.c:11297 #, c-format msgid "value overflows numeric format" msgstr "値がnumericの形式でオーバフローします" @@ -25688,107 +25751,107 @@ msgid "invalid digit in external \"numeric\" value" msgstr "外部\"numeric\"の値の桁が不正です" -#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 +#: utils/adt/numeric.c:1333 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "NUMERICの精度%dは1から%dまででなければなりません" -#: utils/adt/numeric.c:1341 +#: utils/adt/numeric.c:1338 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "NUMERICの位取り%dは%dから%dまでの間でなければなりません" -#: utils/adt/numeric.c:1359 +#: utils/adt/numeric.c:1365 #, c-format msgid "invalid NUMERIC type modifier" msgstr "不正なNUMERIC型の修正子" -#: utils/adt/numeric.c:1725 +#: utils/adt/numeric.c:1731 #, c-format msgid "start value cannot be NaN" msgstr "開始値はNaNにはできません" -#: utils/adt/numeric.c:1729 +#: utils/adt/numeric.c:1735 #, c-format msgid "start value cannot be infinity" msgstr "開始値は無限大にはできません" -#: utils/adt/numeric.c:1736 +#: utils/adt/numeric.c:1742 #, c-format msgid "stop value cannot be NaN" msgstr "終了値はNaNにはできません" -#: utils/adt/numeric.c:1740 +#: utils/adt/numeric.c:1746 #, c-format msgid "stop value cannot be infinity" msgstr "終了値は無限大にはできません" -#: utils/adt/numeric.c:1753 +#: utils/adt/numeric.c:1759 #, c-format msgid "step size cannot be NaN" msgstr "加算量はNaNにはできません" -#: utils/adt/numeric.c:1757 +#: utils/adt/numeric.c:1763 #, c-format msgid "step size cannot be infinity" msgstr "加算量は無限大にはできません" -#: utils/adt/numeric.c:3650 +#: utils/adt/numeric.c:3656 #, c-format msgid "factorial of a negative number is undefined" msgstr "負数の階乗は定義されていません" -#: utils/adt/numeric.c:4257 +#: utils/adt/numeric.c:4263 #, c-format msgid "lower bound cannot be NaN" msgstr "下限をNaNにすることはできません" -#: utils/adt/numeric.c:4261 +#: utils/adt/numeric.c:4267 #, c-format msgid "lower bound cannot be infinity" msgstr "下限を無限値にすることはできません" -#: utils/adt/numeric.c:4268 +#: utils/adt/numeric.c:4274 #, c-format msgid "upper bound cannot be NaN" msgstr "上限をNaNにすることはできません" -#: utils/adt/numeric.c:4272 +#: utils/adt/numeric.c:4278 #, c-format msgid "upper bound cannot be infinity" msgstr "上限を無限値にすることはできません" -#: utils/adt/numeric.c:4433 utils/adt/numeric.c:4521 utils/adt/numeric.c:4581 utils/adt/numeric.c:4777 +#: utils/adt/numeric.c:4439 utils/adt/numeric.c:4527 utils/adt/numeric.c:4587 utils/adt/numeric.c:4783 #, c-format msgid "cannot convert NaN to %s" msgstr "NaNを%sには変換できません" -#: utils/adt/numeric.c:4437 utils/adt/numeric.c:4525 utils/adt/numeric.c:4585 utils/adt/numeric.c:4781 +#: utils/adt/numeric.c:4443 utils/adt/numeric.c:4531 utils/adt/numeric.c:4591 utils/adt/numeric.c:4787 #, c-format msgid "cannot convert infinity to %s" msgstr "無限大を%sに変換できません" -#: utils/adt/numeric.c:4790 +#: utils/adt/numeric.c:4796 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsnの範囲外です" -#: utils/adt/numeric.c:7982 utils/adt/numeric.c:8033 +#: utils/adt/numeric.c:7988 utils/adt/numeric.c:8039 #, c-format msgid "numeric field overflow" msgstr "numericフィールドのオーバーフロー" -#: utils/adt/numeric.c:7983 +#: utils/adt/numeric.c:7989 #, 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:8034 +#: utils/adt/numeric.c:8040 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "精度%d、位取り%dを持つフィールドは、無限大値を格納できません。" -#: utils/adt/numeric.c:11360 utils/adt/pseudorandomfuncs.c:135 utils/adt/pseudorandomfuncs.c:159 +#: utils/adt/numeric.c:11366 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 "下限は上限と同じあるいはより小さい必要があります" @@ -25838,137 +25901,137 @@ msgid "locale name \"%s\" contains non-ASCII characters" msgstr "ロケール名\"%s\"は不正な非ASCII文字を含んでいます" -#: utils/adt/pg_locale.c:1510 +#: utils/adt/pg_locale.c:1518 #, c-format msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" msgstr "ルール\"%2$s\"を持つロケール\"%1$s\"の照合器をオープンできませんでした: %3$s" -#: utils/adt/pg_locale.c:1521 utils/adt/pg_locale.c:2995 utils/adt/pg_locale.c:3068 +#: utils/adt/pg_locale.c:1532 utils/adt/pg_locale.c:3011 utils/adt/pg_locale.c:3084 #, c-format msgid "ICU is not supported in this build" msgstr "このビルドではICUはサポートされていません" -#: utils/adt/pg_locale.c:1549 +#: utils/adt/pg_locale.c:1560 #, c-format msgid "could not create locale \"%s\": %m" msgstr "ロケール\"%s\"を作成できませんでした: %m" -#: utils/adt/pg_locale.c:1552 +#: utils/adt/pg_locale.c:1563 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "オペレーティングシステムはロケール名\"%s\"のロケールデータを見つけられませんでした。" -#: utils/adt/pg_locale.c:1673 +#: utils/adt/pg_locale.c:1688 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "このプラットフォームでは値が異なるcollateとctypeによる照合順序をサポートしていません" -#: utils/adt/pg_locale.c:1720 +#: utils/adt/pg_locale.c:1735 #, c-format msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "照合順序\"%s\"には実際のバージョンがありませんが、バージョンが記録されています" -#: utils/adt/pg_locale.c:1726 +#: utils/adt/pg_locale.c:1741 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "照合順序\"%s\"でバージョンの不一致が起きています" -#: utils/adt/pg_locale.c:1728 +#: utils/adt/pg_locale.c:1743 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "データベース中の照合順序はバージョン%sで作成されていますが、オペレーティングシステムはバージョン%sを提供しています。" -#: utils/adt/pg_locale.c:1731 +#: utils/adt/pg_locale.c:1746 #, c-format 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:1775 utils/adt/pg_locale.c:2559 utils/adt/pg_locale.c:2584 +#: utils/adt/pg_locale.c:1790 utils/adt/pg_locale.c:2572 utils/adt/pg_locale.c:2597 #, c-format msgid "invalid locale name \"%s\" for builtin provider" msgstr "ロケール名\"%s\"は組み込みプロバイダでは不正です" -#: utils/adt/pg_locale.c:1817 +#: utils/adt/pg_locale.c:1832 #, c-format msgid "could not load locale \"%s\"" msgstr "ロケール\"%s\"をロードできませんでした" -#: utils/adt/pg_locale.c:1842 +#: utils/adt/pg_locale.c:1857 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "ロケール\"%s\"に対応する照合順序バージョンを取得できませんでした: エラーコード %lu" -#: utils/adt/pg_locale.c:1898 utils/adt/pg_locale.c:1911 +#: utils/adt/pg_locale.c:1922 utils/adt/pg_locale.c:1935 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "文字列をUTF-16に変換できませんでした: エラーコード %lu" -#: utils/adt/pg_locale.c:1923 +#: utils/adt/pg_locale.c:1947 #, c-format msgid "could not compare Unicode strings: %m" msgstr "Unicode文字列を比較できませんでした: %m" -#: utils/adt/pg_locale.c:2097 +#: utils/adt/pg_locale.c:2119 #, c-format msgid "collation failed: %s" msgstr "照合順序による比較に失敗しました: %s" -#: utils/adt/pg_locale.c:2316 utils/adt/pg_locale.c:2348 +#: utils/adt/pg_locale.c:2326 utils/adt/pg_locale.c:2361 #, c-format msgid "sort key generation failed: %s" msgstr "ソートキーの生成に失敗しました: %s" -#: utils/adt/pg_locale.c:2638 +#: utils/adt/pg_locale.c:2651 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "ロケール\"%s\"から言語を取得できませんでした: %s" -#: utils/adt/pg_locale.c:2659 utils/adt/pg_locale.c:2675 +#: utils/adt/pg_locale.c:2672 utils/adt/pg_locale.c:2688 #, c-format msgid "could not open collator for locale \"%s\": %s" msgstr "ロケール\"%s\"の照合器をオープンできませんでした: %s" -#: utils/adt/pg_locale.c:2700 +#: utils/adt/pg_locale.c:2713 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "エンコーディング\"%s\"はICUではサポートされていません" -#: utils/adt/pg_locale.c:2707 +#: utils/adt/pg_locale.c:2720 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "エンコーディング\"%s\"のICU変換器をオープンできませんでした: %s" -#: utils/adt/pg_locale.c:2725 utils/adt/pg_locale.c:2744 utils/adt/pg_locale.c:2800 utils/adt/pg_locale.c:2811 +#: utils/adt/pg_locale.c:2742 utils/adt/pg_locale.c:2760 utils/adt/pg_locale.c:2816 utils/adt/pg_locale.c:2827 #, c-format msgid "%s failed: %s" msgstr "%s が失敗しました: %s" -#: utils/adt/pg_locale.c:2986 +#: utils/adt/pg_locale.c:3002 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "ロケール名\"%s\"を、言語タグに変換できませんでした: %s" -#: utils/adt/pg_locale.c:3027 +#: utils/adt/pg_locale.c:3043 #, c-format msgid "could not get language from ICU locale \"%s\": %s" msgstr "ICUロケール\"%s\"から言語を取得できませんでした: %s" -#: utils/adt/pg_locale.c:3029 utils/adt/pg_locale.c:3058 +#: utils/adt/pg_locale.c:3045 utils/adt/pg_locale.c:3074 #, c-format msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." msgstr "ICUロケールを無効にするには、パラメータ\"%s\"を\"%s\"に設定してください。" -#: utils/adt/pg_locale.c:3056 +#: utils/adt/pg_locale.c:3072 #, c-format msgid "ICU locale \"%s\" has unknown language \"%s\"" msgstr "ICUロケール\"%s\"には未知の言語\"%s\"が含まれています" -#: utils/adt/pg_locale.c:3207 +#: utils/adt/pg_locale.c:3223 #, c-format msgid "invalid multibyte character for locale" msgstr "ロケールに対する不正なマルチバイト文字" -#: utils/adt/pg_locale.c:3208 +#: utils/adt/pg_locale.c:3224 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "おそらくサーバーのLC_CTYPEロケールはデータベースの符号化方式と互換性がありません" @@ -25993,17 +26056,17 @@ msgid "invalid command name: \"%s\"" msgstr "不正なコマンド名: \"%s\"" -#: utils/adt/pgstatfuncs.c:1739 +#: utils/adt/pgstatfuncs.c:1751 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "認識できないリセットターゲット: \"%s\"" -#: utils/adt/pgstatfuncs.c:1740 +#: utils/adt/pgstatfuncs.c:1752 #, 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:1822 +#: utils/adt/pgstatfuncs.c:1834 #, c-format msgid "invalid subscription OID %u" msgstr "不正なサブスクリプションOID %u" @@ -26088,7 +26151,7 @@ msgid "Junk after right parenthesis or bracket." msgstr "右括弧または右角括弧の後にごみがあります" -#: utils/adt/regexp.c:304 utils/adt/regexp.c:2068 utils/adt/varlena.c:4280 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:2068 utils/adt/varlena.c:4318 #, c-format msgid "regular expression failed: %s" msgstr "正規表現が失敗しました: %s" @@ -26149,7 +26212,7 @@ 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:3420 utils/adt/varlena.c:3425 +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 utils/adt/regproc.c:1815 utils/adt/varlena.c:3458 utils/adt/varlena.c:3463 #, c-format msgid "invalid name syntax" msgstr "不正な名前の構文" @@ -26364,8 +26427,8 @@ msgid "timestamp out of range: \"%g\"" msgstr "timestampが範囲外です: \"%g\"" -#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 utils/adt/timestamp.c:3537 -#: utils/adt/timestamp.c:3546 utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 utils/adt/timestamp.c:5097 +#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 utils/adt/timestamp.c:2811 utils/adt/timestamp.c:2820 utils/adt/timestamp.c:2835 utils/adt/timestamp.c:2909 utils/adt/timestamp.c:2926 utils/adt/timestamp.c:2983 utils/adt/timestamp.c:3026 utils/adt/timestamp.c:3404 utils/adt/timestamp.c:3462 utils/adt/timestamp.c:3485 utils/adt/timestamp.c:3494 utils/adt/timestamp.c:3518 utils/adt/timestamp.c:3541 +#: utils/adt/timestamp.c:3550 utils/adt/timestamp.c:3685 utils/adt/timestamp.c:3786 utils/adt/timestamp.c:4193 utils/adt/timestamp.c:4230 utils/adt/timestamp.c:4278 utils/adt/timestamp.c:4287 utils/adt/timestamp.c:4379 utils/adt/timestamp.c:4426 utils/adt/timestamp.c:4435 utils/adt/timestamp.c:4531 utils/adt/timestamp.c:4584 utils/adt/timestamp.c:4594 utils/adt/timestamp.c:4789 utils/adt/timestamp.c:4799 utils/adt/timestamp.c:5101 #, c-format msgid "interval out of range" msgstr "intervalが範囲外です" @@ -26390,32 +26453,32 @@ msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d)の精度は%dから%dまででなければなりません" -#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 +#: utils/adt/timestamp.c:4568 utils/adt/timestamp.c:4773 #, c-format msgid "origin out of range" msgstr "基点が範囲外です" -#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#: utils/adt/timestamp.c:4573 utils/adt/timestamp.c:4778 #, c-format msgid "timestamps cannot be binned into infinite intervals" msgstr "タイムスタンプは無限のintervalにビニングすることはできません" -#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 +#: utils/adt/timestamp.c:4578 utils/adt/timestamp.c:4783 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "タイムスタンプ型は月や年を含む間隔にビニングすることはできません" -#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 +#: utils/adt/timestamp.c:4589 utils/adt/timestamp.c:4794 #, c-format msgid "stride must be greater than zero" msgstr "増分は0より大きくなければなりません" -#: utils/adt/timestamp.c:5091 +#: utils/adt/timestamp.c:5095 #, c-format msgid "Months usually have fractional weeks." msgstr "月は通常週の端数を含んでいます。" -#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#: utils/adt/timestamp.c:6555 utils/adt/timestamp.c:6641 #, c-format msgid "step size cannot be infinite" msgstr "加算量は無限にはできません" @@ -26520,62 +26583,67 @@ 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\"は文字型ではありません" @@ -26640,7 +26708,7 @@ 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:914 utils/adt/varlena.c:978 utils/adt/varlena.c:1136 utils/adt/varlena.c:3062 utils/adt/varlena.c:3140 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:915 utils/adt/varlena.c:979 utils/adt/varlena.c:1174 utils/adt/varlena.c:3100 utils/adt/varlena.c:3178 #, c-format msgid "negative substring length not allowed" msgstr "負の長さのsubstringは許可されません" @@ -26665,7 +26733,7 @@ msgid "bit index %d out of valid range (0..%d)" msgstr "ビットのインデックス%dが有効範囲0..%dの間にありません" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3344 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3382 #, c-format msgid "new bit must be 0 or 1" msgstr "新しいビットは0か1でなければなりません" @@ -26680,92 +26748,92 @@ msgid "value too long for type character varying(%d)" msgstr "値は型character varying(%d)としては長すぎます" -#: utils/adt/varchar.c:737 utils/adt/varlena.c:1527 +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1565 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "文字列比較で使用する照合順序を特定できませんでした" -#: utils/adt/varlena.c:1235 utils/adt/varlena.c:1816 +#: utils/adt/varlena.c:1273 utils/adt/varlena.c:1854 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "非決定的照合順序は部分文字列探索ではサポートされません" -#: utils/adt/varlena.c:3228 utils/adt/varlena.c:3295 +#: utils/adt/varlena.c:3266 utils/adt/varlena.c:3333 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "インデックス%dは有効範囲0..%dの間にありません" -#: utils/adt/varlena.c:3259 utils/adt/varlena.c:3331 +#: utils/adt/varlena.c:3297 utils/adt/varlena.c:3369 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "インデックス%lldは有効範囲0..%lldの間にありません" -#: utils/adt/varlena.c:4392 +#: utils/adt/varlena.c:4430 #, c-format msgid "field position must not be zero" msgstr "フィールド位置には0は指定できません" -#: utils/adt/varlena.c:5640 +#: utils/adt/varlena.c:5678 #, c-format msgid "unterminated format() type specifier" msgstr "終端されていないformat()型指定子" -#: utils/adt/varlena.c:5641 utils/adt/varlena.c:5775 utils/adt/varlena.c:5896 +#: utils/adt/varlena.c:5679 utils/adt/varlena.c:5813 utils/adt/varlena.c:5934 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "一つの\"%%\"には\"%%%%\"を使ってください。" -#: utils/adt/varlena.c:5773 utils/adt/varlena.c:5894 +#: utils/adt/varlena.c:5811 utils/adt/varlena.c:5932 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "認識できない format() の型指定子\"%.*s\"" -#: utils/adt/varlena.c:5786 utils/adt/varlena.c:5843 +#: utils/adt/varlena.c:5824 utils/adt/varlena.c:5881 #, c-format msgid "too few arguments for format()" msgstr "format()の引数が少なすぎます" -#: utils/adt/varlena.c:5939 utils/adt/varlena.c:6121 +#: utils/adt/varlena.c:5977 utils/adt/varlena.c:6159 #, c-format msgid "number is out of range" msgstr "数値が範囲外です" -#: utils/adt/varlena.c:6002 utils/adt/varlena.c:6030 +#: utils/adt/varlena.c:6040 utils/adt/varlena.c:6068 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "書式は引数0を指定していますが、引数が1から始まっています" -#: utils/adt/varlena.c:6023 +#: utils/adt/varlena.c:6061 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "width引数の位置は\"$\"で終わらなければなりません" -#: utils/adt/varlena.c:6068 +#: utils/adt/varlena.c:6106 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "NULLはSQL識別子として書式付けできません" -#: utils/adt/varlena.c:6276 +#: utils/adt/varlena.c:6314 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Unicode正規化はサーバーエンコーディングがUTF-8の場合にのみ実行されます" -#: utils/adt/varlena.c:6289 +#: utils/adt/varlena.c:6327 #, c-format msgid "invalid normalization form: %s" msgstr "不正な正規化形式: %s" -#: utils/adt/varlena.c:6334 +#: utils/adt/varlena.c:6372 #, c-format msgid "Unicode categorization can only be performed if server encoding is UTF8" msgstr "Unicodeカテゴリー分類はサーバーエンコーディングがUTF-8の場合にのみ実行可能です" -#: utils/adt/varlena.c:6551 utils/adt/varlena.c:6586 utils/adt/varlena.c:6621 +#: utils/adt/varlena.c:6589 utils/adt/varlena.c:6624 utils/adt/varlena.c:6659 #, c-format msgid "invalid Unicode code point: %04X" msgstr "不正なUnicodeコードポイント: %04X" -#: utils/adt/varlena.c:6651 +#: utils/adt/varlena.c:6689 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Unicodeエスケープは \\XXXX、\\+XXXXXX、\\uXXXX または \\UXXXXXXXX でなければなりません。" @@ -26904,67 +26972,67 @@ 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つ以上の値を返却しました" -#: utils/cache/lsyscache.c:1017 +#: utils/cache/lsyscache.c:1116 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "型%sから型%sへのキャストは存在しません" -#: utils/cache/lsyscache.c:2887 utils/cache/lsyscache.c:2920 utils/cache/lsyscache.c:2953 utils/cache/lsyscache.c:2986 +#: utils/cache/lsyscache.c:3000 utils/cache/lsyscache.c:3033 utils/cache/lsyscache.c:3066 utils/cache/lsyscache.c:3099 #, c-format msgid "type %s is only a shell" msgstr "型%sは単なるシェルです" -#: utils/cache/lsyscache.c:2892 +#: utils/cache/lsyscache.c:3005 #, c-format msgid "no input function available for type %s" msgstr "型%sの利用可能な入力関数がありません" -#: utils/cache/lsyscache.c:2925 +#: utils/cache/lsyscache.c:3038 #, c-format msgid "no output function available for type %s" msgstr "型%sの利用可能な出力関数がありません" @@ -27019,7 +27087,7 @@ msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "リレーションマッピングファイル\"%s\"の中に不正なチェックサムがあります" -#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 +#: utils/cache/typcache.c:1805 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "レコード型は登録されていません" @@ -27665,17 +27733,17 @@ 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\"で等価な文字を持ちません" @@ -30113,16 +30181,26 @@ msgid "could not attach to dynamic shared area" msgstr "動的共有エリアをアタッチできませんでした" -#: utils/mmgr/mcxt.c:1158 +#: utils/mmgr/mcxt.c:1161 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "メモリコンテクスト\"%2$s\"でサイズ%1$zuの要求が失敗しました。" -#: utils/mmgr/mcxt.c:1314 +#: utils/mmgr/mcxt.c:1317 #, c-format msgid "logging memory contexts of PID %d" msgstr "PID %dのメモリコンテクストを記録します" +#: utils/mmgr/mcxt.c:1683 +#, c-format +msgid "invalid memory allocation request size %zu + %zu" +msgstr "メモリ割り当て要求サイズ %zu + %zu が不正です" + +#: utils/mmgr/mcxt.c:1702 +#, 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" @@ -30193,7 +30271,7 @@ msgid "Duplicate keys exist." msgstr "重複したキーが存在します。" -#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 utils/sort/tuplestore.c:1330 +#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 utils/sort/tuplestore.c:1268 utils/sort/tuplestore.c:1333 utils/sort/tuplestore.c:1342 #, c-format msgid "could not seek in tuplestore temporary file" msgstr "タプルストア一時ファイルのシークに失敗しました" @@ -30251,9 +30329,15 @@ #~ msgid "\"%s\" is not a physical replication slot" #~ msgstr "\"%s\"は物理レプリケーションスロットではありません。" +#~ msgid "aborting startup due to startup process failure" +#~ msgstr "起動プロセスの失敗のため起動を中断しています" + #~ msgid "cannot create statistics on the specified relation" #~ msgstr "指定されたリレーションでは統計情報を生成できません" +#~ msgid "cannot synchronize replication slots when standby promotion is ongoing" +#~ msgstr "スタンバイの昇格処理中はリプリケーションスロットの同期はできません" + #~ msgid "replication origin \"%s\" already exists" #~ msgstr "レプリケーション基点\"%s\"はすでに存在します" @@ -30262,3 +30346,6 @@ #~ msgid "requested DSM segment \"%s\" failed initialization" #~ msgstr "要求されたDSMセグメント\"%s\"の初期化に失敗しました" + +#~ msgid "requested shared memory size overflows size_t" +#~ msgstr "要求された共有メモリのサイズはsize_tを超えています" diff -Nru postgresql-17-17.10/src/backend/po/ru.po postgresql-17-17.11/src/backend/po/ru.po --- postgresql-17-17.10/src/backend/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: postgres (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-10 08:01+0300\n" -"PO-Revision-Date: 2026-05-10 08:36+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+0300\n" +"PO-Revision-Date: 2026-08-06 07:17+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -99,12 +99,12 @@ #: access/transam/twophase.c:1354 access/transam/xlog.c:3458 #: access/transam/xlog.c:4322 access/transam/xlogrecovery.c:1248 #: access/transam/xlogrecovery.c:1346 access/transam/xlogrecovery.c:1383 -#: access/transam/xlogrecovery.c:1450 backup/basebackup.c:2123 +#: access/transam/xlogrecovery.c:1450 backup/basebackup.c:2121 #: backup/walsummary.c:283 commands/extension.c:3678 libpq/hba.c:764 #: replication/logical/origin.c:745 replication/logical/origin.c:781 -#: replication/logical/reorderbuffer.c:5243 -#: replication/logical/snapbuild.c:2099 replication/slot.c:2281 -#: replication/slot.c:2322 replication/walsender.c:673 +#: replication/logical/reorderbuffer.c:5259 +#: replication/logical/snapbuild.c:2099 replication/slot.c:2283 +#: replication/slot.c:2324 replication/walsender.c:673 #: storage/file/buffile.c:470 storage/file/copydir.c:185 #: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format @@ -114,8 +114,8 @@ #: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 #: access/transam/xlog.c:3463 access/transam/xlog.c:4327 #: replication/logical/origin.c:750 replication/logical/origin.c:789 -#: replication/logical/snapbuild.c:2104 replication/slot.c:2285 -#: replication/slot.c:2326 replication/walsender.c:678 +#: replication/logical/snapbuild.c:2104 replication/slot.c:2287 +#: replication/slot.c:2328 replication/walsender.c:678 #: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" @@ -132,9 +132,9 @@ #: access/transam/xlog.c:5227 commands/copyfrom.c:1799 commands/copyto.c:325 #: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 #: replication/logical/origin.c:683 replication/logical/origin.c:822 -#: replication/logical/reorderbuffer.c:5295 +#: replication/logical/reorderbuffer.c:5311 #: replication/logical/snapbuild.c:1866 replication/logical/snapbuild.c:1990 -#: replication/slot.c:2169 replication/slot.c:2333 replication/walsender.c:688 +#: replication/slot.c:2171 replication/slot.c:2335 replication/walsender.c:688 #: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:828 #: storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 #: utils/cache/relmapper.c:956 @@ -169,15 +169,15 @@ #: access/transam/xlog.c:3374 access/transam/xlog.c:3413 #: access/transam/xlog.c:3606 access/transam/xlog.c:4312 #: access/transam/xlogrecovery.c:4285 access/transam/xlogrecovery.c:4388 -#: access/transam/xlogutils.c:836 backup/basebackup.c:547 -#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 -#: postmaster/syslogger.c:1511 replication/logical/origin.c:735 -#: replication/logical/reorderbuffer.c:3896 -#: replication/logical/reorderbuffer.c:4450 -#: replication/logical/reorderbuffer.c:5223 +#: access/transam/xlogutils.c:860 backup/basebackup.c:547 +#: backup/basebackup.c:1596 backup/walsummary.c:220 libpq/hba.c:624 +#: postmaster/syslogger.c:1511 postmaster/walsummarizer.c:1614 +#: replication/logical/origin.c:735 replication/logical/reorderbuffer.c:3912 +#: replication/logical/reorderbuffer.c:4466 +#: replication/logical/reorderbuffer.c:5239 #: replication/logical/snapbuild.c:1821 replication/logical/snapbuild.c:1931 -#: replication/slot.c:2253 replication/walsender.c:646 -#: replication/walsender.c:3108 storage/file/copydir.c:151 +#: replication/slot.c:2255 replication/walsender.c:646 +#: replication/walsender.c:3130 storage/file/copydir.c:151 #: storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 #: storage/file/fd.c:3830 storage/smgr/md.c:672 utils/cache/relmapper.c:818 #: utils/cache/relmapper.c:935 utils/error/elog.c:2124 @@ -207,7 +207,7 @@ #: access/transam/xlog.c:4285 access/transam/xlog.c:8721 #: access/transam/xlog.c:8766 backup/basebackup_server.c:207 #: commands/dbcommands.c:514 replication/logical/snapbuild.c:1859 -#: replication/slot.c:2153 replication/slot.c:2263 storage/file/fd.c:820 +#: replication/slot.c:2155 replication/slot.c:2265 storage/file/fd.c:820 #: storage/file/fd.c:3851 storage/smgr/md.c:1345 storage/smgr/md.c:1390 #: storage/sync/sync.c:446 utils/misc/guc.c:4530 #, c-format @@ -219,15 +219,15 @@ #: ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 #: ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 #: ../common/md5_common.c:156 ../common/parse_manifest.c:157 -#: ../common/parse_manifest.c:852 ../common/psprintf.c:143 -#: ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:828 -#: ../port/path.c:865 ../port/path.c:882 access/transam/twophase.c:1419 +#: ../common/parse_manifest.c:852 ../common/psprintf.c:140 +#: ../common/scram-common.c:268 ../common/stringinfo.c:311 ../port/path.c:845 +#: ../port/path.c:882 ../port/path.c:899 access/transam/twophase.c:1419 #: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1360 #: libpq/auth.c:1404 libpq/auth.c:1961 libpq/be-secure-gssapi.c:534 #: libpq/be-secure-gssapi.c:714 postmaster/bgworker.c:355 #: postmaster/bgworker.c:945 postmaster/postmaster.c:3548 #: postmaster/postmaster.c:4009 postmaster/postmaster.c:4371 -#: postmaster/walsummarizer.c:936 +#: postmaster/walsummarizer.c:1035 #: replication/libpqwalreceiver/libpqwalreceiver.c:400 #: replication/logical/logical.c:212 replication/walsender.c:853 #: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 @@ -235,7 +235,7 @@ #: storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 #: storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 #: utils/activity/pgstat_shmem.c:508 utils/adt/formatting.c:1727 -#: utils/adt/formatting.c:1875 utils/adt/formatting.c:2077 +#: utils/adt/formatting.c:1875 utils/adt/formatting.c:2089 #: utils/adt/pg_locale.c:533 utils/adt/pg_locale.c:697 utils/fmgr/dfmgr.c:229 #: 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 @@ -243,7 +243,7 @@ #: utils/misc/guc.c:674 utils/misc/guc.c:1062 utils/misc/guc.c:4508 #: utils/misc/tzparser.c:477 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:1157 utils/mmgr/slab.c:370 +#: utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1160 utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "нехватка памяти" @@ -307,20 +307,30 @@ msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" -#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 -#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 -#: ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:867 -#: ../port/path.c:884 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:847 ../port/path.c:884 +#: ../port/path.c:901 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:76 storage/file/fd.c:3516 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -363,8 +373,8 @@ #: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 #: postmaster/pgarch.c:834 postmaster/syslogger.c:1559 -#: replication/logical/snapbuild.c:1878 replication/slot.c:965 -#: replication/slot.c:2036 replication/slot.c:2185 storage/file/fd.c:838 +#: replication/logical/snapbuild.c:1878 replication/slot.c:967 +#: replication/slot.c:2038 replication/slot.c:2187 storage/file/fd.c:838 #: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -595,7 +605,7 @@ msgid "file size is not an integer" msgstr "размер файла не является целочисленным" -#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#: ../common/parse_manifest.c:699 backup/basebackup.c:868 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "нераспознанный алгоритм расчёта контрольных сумм: \"%s\"" @@ -664,7 +674,7 @@ #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 -#: tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 +#: tcop/backend_startup.c:760 utils/misc/guc.c:3167 utils/misc/guc.c:3208 #: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6942 #: utils/misc/guc.c:6983 #, c-format @@ -731,9 +741,9 @@ #: access/transam/twophase.c:1718 access/transam/xlogarchive.c:119 #: access/transam/xlogarchive.c:399 backup/walsummary.c:254 #: postmaster/postmaster.c:1051 postmaster/syslogger.c:1488 -#: replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4719 +#: replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4735 #: replication/logical/snapbuild.c:1759 replication/logical/snapbuild.c:2193 -#: replication/slot.c:2237 storage/file/fd.c:878 storage/file/fd.c:3378 +#: replication/slot.c:2239 storage/file/fd.c:878 storage/file/fd.c:3378 #: storage/file/fd.c:3440 storage/file/reinit.c:261 storage/ipc/dsm.c:343 #: storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 #: utils/time/snapmgr.c:1591 @@ -760,13 +770,13 @@ msgid "could not encode server key" msgstr "не удалось закодировать ключ сервера" -#: ../common/stringinfo.c:315 +#: ../common/stringinfo.c:312 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "" "Не удалось увеличить строковый буфер (в буфере байт: %d, требовалось ещё %d)." -#: ../common/stringinfo.c:319 +#: ../common/stringinfo.c:316 #, c-format msgid "" "out of memory\n" @@ -880,7 +890,7 @@ "Возможно, работе СУБД мешает антивирус, программа резервного копирования или " "что-то подобное." -#: ../port/path.c:852 +#: ../port/path.c:869 #, c-format msgid "could not get current working directory: %m\n" msgstr "не удалось определить текущий рабочий каталог: %m\n" @@ -1268,7 +1278,7 @@ msgstr "Для исправления выполните REINDEX INDEX \"%s\"." #: access/gin/ginutil.c:147 executor/execExpr.c:2200 -#: utils/adt/arrayfuncs.c:4022 utils/adt/arrayfuncs.c:6720 +#: utils/adt/arrayfuncs.c:4022 utils/adt/arrayfuncs.c:6727 #: utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" @@ -1381,9 +1391,9 @@ #: access/hash/hashfunc.c:281 access/hash/hashfunc.c:337 catalog/heap.c:687 #: catalog/heap.c:693 commands/createas.c:201 commands/createas.c:508 -#: commands/indexcmds.c:2021 commands/tablecmds.c:18252 commands/view.c:81 +#: commands/indexcmds.c:2021 commands/tablecmds.c:18247 commands/view.c:81 #: regex/regc_pg_locale.c:245 utils/adt/formatting.c:1655 -#: utils/adt/formatting.c:1803 utils/adt/formatting.c:1993 utils/adt/like.c:189 +#: utils/adt/formatting.c:1803 utils/adt/formatting.c:2005 utils/adt/like.c:189 #: utils/adt/like_support.c:1024 utils/adt/varchar.c:738 #: utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 utils/adt/varlena.c:1566 #, c-format @@ -1442,38 +1452,38 @@ msgstr "" "в семействе операторов \"%s\" метода доступа %s нет межтипового оператора(ов)" -#: access/heap/heapam.c:2244 +#: access/heap/heapam.c:2335 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "вставлять кортежи в параллельном исполнителе нельзя" -#: access/heap/heapam.c:2767 +#: access/heap/heapam.c:2887 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "удалять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:2814 +#: access/heap/heapam.c:2934 #, c-format msgid "attempted to delete invisible tuple" msgstr "попытка удаления невидимого кортежа" -#: access/heap/heapam.c:3264 access/heap/heapam.c:6632 access/index/genam.c:818 +#: access/heap/heapam.c:3412 access/heap/heapam.c:6948 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "изменять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:3441 +#: access/heap/heapam.c:3589 #, c-format msgid "attempted to update invisible tuple" msgstr "попытка изменения невидимого кортежа" -#: access/heap/heapam.c:4954 access/heap/heapam.c:4992 -#: access/heap/heapam.c:5259 access/heap/heapam_handler.c:468 +#: access/heap/heapam.c:5220 access/heap/heapam.c:5258 +#: access/heap/heapam.c:5548 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не удалось получить блокировку строки в таблице \"%s\"" -#: access/heap/heapam.c:6386 commands/trigger.c:3427 +#: access/heap/heapam.c:6702 commands/trigger.c:3427 #: executor/nodeModifyTable.c:2399 executor/nodeModifyTable.c:2490 #, c-format msgid "" @@ -1509,8 +1519,8 @@ #: access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 #: backup/basebackup_server.c:242 commands/dbcommands.c:494 #: postmaster/launch_backend.c:340 postmaster/postmaster.c:4102 -#: postmaster/walsummarizer.c:1213 replication/logical/origin.c:603 -#: replication/slot.c:2097 storage/file/copydir.c:157 storage/smgr/md.c:230 +#: postmaster/walsummarizer.c:1312 replication/logical/origin.c:603 +#: replication/slot.c:2099 storage/file/copydir.c:157 storage/smgr/md.c:230 #: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" @@ -1528,7 +1538,7 @@ #: postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 #: replication/logical/origin.c:615 replication/logical/origin.c:657 #: replication/logical/origin.c:676 replication/logical/snapbuild.c:1835 -#: replication/slot.c:2133 storage/file/buffile.c:545 +#: replication/slot.c:2135 storage/file/buffile.c:545 #: storage/file/copydir.c:197 utils/init/miscinit.c:1656 #: utils/init/miscinit.c:1667 utils/init/miscinit.c:1675 utils/misc/guc.c:4491 #: utils/misc/guc.c:4522 utils/misc/guc.c:5680 utils/misc/guc.c:5698 @@ -1831,7 +1841,7 @@ #: access/index/indexam.c:203 catalog/objectaddress.c:1356 #: commands/indexcmds.c:2885 commands/tablecmds.c:281 commands/tablecmds.c:305 -#: commands/tablecmds.c:17937 commands/tablecmds.c:19848 +#: commands/tablecmds.c:17932 commands/tablecmds.c:19843 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" - это не индекс" @@ -2018,16 +2028,14 @@ #: access/transam/multixact.c:1262 access/transam/multixact.c:1269 #: access/transam/multixact.c:1293 access/transam/multixact.c:1302 -#: 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 "" "Выполните очистку (VACUUM) всей базы данных.\n" -"Возможно, вам также придётся зафиксировать или откатить старые " -"подготовленные транзакции и удалить неиспользуемые слоты репликации." +"Возможно, вам также придётся зафиксировать или откатить старые\n" +"подготовленные транзакции." #: access/transam/multixact.c:1267 #, c-format @@ -2149,13 +2157,12 @@ 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:2941 #, c-format @@ -2403,7 +2410,7 @@ msgstr "" "Идентификаторы линий времени должны быть меньше идентификатора линии-потомка." -#: access/transam/timeline.c:589 +#: access/transam/timeline.c:589 postmaster/walsummarizer.c:927 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "в истории сервера нет запрошенной линии времени %u" @@ -2516,7 +2523,7 @@ "в файле \"%s\"" #: access/transam/twophase.c:1420 access/transam/xlogrecovery.c:565 -#: postmaster/walsummarizer.c:937 replication/logical/logical.c:213 +#: postmaster/walsummarizer.c:1036 replication/logical/logical.c:213 #: replication/walsender.c:854 #, c-format msgid "Failed while allocating a WAL reading processor." @@ -2621,6 +2628,17 @@ "транзакций, во избежание потери данных из-за зацикливания в базе данных " "\"%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 "" @@ -2823,8 +2841,8 @@ msgstr "" "не удалось записать в файл журнала \"%s\" (смещение: %u, длина: %zu): %m" -#: access/transam/xlog.c:3720 access/transam/xlogutils.c:831 -#: replication/walsender.c:3102 +#: access/transam/xlog.c:3720 access/transam/xlogutils.c:855 +#: postmaster/walsummarizer.c:1628 replication/walsender.c:3124 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запрошенный сегмент WAL %s уже удалён" @@ -3043,13 +3061,13 @@ #: access/transam/xlog.c:4643 catalog/namespace.c:4699 #: commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 -#: replication/slot.c:2487 tcop/postgres.c:3719 utils/error/elog.c:2247 +#: replication/slot.c:2489 tcop/postgres.c:3735 utils/error/elog.c:2247 #, c-format msgid "List syntax is invalid." msgstr "Ошибка синтаксиса в списке." #: access/transam/xlog.c:4689 commands/user.c:2545 commands/variable.c:173 -#: tcop/postgres.c:3735 utils/error/elog.c:2273 +#: tcop/postgres.c:3751 utils/error/elog.c:2273 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "нераспознанное ключевое слово: \"%s\"." @@ -3326,12 +3344,12 @@ "CHECKPOINT на ведущем сервере, а затем попробуйте резервное копирование \"на " "ходу\" ещё раз." -#: access/transam/xlog.c:9072 backup/basebackup.c:1417 utils/adt/misc.c:354 +#: access/transam/xlog.c:9072 backup/basebackup.c:1415 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалось прочитать символическую ссылку \"%s\": %m" -#: access/transam/xlog.c:9079 backup/basebackup.c:1422 utils/adt/misc.c:359 +#: access/transam/xlog.c:9079 backup/basebackup.c:1420 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "целевой путь символической ссылки \"%s\" слишком длинный" @@ -3341,13 +3359,13 @@ msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "Установите wal_level \"replica\" или \"logical\" при запуске сервера." -#: access/transam/xlog.c:9238 backup/basebackup.c:1281 +#: access/transam/xlog.c:9238 backup/basebackup.c:1279 #, c-format msgid "the standby was promoted during online backup" msgstr "" "ведомый сервер был повышен в процессе резервного копирования \"на ходу\"" -#: access/transam/xlog.c:9239 backup/basebackup.c:1282 +#: access/transam/xlog.c:9239 backup/basebackup.c:1280 #, c-format msgid "" "This means that the backup being taken is corrupt and should not be used. " @@ -3450,7 +3468,7 @@ msgid "could not write archive status file \"%s\": %m" msgstr "не удалось записать файл состояния архива \"%s\": %m" -#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:995 #, c-format msgid "a backup is already in progress in this session" msgstr "резервное копирование уже выполняется в этом сеансе" @@ -4315,12 +4333,12 @@ #: access/transam/xlogrecovery.c:4773 access/transam/xlogrecovery.c:4775 #: catalog/dependency.c:1153 catalog/dependency.c:1160 #: catalog/dependency.c:1171 commands/tablecmds.c:1459 -#: commands/tablecmds.c:15152 commands/tablespace.c:460 commands/user.c:1302 +#: commands/tablecmds.c:15147 commands/tablespace.c:460 commands/user.c:1302 #: commands/vacuum.c:213 commands/view.c:441 executor/execExprInterp.c:4726 #: executor/execExprInterp.c:4734 libpq/auth.c:332 #: replication/logical/applyparallelworker.c:1057 replication/slot.c:261 -#: replication/slot.c:2502 replication/slot.c:2504 replication/syncrep.c:1078 -#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 +#: replication/slot.c:2504 replication/slot.c:2506 replication/syncrep.c:1078 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1465 utils/misc/guc.c:3169 #: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6836 #: utils/misc/guc.c:6870 utils/misc/guc.c:6904 utils/misc/guc.c:6947 #: utils/misc/guc.c:6989 @@ -4360,12 +4378,12 @@ msgid "\"recovery_target_timeline\" is not a valid number." msgstr "Значение \"recovery_target_timeline\" не является допустимым числом." -#: access/transam/xlogutils.c:1032 +#: access/transam/xlogutils.c:1068 #, c-format msgid "could not read from WAL segment %s, offset %d: %m" msgstr "не удалось прочитать из сегмента WAL %s по смещению %d: %m" -#: access/transam/xlogutils.c:1039 +#: access/transam/xlogutils.c:1075 #, c-format msgid "could not read from WAL segment %s, offset %d: read %d of %d" msgstr "" @@ -4454,90 +4472,90 @@ msgid "checksum verification failure during base backup" msgstr "при базовом резервном копировании выявлены ошибки контрольных сумм" -#: 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 +#: backup/basebackup.c:731 backup/basebackup.c:740 backup/basebackup.c:751 +#: backup/basebackup.c:768 backup/basebackup.c:777 backup/basebackup.c:786 +#: backup/basebackup.c:801 backup/basebackup.c:818 backup/basebackup.c:827 +#: backup/basebackup.c:839 backup/basebackup.c:863 backup/basebackup.c:877 +#: backup/basebackup.c:888 backup/basebackup.c:899 backup/basebackup.c:912 #, c-format msgid "duplicate option \"%s\"" msgstr "повторяющийся параметр \"%s\"" -#: backup/basebackup.c:761 +#: backup/basebackup.c:759 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "нераспознанный тип контрольной точки: \"%s\"" -#: backup/basebackup.c:793 +#: backup/basebackup.c:791 #, c-format msgid "incremental backups cannot be taken unless WAL summarization is enabled" msgstr "" "сделать инкрементальную копию можно, только когда включено обобщение WAL" -#: backup/basebackup.c:809 +#: backup/basebackup.c:807 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d вне диапазона, допустимого для параметра \"%s\" (%d .. %d)" -#: backup/basebackup.c:854 +#: backup/basebackup.c:852 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "нераспознанный параметр в манифесте: \"%s\"" -#: backup/basebackup.c:905 +#: backup/basebackup.c:903 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "нераспознанный алгоритм сжатия: \"%s\"" -#: backup/basebackup.c:921 +#: backup/basebackup.c:919 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "нераспознанный параметр операции базового копирования: \"%s\"" -#: backup/basebackup.c:932 +#: backup/basebackup.c:930 #, c-format msgid "manifest checksums require a backup manifest" msgstr "контрольные суммы не могут рассчитываться без манифеста копии" # skip-rule: capital-letter-first -#: backup/basebackup.c:941 +#: backup/basebackup.c:939 #, c-format msgid "target detail cannot be used without target" msgstr "доп. информацию о получателе нельзя задать без указания получателя" # skip-rule: capital-letter-first -#: backup/basebackup.c:950 backup/basebackup_target.c:218 +#: backup/basebackup.c:948 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "получатель \"%s\" не принимает доп. информацию" -#: backup/basebackup.c:961 +#: backup/basebackup.c:959 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "параметры сжатия нельзя указывать, если не включено сжатие" -#: backup/basebackup.c:974 +#: backup/basebackup.c:972 #, c-format msgid "invalid compression specification: %s" msgstr "неправильное указание сжатия: %s" -#: backup/basebackup.c:1024 +#: backup/basebackup.c:1022 #, c-format msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" msgstr "" "инкрементальной команде BASE_BACKUP должна предшествовать UPLOAD_MANIFEST" -#: backup/basebackup.c:1157 backup/basebackup.c:1358 +#: backup/basebackup.c:1155 backup/basebackup.c:1356 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не удалось получить информацию о файле или каталоге \"%s\": %m" -#: backup/basebackup.c:1544 +#: backup/basebackup.c:1542 #, c-format msgid "skipping special file \"%s\"" msgstr "специальный файл \"%s\" пропускается" -#: backup/basebackup.c:1751 +#: backup/basebackup.c:1749 #, c-format msgid "" "could not verify checksum in file \"%s\", block %u: read buffer size %d and " @@ -4546,7 +4564,7 @@ "не удалось проверить контрольную сумму в файле \"%s\", блоке %u: размер " "прочитанного буфера (%d) отличается от размера страницы (%d)" -#: backup/basebackup.c:1813 +#: backup/basebackup.c:1811 #, 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" @@ -4554,7 +4572,7 @@ msgstr[1] "всего в файле \"%s\" обнаружено ошибок контрольных сумм: %d" msgstr[2] "всего в файле \"%s\" обнаружено ошибок контрольных сумм: %d" -#: backup/basebackup.c:1917 +#: backup/basebackup.c:1915 #, c-format msgid "" "checksum verification failed in file \"%s\", block %u: calculated %X but " @@ -4563,19 +4581,19 @@ "ошибка контрольной суммы в файле \"%s\", блоке %u: вычислено значение %X, но " "ожидалось %X" -#: backup/basebackup.c:1924 +#: backup/basebackup.c:1922 #, c-format msgid "" "further checksum verification failures in file \"%s\" will not be reported" msgstr "" "о дальнейших ошибках контрольных сумм в файле \"%s\" сообщаться не будет" -#: backup/basebackup.c:2048 +#: backup/basebackup.c:2046 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "слишком длинное имя файла для формата tar: \"%s\"" -#: backup/basebackup.c:2053 +#: backup/basebackup.c:2051 #, c-format msgid "" "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" @@ -4583,7 +4601,7 @@ "цель символической ссылки слишком длинная для формата tar: имя файла \"%s\", " "цель \"%s\"" -#: backup/basebackup.c:2127 +#: backup/basebackup.c:2125 #, c-format msgid "could not read file \"%s\": read %zd of %zu" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %zd из %zu)" @@ -4719,7 +4737,7 @@ #: backup/basebackup_server.c:102 commands/dbcommands.c:477 #: commands/tablespace.c:157 commands/tablespace.c:173 -#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2024 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:2026 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" @@ -4744,11 +4762,10 @@ 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 @@ -4776,17 +4793,23 @@ 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 %lld" msgstr "неверная линия времени %lld" -#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:624 tcop/postgres.c:3950 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:624 tcop/postgres.c:3966 #, c-format msgid "--%s requires a value" msgstr "для --%s требуется значение" -#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:629 tcop/postgres.c:3955 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:629 tcop/postgres.c:3971 #, c-format msgid "-c %s requires a value" msgstr "для -c %s требуется значение" @@ -4961,16 +4984,16 @@ #: commands/tablecmds.c:7778 commands/tablecmds.c:7852 #: commands/tablecmds.c:7922 commands/tablecmds.c:8052 #: commands/tablecmds.c:8181 commands/tablecmds.c:8275 -#: commands/tablecmds.c:8376 commands/tablecmds.c:8503 -#: commands/tablecmds.c:8533 commands/tablecmds.c:8675 -#: commands/tablecmds.c:8768 commands/tablecmds.c:8902 -#: commands/tablecmds.c:9014 commands/tablecmds.c:12838 -#: commands/tablecmds.c:13030 commands/tablecmds.c:13191 -#: commands/tablecmds.c:14403 commands/tablecmds.c:17030 commands/trigger.c:943 +#: commands/tablecmds.c:8376 commands/tablecmds.c:8498 +#: commands/tablecmds.c:8528 commands/tablecmds.c:8670 +#: commands/tablecmds.c:8763 commands/tablecmds.c:8897 +#: commands/tablecmds.c:9009 commands/tablecmds.c:12833 +#: commands/tablecmds.c:13025 commands/tablecmds.c:13186 +#: commands/tablecmds.c:14398 commands/tablecmds.c:17025 commands/trigger.c:943 #: parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 #: parser/parse_type.c:144 parser/parse_utilcmd.c:3413 #: parser/parse_utilcmd.c:3453 parser/parse_utilcmd.c:3495 utils/adt/acl.c:2940 -#: utils/adt/ruleutils.c:2812 +#: utils/adt/ruleutils.c:2814 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "столбец \"%s\" в таблице \"%s\" не существует" @@ -4980,13 +5003,13 @@ msgid "\"%s\" is an index" msgstr "\"%s\" - это индекс" -#: catalog/aclchk.c:1869 commands/tablecmds.c:14560 commands/tablecmds.c:17946 +#: catalog/aclchk.c:1869 commands/tablecmds.c:14555 commands/tablecmds.c:17941 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\" - это составной тип" #: catalog/aclchk.c:1877 catalog/objectaddress.c:1363 commands/tablecmds.c:263 -#: commands/tablecmds.c:17910 utils/adt/acl.c:2124 utils/adt/acl.c:2154 +#: commands/tablecmds.c:17905 utils/adt/acl.c:2124 utils/adt/acl.c:2154 #: utils/adt/acl.c:2187 utils/adt/acl.c:2223 utils/adt/acl.c:2254 #: utils/adt/acl.c:2285 #, c-format @@ -5551,12 +5574,12 @@ 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:2375 parser/parse_relation.c:3407 +#: catalog/dependency.c:2378 parser/parse_relation.c:3407 #: parser/parse_relation.c:3417 #, c-format msgid "column %d of relation \"%s\" does not exist" @@ -5620,21 +5643,21 @@ "для столбца \"%s\" с сортируемым типом %s не удалось получить правило " "сортировки" -#: catalog/heap.c:1176 catalog/index.c:899 commands/createas.c:401 +#: catalog/heap.c:1179 catalog/index.c:903 commands/createas.c:401 #: commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "отношение \"%s\" уже существует" -#: catalog/heap.c:1192 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: 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:1179 commands/typecmds.c:1405 -#: commands/typecmds.c:1585 commands/typecmds.c:2556 +#: commands/typecmds.c:1592 commands/typecmds.c:2563 #, c-format msgid "type \"%s\" already exists" msgstr "тип \"%s\" уже существует" -#: catalog/heap.c:1193 +#: catalog/heap.c:1196 #, c-format msgid "" "A relation has an associated type of the same name, so you must use a name " @@ -5643,54 +5666,54 @@ "С отношением уже связан тип с таким же именем; выберите имя, не " "конфликтующее с существующими типами." -#: catalog/heap.c:1233 +#: catalog/heap.c:1236 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "" "значение relfilenumber для TOAST не задано в режиме двоичного обновления" -#: catalog/heap.c:1244 +#: catalog/heap.c:1247 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "значение OID кучи в pg_class не задано в режиме двоичного обновления" -#: catalog/heap.c:1254 +#: catalog/heap.c:1257 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "значение relfilenumber не задано в режиме двоичного обновления" -#: catalog/heap.c:2199 +#: catalog/heap.c:2202 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "" "добавить ограничение NO INHERIT к секционированной таблице \"%s\" нельзя" -#: catalog/heap.c:2466 +#: catalog/heap.c:2469 #, c-format msgid "check constraint \"%s\" already exists" msgstr "ограничение-проверка \"%s\" уже существует" -#: catalog/heap.c:2638 catalog/index.c:913 catalog/pg_constraint.c:725 -#: commands/tablecmds.c:9389 +#: catalog/heap.c:2641 catalog/index.c:917 catalog/pg_constraint.c:725 +#: commands/tablecmds.c:9384 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "ограничение \"%s\" для отношения \"%s\" уже существует" -#: catalog/heap.c:2645 +#: catalog/heap.c:2648 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2656 +#: catalog/heap.c:2659 #, c-format msgid "" "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с наследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2666 +#: catalog/heap.c:2669 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" @@ -5698,71 +5721,71 @@ "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "таблицы \"%s\"" -#: catalog/heap.c:2671 +#: catalog/heap.c:2674 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "слияние ограничения \"%s\" с унаследованным определением" -#: catalog/heap.c:2697 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 +#: catalog/heap.c:2700 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 #: commands/tablecmds.c:3377 commands/tablecmds.c:7089 -#: commands/tablecmds.c:15971 commands/tablecmds.c:16102 +#: commands/tablecmds.c:15966 commands/tablecmds.c:16097 #, c-format msgid "too many inheritance parents" msgstr "слишком много родителей в иерархии наследования" -#: catalog/heap.c:2781 +#: catalog/heap.c:2784 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "" "использовать генерируемый столбец \"%s\" в выражении генерируемого столбца " "нельзя" -#: catalog/heap.c:2783 +#: catalog/heap.c:2786 #, c-format msgid "A generated column cannot reference another generated column." msgstr "" "Генерируемый столбец не может ссылаться на другой генерируемый столбец." -#: catalog/heap.c:2789 +#: catalog/heap.c:2792 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "" "в выражении генерируемого столбца нельзя использовать переменные «вся строка»" -#: catalog/heap.c:2790 +#: catalog/heap.c:2793 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "" "Это сделало бы генерируемый столбец зависимым от собственного значения." -#: catalog/heap.c:2845 +#: catalog/heap.c:2848 #, c-format msgid "generation expression is not immutable" msgstr "генерирующее выражение не является постоянным" -#: catalog/heap.c:2873 rewrite/rewriteHandler.c:1313 +#: catalog/heap.c:2876 rewrite/rewriteHandler.c:1313 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "столбец \"%s\" имеет тип %s, но тип выражения по умолчанию %s" -#: catalog/heap.c:2878 commands/prepare.c:331 parser/analyze.c:2758 +#: catalog/heap.c:2881 commands/prepare.c:331 parser/analyze.c:2758 #: parser/parse_target.c:592 parser/parse_target.c:882 #: parser/parse_target.c:892 rewrite/rewriteHandler.c:1318 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Перепишите выражение или преобразуйте его тип." -#: catalog/heap.c:2925 +#: catalog/heap.c:2928 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в ограничении-проверке можно ссылаться только на таблицу \"%s\"" -#: catalog/heap.c:3231 +#: catalog/heap.c:3234 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "неподдерживаемое сочетание внешнего ключа с ON COMMIT" -#: catalog/heap.c:3232 +#: catalog/heap.c:3235 #, c-format msgid "" "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT " @@ -5770,17 +5793,17 @@ msgstr "" "Таблица \"%s\" ссылается на \"%s\", и для них задан разный режим ON COMMIT." -#: catalog/heap.c:3237 +#: catalog/heap.c:3240 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "опустошить таблицу, на которую ссылается внешний ключ, нельзя" -#: catalog/heap.c:3238 +#: catalog/heap.c:3241 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Таблица \"%s\" ссылается на \"%s\"." -#: catalog/heap.c:3240 +#: catalog/heap.c:3243 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "" @@ -5806,82 +5829,82 @@ msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "столбец первичного ключа \"%s\" не помечен как NOT NULL" -#: catalog/index.c:798 catalog/index.c:1915 +#: catalog/index.c:802 catalog/index.c:1929 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "" "пользовательские индексы в таблицах системного каталога не поддерживаются" -#: catalog/index.c:838 +#: catalog/index.c:842 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "" "недетерминированные правила сортировки не поддерживаются для класса " "операторов \"%s\"" -#: catalog/index.c:853 +#: catalog/index.c:857 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "" "параллельное создание индекса в таблицах системного каталога не " "поддерживается" -#: catalog/index.c:862 catalog/index.c:1331 +#: catalog/index.c:866 catalog/index.c:1338 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "" "параллельное создание индекса для ограничений-исключений не поддерживается" -#: catalog/index.c:871 +#: catalog/index.c:875 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "нельзя создать разделяемые индексы после initdb" -#: catalog/index.c:891 commands/createas.c:416 commands/sequence.c:159 +#: catalog/index.c:895 commands/createas.c:416 commands/sequence.c:159 #: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "отношение \"%s\" уже существует, пропускается" -#: catalog/index.c:941 +#: catalog/index.c:945 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "" "значение OID индекса в pg_class не задано в режиме двоичного обновления" -#: catalog/index.c:951 utils/cache/relcache.c:3807 +#: catalog/index.c:955 utils/cache/relcache.c:3809 #, c-format msgid "index relfilenumber value not set when in binary upgrade mode" msgstr "" "значение relfilenumber для индекса не задано в режиме двоичного обновления" -#: catalog/index.c:2214 +#: catalog/index.c:2228 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY должен быть первым действием в транзакции" -#: catalog/index.c:3675 +#: catalog/index.c:3701 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "переиндексировать временные таблицы других сеансов нельзя" -#: catalog/index.c:3686 commands/indexcmds.c:3660 +#: catalog/index.c:3712 commands/indexcmds.c:3660 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "перестроить нерабочий индекс в таблице TOAST нельзя" -#: catalog/index.c:3702 commands/indexcmds.c:3538 commands/indexcmds.c:3684 +#: catalog/index.c:3728 commands/indexcmds.c:3538 commands/indexcmds.c:3684 #: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" msgstr "переместить системную таблицу \"%s\" нельзя" -#: catalog/index.c:3839 +#: catalog/index.c:3865 #, c-format msgid "index \"%s\" was reindexed" msgstr "индекс \"%s\" был перестроен" -#: catalog/index.c:4005 +#: catalog/index.c:4031 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "" @@ -5962,7 +5985,7 @@ 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\" не существует" @@ -6026,25 +6049,25 @@ #: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 #: commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2327 -#: commands/tablecmds.c:12966 +#: commands/tablecmds.c:12961 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" - это не таблица" #: catalog/objectaddress.c:1378 commands/tablecmds.c:269 -#: commands/tablecmds.c:17915 commands/view.c:114 +#: commands/tablecmds.c:17910 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" - это не представление" #: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 -#: commands/tablecmds.c:17920 +#: commands/tablecmds.c:17915 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" - это не материализованное представление" #: catalog/objectaddress.c:1392 commands/tablecmds.c:293 -#: commands/tablecmds.c:17925 +#: commands/tablecmds.c:17920 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" - это не сторонняя таблица" @@ -6066,7 +6089,7 @@ "значение по умолчанию для столбца \"%s\" отношения \"%s\" не существует" #: catalog/objectaddress.c:1618 commands/functioncmds.c:132 -#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 +#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3850 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 #: utils/adt/acl.c:4577 #, c-format @@ -6335,7 +6358,7 @@ msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 +#: catalog/objectaddress.c:3656 #, c-format msgid "membership of role %s in role %s" msgstr "членство роли %s в роли %s" @@ -6658,10 +6681,10 @@ msgstr "изменить число непосредственных аргументов агрегатной функции нельзя" #: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 -#: commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 -#: commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 -#: commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 -#: commands/typecmds.c:2380 parser/parse_func.c:417 parser/parse_func.c:448 +#: commands/typecmds.c:1992 commands/typecmds.c:2038 commands/typecmds.c:2090 +#: commands/typecmds.c:2127 commands/typecmds.c:2161 commands/typecmds.c:2195 +#: commands/typecmds.c:2229 commands/typecmds.c:2258 commands/typecmds.c:2345 +#: commands/typecmds.c:2387 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 #, c-format @@ -6786,23 +6809,23 @@ msgid "default conversion for %s to %s already exists" msgstr "преобразование по умолчанию из %s в %s уже существует" -#: catalog/pg_depend.c:225 commands/extension.c:3527 +#: catalog/pg_depend.c:236 commands/extension.c:3527 #, 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:3567 +#: catalog/pg_depend.c:243 catalog/pg_depend.c:294 commands/extension.c:3567 #, 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 " @@ -6811,12 +6834,22 @@ "Расширение может выполнять 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\"" @@ -6868,7 +6901,7 @@ "отсоединения." #: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 -#: commands/tablecmds.c:16217 +#: commands/tablecmds.c:16212 #, c-format msgid "" "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending " @@ -7278,7 +7311,7 @@ msgid "alignment \"%c\" is invalid for variable-length type" msgstr "выравнивание \"%c\" не подходит для типа переменной длины" -#: catalog/pg_type.c:325 commands/typecmds.c:4363 +#: catalog/pg_type.c:325 commands/typecmds.c:4370 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "для типов постоянного размера применим только режим хранения PLAIN" @@ -7297,7 +7330,7 @@ "Имя мультидиапазонного типа можно указать вручную, воспользовавшись " "атрибутом \"multirange_type_name\"." -#: catalog/storage.c:533 storage/buffer/bufmgr.c:1547 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1556 #, c-format msgid "invalid page in block %u of relation %s" msgstr "некорректная страница в блоке %u отношения %s" @@ -7425,7 +7458,7 @@ msgid "publication \"%s\" already exists" msgstr "публикация \"%s\" уже существует" -#: commands/alter.c:98 commands/subscriptioncmds.c:669 +#: commands/alter.c:98 commands/subscriptioncmds.c:695 #, c-format msgid "subscription \"%s\" already exists" msgstr "подписка \"%s\" уже существует" @@ -7465,16 +7498,16 @@ msgid "must be superuser to rename %s" msgstr "переименовать \"%s\" может только суперпользователь" -#: commands/alter.c:256 commands/subscriptioncmds.c:648 -#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 -#: commands/subscriptioncmds.c:1920 +#: commands/alter.c:256 commands/subscriptioncmds.c:674 +#: commands/subscriptioncmds.c:1155 commands/subscriptioncmds.c:1238 +#: commands/subscriptioncmds.c:1948 #, c-format msgid "password_required=false is superuser-only" msgstr "задать password_required=false может только суперпользователь" -#: commands/alter.c:257 commands/subscriptioncmds.c:649 -#: commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 -#: commands/subscriptioncmds.c:1921 +#: commands/alter.c:257 commands/subscriptioncmds.c:675 +#: commands/subscriptioncmds.c:1156 commands/subscriptioncmds.c:1239 +#: commands/subscriptioncmds.c:1949 #, c-format msgid "" "Subscriptions with the password_required option set to false may only be " @@ -7646,7 +7679,7 @@ msgid "there is no previously clustered index for table \"%s\"" msgstr "таблица \"%s\" ранее не кластеризовалась по какому-либо индексу" -#: commands/cluster.c:191 commands/tablecmds.c:14861 commands/tablecmds.c:16793 +#: commands/cluster.c:191 commands/tablecmds.c:14856 commands/tablecmds.c:16788 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "индекс \"%s\" для таблицы \"%s\" не существует" @@ -7661,7 +7694,7 @@ msgid "cannot vacuum temporary tables of other sessions" msgstr "очищать временные таблицы других сеансов нельзя" -#: commands/cluster.c:513 commands/tablecmds.c:16803 +#: commands/cluster.c:513 commands/tablecmds.c:16798 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не является индексом таблицы \"%s\"" @@ -7737,9 +7770,9 @@ #: replication/pgoutput/pgoutput.c:315 replication/pgoutput/pgoutput.c:338 #: replication/pgoutput/pgoutput.c:356 replication/pgoutput/pgoutput.c:366 #: replication/pgoutput/pgoutput.c:376 replication/pgoutput/pgoutput.c:386 -#: replication/pgoutput/pgoutput.c:398 replication/walsender.c:1164 -#: replication/walsender.c:1186 replication/walsender.c:1196 -#: replication/walsender.c:1205 replication/walsender.c:1444 +#: replication/pgoutput/pgoutput.c:398 replication/walsender.c:1186 +#: replication/walsender.c:1208 replication/walsender.c:1218 +#: replication/walsender.c:1227 replication/walsender.c:1466 #, c-format msgid "conflicting or redundant options" msgstr "конфликтующие или избыточные параметры" @@ -7809,11 +7842,11 @@ #. translator: %s is an SQL command #. translator: %s is an SQL ALTER command -#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1402 #: commands/tablecmds.c:7938 commands/tablecmds.c:7948 -#: commands/tablecmds.c:7950 commands/tablecmds.c:14563 -#: commands/tablecmds.c:17948 commands/tablecmds.c:17969 -#: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 +#: commands/tablecmds.c:7950 commands/tablecmds.c:14558 +#: commands/tablecmds.c:17943 commands/tablecmds.c:17964 +#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4233 #, c-format msgid "Use %s instead." msgstr "Выполните %s." @@ -7957,8 +7990,8 @@ msgid "generated columns are not supported in COPY FROM WHERE conditions" msgstr "генерируемые столбцы не поддерживаются в условиях COPY FROM WHERE" -#: commands/copy.c:182 commands/tablecmds.c:12858 commands/tablecmds.c:18092 -#: commands/tablecmds.c:18171 commands/trigger.c:657 +#: commands/copy.c:182 commands/tablecmds.c:12853 commands/tablecmds.c:18087 +#: commands/tablecmds.c:18166 commands/trigger.c:657 #: rewrite/rewriteHandler.c:978 rewrite/rewriteHandler.c:1013 #, c-format msgid "Column \"%s\" is a generated column." @@ -8115,7 +8148,7 @@ #: commands/tablecmds.c:3808 parser/parse_relation.c:3692 #: parser/parse_relation.c:3702 parser/parse_relation.c:3720 #: parser/parse_relation.c:3727 parser/parse_relation.c:3741 -#: utils/adt/tsvector_op.c:2857 +#: utils/adt/tsvector_op.c:2830 #, c-format msgid "column \"%s\" does not exist" msgstr "столбец \"%s\" не существует" @@ -8856,7 +8889,7 @@ msgstr "каталог данных с указанным OID %u уже существует" #: commands/dbcommands.c:1571 commands/dbcommands.c:1586 -#: utils/adt/pg_locale.c:2597 +#: utils/adt/pg_locale.c:2604 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "кодировка \"%s\" не соответствует локали \"%s\"" @@ -9055,7 +9088,7 @@ msgstr "неверный аргумент для %s: \"%s\"" #: commands/dropcmds.c:96 commands/functioncmds.c:1382 -#: utils/adt/ruleutils.c:2910 +#: utils/adt/ruleutils.c:2912 #, c-format msgid "\"%s\" is an aggregate function" msgstr "функция \"%s\" является агрегатной" @@ -9067,7 +9100,7 @@ #: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3892 #: commands/tablecmds.c:4050 commands/tablecmds.c:4102 -#: commands/tablecmds.c:17225 tcop/utility.c:1325 +#: commands/tablecmds.c:17220 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "отношение \"%s\" не существует, пропускается" @@ -9278,17 +9311,17 @@ 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:2066 +#: commands/event_trigger.c:2074 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s можно вызывать только в событийной триггерной функции" @@ -9635,7 +9668,7 @@ "добавить схему \"%s\" к расширению \"%s\" нельзя, так как схема содержит " "расширение" -#: commands/extension.c:3621 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 +#: commands/extension.c:3621 commands/typecmds.c:4049 utils/fmgr/funcapi.c:725 #, c-format msgid "could not find multirange type for data type %s" msgstr "тип мультидиапазона для типа данных %s не найден" @@ -10329,7 +10362,7 @@ msgid "could not determine which collation to use for index expression" msgstr "не удалось определить правило сортировки для индексного выражения" -#: commands/indexcmds.c:2028 commands/tablecmds.c:18259 commands/typecmds.c:811 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18254 commands/typecmds.c:811 #: parser/parse_expr.c:2794 parser/parse_type.c:568 parser/parse_utilcmd.c:3775 #: utils/adt/misc.c:630 #, c-format @@ -10372,8 +10405,8 @@ msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доступа \"%s\" не поддерживает параметр NULLS FIRST/LAST" -#: commands/indexcmds.c:2210 commands/tablecmds.c:18284 -#: commands/tablecmds.c:18290 commands/typecmds.c:2311 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18279 +#: commands/tablecmds.c:18285 commands/typecmds.c:2318 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" @@ -10395,7 +10428,7 @@ msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "класс операторов \"%s\" для метода доступа \"%s\" не существует" -#: commands/indexcmds.c:2263 commands/typecmds.c:2299 +#: commands/indexcmds.c:2263 commands/typecmds.c:2306 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "класс операторов \"%s\" не принимает тип данных %s" @@ -10456,7 +10489,7 @@ msgid "while reindexing partitioned index \"%s.%s\"" msgstr "при перестроении секционированного индекса \"%s.%s\"" -#: commands/indexcmds.c:3399 commands/indexcmds.c:4283 +#: commands/indexcmds.c:3399 commands/indexcmds.c:4285 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблица \"%s.%s\" переиндексирована" @@ -10491,12 +10524,12 @@ "переместить отношение, не являющееся разделяемым, в табличное пространство " "\"%s\" нельзя" -#: commands/indexcmds.c:4264 commands/indexcmds.c:4276 +#: commands/indexcmds.c:4266 commands/indexcmds.c:4278 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "индекс \"%s.%s\" был перестроен" -#: commands/indexcmds.c:4266 commands/indexcmds.c:4285 +#: commands/indexcmds.c:4268 commands/indexcmds.c:4287 #, c-format msgid "%s." msgstr "%s." @@ -10874,10 +10907,10 @@ #: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:152 #: commands/tablecmds.c:1740 commands/tablecmds.c:2340 #: commands/tablecmds.c:3702 commands/tablecmds.c:6605 -#: commands/tablecmds.c:9670 commands/tablecmds.c:17836 -#: commands/tablecmds.c:17871 commands/trigger.c:317 commands/trigger.c:1333 +#: commands/tablecmds.c:9665 commands/tablecmds.c:17831 +#: commands/tablecmds.c:17866 commands/trigger.c:317 commands/trigger.c:1333 #: commands/trigger.c:1443 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\" - это системный каталог" @@ -11150,7 +11183,7 @@ msgstr "В публикации всех таблиц нельзя добавлять или удалять таблицы." #: commands/publicationcmds.c:1390 commands/publicationcmds.c:1429 -#: commands/publicationcmds.c:1966 utils/cache/lsyscache.c:3672 +#: commands/publicationcmds.c:1966 utils/cache/lsyscache.c:3747 #, c-format msgid "publication \"%s\" does not exist" msgstr "публикация \"%s\" не существует" @@ -11379,8 +11412,8 @@ msgid "cannot change ownership of identity sequence" msgstr "сменить владельца последовательности идентификации нельзя" -#: commands/sequence.c:1671 commands/tablecmds.c:14550 -#: commands/tablecmds.c:17245 +#: commands/sequence.c:1671 commands/tablecmds.c:14545 +#: commands/tablecmds.c:17240 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Последовательность \"%s\" связана с таблицей \"%s\"." @@ -11462,12 +11495,12 @@ msgid "duplicate expression in statistics definition" msgstr "повторяющееся выражение в определении статистики" -#: commands/statscmds.c:649 commands/tablecmds.c:8653 +#: commands/statscmds.c:649 commands/tablecmds.c:8648 #, c-format msgid "statistics target %d is too low" msgstr "ориентир статистики слишком мал (%d)" -#: commands/statscmds.c:657 commands/tablecmds.c:8661 +#: commands/statscmds.c:657 commands/tablecmds.c:8656 #, c-format msgid "lowering statistics target to %d" msgstr "ориентир статистики снижается до %d" @@ -11506,12 +11539,12 @@ msgid "subscription with %s must also set %s" msgstr "для подписки с параметром %s необходимо также задать %s" -#: commands/subscriptioncmds.c:506 +#: commands/subscriptioncmds.c:532 #, c-format msgid "could not receive list of publications from the publisher: %s" msgstr "не удалось получить список публикаций с публикующего сервера: %s" -#: commands/subscriptioncmds.c:538 +#: commands/subscriptioncmds.c:564 #, c-format msgid "publication %s does not exist on the publisher" msgid_plural "publications %s do not exist on the publisher" @@ -11519,34 +11552,34 @@ msgstr[1] "публикации %s не существуют на публикующем сервере" msgstr[2] "публикации %s не существуют на публикующем сервере" -#: commands/subscriptioncmds.c:626 +#: commands/subscriptioncmds.c:652 #, c-format msgid "permission denied to create subscription" msgstr "нет прав для создания подписки" -#: commands/subscriptioncmds.c:627 +#: commands/subscriptioncmds.c:653 #, c-format msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "Создавать подписки могут только роли с правами роли \"%s\"." -#: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 -#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1371 -#: replication/logical/worker.c:4524 +#: commands/subscriptioncmds.c:784 commands/subscriptioncmds.c:917 +#: commands/subscriptioncmds.c:1550 replication/logical/tablesync.c:1372 +#: replication/logical/worker.c:4539 #, c-format msgid "could not connect to the publisher: %s" msgstr "не удалось подключиться к серверу публикации: %s" -#: commands/subscriptioncmds.c:829 +#: commands/subscriptioncmds.c:855 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "на сервере публикации создан слот репликации \"%s\"" -#: commands/subscriptioncmds.c:841 +#: commands/subscriptioncmds.c:867 #, c-format msgid "subscription was created, but is not connected" msgstr "подписка создана, но не подключена" -#: commands/subscriptioncmds.c:842 +#: commands/subscriptioncmds.c:868 #, c-format msgid "" "To initiate replication, you must manually create the replication slot, " @@ -11555,43 +11588,43 @@ "Чтобы начать репликацию, вы должны вручную создать слот репликации, включить " "подписку, а затем обновить её." -#: commands/subscriptioncmds.c:1109 commands/subscriptioncmds.c:1592 -#: commands/subscriptioncmds.c:1975 utils/cache/lsyscache.c:3722 +#: commands/subscriptioncmds.c:1135 commands/subscriptioncmds.c:1618 +#: commands/subscriptioncmds.c:2003 utils/cache/lsyscache.c:3797 #, c-format msgid "subscription \"%s\" does not exist" msgstr "подписка \"%s\" не существует" -#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 +#: commands/subscriptioncmds.c:1192 commands/subscriptioncmds.c:1271 #, c-format msgid "cannot set %s for enabled subscription" msgstr "для включённой подписки нельзя задать %s" -#: commands/subscriptioncmds.c:1233 +#: commands/subscriptioncmds.c:1259 #, c-format msgid "" "cannot set option \"%s\" for a subscription that does not have a slot name" msgstr "" "задать параметр \"%s\" для подписки, для которой не задано имя слота, нельзя" -#: commands/subscriptioncmds.c:1279 +#: commands/subscriptioncmds.c:1305 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "включить подписку, для которой не задано имя слота, нельзя" -#: commands/subscriptioncmds.c:1323 commands/subscriptioncmds.c:1374 +#: commands/subscriptioncmds.c:1349 commands/subscriptioncmds.c:1400 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "" "ALTER SUBSCRIPTION с обновлением для отключённых подписок не допускается" -#: commands/subscriptioncmds.c:1324 +#: commands/subscriptioncmds.c:1350 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "" "Выполните ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 +#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1414 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase " @@ -11600,7 +11633,7 @@ "ALTER SUBSCRIPTION с параметром публикации refresh в режиме copy_data не " "допускается, когда включён параметр two_phase" -#: commands/subscriptioncmds.c:1334 +#: commands/subscriptioncmds.c:1360 #, c-format msgid "" "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with " @@ -11610,7 +11643,7 @@ "copy_data = false либо выполните DROP/CREATE SUBSCRIPTION." #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1390 +#: commands/subscriptioncmds.c:1416 #, c-format msgid "" "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE " @@ -11619,13 +11652,13 @@ "Выполните %s с refresh = false или с copy_data = false либо выполните DROP/" "CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1412 +#: commands/subscriptioncmds.c:1438 #, c-format msgid "" "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH для отключённых подписок не допускается" -#: commands/subscriptioncmds.c:1437 +#: commands/subscriptioncmds.c:1463 #, c-format msgid "" "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase " @@ -11634,7 +11667,7 @@ "ALTER SUBSCRIPTION ... REFRESH в режиме copy_data не допускается, когда " "включён параметр two_phase" -#: commands/subscriptioncmds.c:1438 +#: commands/subscriptioncmds.c:1464 #, c-format msgid "" "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/" @@ -11643,39 +11676,39 @@ "Выполните ALTER SUBSCRIPTION ... REFRESH с copy_data = false либо выполните " "DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1473 +#: commands/subscriptioncmds.c:1499 #, 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:1596 +#: commands/subscriptioncmds.c:1622 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "подписка \"%s\" не существует, пропускается" -#: commands/subscriptioncmds.c:1865 +#: commands/subscriptioncmds.c:1893 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "слот репликации \"%s\" удалён на сервере репликации" -#: commands/subscriptioncmds.c:1874 commands/subscriptioncmds.c:1882 +#: commands/subscriptioncmds.c:1902 commands/subscriptioncmds.c:1910 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "слот репликации \"%s\" на сервере публикации не был удалён: %s" -#: commands/subscriptioncmds.c:2007 +#: commands/subscriptioncmds.c:2035 #, c-format msgid "subscription with OID %u does not exist" msgstr "подписка с OID %u не существует" -#: commands/subscriptioncmds.c:2081 commands/subscriptioncmds.c:2206 +#: commands/subscriptioncmds.c:2114 commands/subscriptioncmds.c:2239 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "" "не удалось получить список реплицируемых таблиц с сервера репликации: %s" -#: commands/subscriptioncmds.c:2117 +#: commands/subscriptioncmds.c:2150 #, c-format msgid "" "subscription \"%s\" requested copy_data with origin = NONE but might copy " @@ -11684,7 +11717,7 @@ "для подписки \"%s\" выбран режим copy_data с origin = NONE, но в неё могут " "попасть данные из другого источника" -#: commands/subscriptioncmds.c:2119 +#: commands/subscriptioncmds.c:2152 #, c-format msgid "" "The subscription being created subscribes to a publication (%s) that " @@ -11702,7 +11735,7 @@ "Создаваемая подписка связана с публикациями (%s), содержащими таблицы, в " "которые записывают другие подписки." -#: commands/subscriptioncmds.c:2122 +#: commands/subscriptioncmds.c:2155 #, c-format msgid "" "Verify that initial data copied from the publisher tables did not come from " @@ -11711,7 +11744,7 @@ "Убедитесь, что начальные данные, скопированные из таблиц публикации, " "поступили не из других источников." -#: commands/subscriptioncmds.c:2228 replication/logical/tablesync.c:932 +#: commands/subscriptioncmds.c:2261 replication/logical/tablesync.c:932 #: replication/pgoutput/pgoutput.c:1159 #, c-format msgid "" @@ -11721,7 +11754,7 @@ "использовать различные списки столбцов таблицы \"%s.%s\" в разных " "публикациях нельзя" -#: commands/subscriptioncmds.c:2278 +#: commands/subscriptioncmds.c:2311 #, c-format msgid "" "could not connect to publisher when attempting to drop replication slot " @@ -11731,7 +11764,7 @@ "\"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2281 +#: commands/subscriptioncmds.c:2314 #, c-format msgid "" "Use %s to disable the subscription, and then use %s to disassociate it from " @@ -11740,27 +11773,27 @@ "Выполните %s, чтобы отключить подписку, а затем выполните %s, чтобы отвязать " "её от слота." -#: commands/subscriptioncmds.c:2312 +#: commands/subscriptioncmds.c:2345 #, c-format msgid "publication name \"%s\" used more than once" msgstr "имя публикации \"%s\" используется неоднократно" -#: commands/subscriptioncmds.c:2356 +#: commands/subscriptioncmds.c:2389 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "публикация \"%s\" уже имеется в подписке \"%s\"" -#: commands/subscriptioncmds.c:2370 +#: commands/subscriptioncmds.c:2403 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "публикация \"%s\" отсутствует в подписке \"%s\"" -#: commands/subscriptioncmds.c:2381 +#: commands/subscriptioncmds.c:2414 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "удалить все публикации из подписки нельзя" -#: commands/subscriptioncmds.c:2438 +#: commands/subscriptioncmds.c:2471 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s требует логическое значение или \"parallel\"" @@ -11823,7 +11856,7 @@ "Выполните DROP MATERIALIZED VIEW для удаления материализованного " "представления." -#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19891 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19886 #: parser/parse_utilcmd.c:2255 #, c-format msgid "index \"%s\" does not exist" @@ -11847,8 +11880,8 @@ msgid "Use DROP TYPE to remove a type." msgstr "Выполните DROP TYPE для удаления типа." -#: commands/tablecmds.c:291 commands/tablecmds.c:14389 -#: commands/tablecmds.c:16950 +#: commands/tablecmds.c:291 commands/tablecmds.c:14384 +#: commands/tablecmds.c:16945 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "сторонняя таблица \"%s\" не существует" @@ -11874,7 +11907,7 @@ "в рамках операции с ограничениями по безопасности нельзя создать временную " "таблицу" -#: commands/tablecmds.c:801 commands/tablecmds.c:15809 +#: commands/tablecmds.c:801 commands/tablecmds.c:15804 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "отношение \"%s\" наследуется неоднократно" @@ -11899,7 +11932,7 @@ msgid "Table \"%s\" contains indexes that are unique." msgstr "Таблица \"%s\" содержит индексы, являющиеся уникальными." -#: commands/tablecmds.c:1338 commands/tablecmds.c:13382 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13377 #, c-format msgid "too many array dimensions" msgstr "слишком много размерностей массива" @@ -11954,7 +11987,7 @@ msgid "cannot truncate temporary tables of other sessions" msgstr "временные таблицы других сеансов нельзя опустошить" -#: commands/tablecmds.c:2606 commands/tablecmds.c:15706 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15701 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "наследование от секционированной таблицы \"%s\" не допускается" @@ -11979,18 +12012,18 @@ "создать временное отношение в качестве секции постоянного отношения \"%s\" " "нельзя" -#: commands/tablecmds.c:2640 commands/tablecmds.c:15685 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15680 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "временное отношение \"%s\" не может наследоваться" -#: commands/tablecmds.c:2650 commands/tablecmds.c:15693 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15688 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "наследование от временного отношения другого сеанса невозможно" #: commands/tablecmds.c:2791 commands/tablecmds.c:2845 -#: commands/tablecmds.c:13065 parser/parse_utilcmd.c:1265 +#: commands/tablecmds.c:13060 parser/parse_utilcmd.c:1265 #: parser/parse_utilcmd.c:1308 parser/parse_utilcmd.c:1735 #: parser/parse_utilcmd.c:1843 #, c-format @@ -12106,7 +12139,7 @@ msgstr "конфликт правил сортировки в столбце \"%s\"" #: commands/tablecmds.c:3164 commands/tablecmds.c:3326 -#: commands/tablecmds.c:7080 parser/parse_expr.c:4771 +#: commands/tablecmds.c:7080 parser/parse_expr.c:4781 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\" и \"%s\"" @@ -12319,12 +12352,12 @@ msgid "cannot add column to a partition" msgstr "добавить столбец в секцию нельзя" -#: commands/tablecmds.c:7072 commands/tablecmds.c:15924 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15919 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "дочерняя таблица \"%s\" имеет другой тип для столбца \"%s\"" -#: commands/tablecmds.c:7078 commands/tablecmds.c:15930 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15925 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "" @@ -12356,7 +12389,7 @@ msgid "column \"%s\" of relation \"%s\" already exists" msgstr "столбец \"%s\" отношения \"%s\" уже существует" -#: commands/tablecmds.c:7546 commands/tablecmds.c:12693 +#: commands/tablecmds.c:7546 commands/tablecmds.c:12688 #, c-format msgid "" "cannot remove constraint from only the partitioned table when partitions " @@ -12367,8 +12400,8 @@ #: commands/tablecmds.c:7547 commands/tablecmds.c:7861 #: commands/tablecmds.c:8039 commands/tablecmds.c:8146 -#: commands/tablecmds.c:8263 commands/tablecmds.c:9082 -#: commands/tablecmds.c:12694 +#: commands/tablecmds.c:8263 commands/tablecmds.c:9077 +#: commands/tablecmds.c:12689 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Не указывайте ключевое слово ONLY." @@ -12376,10 +12409,10 @@ #: commands/tablecmds.c:7583 commands/tablecmds.c:7787 #: commands/tablecmds.c:7929 commands/tablecmds.c:8061 #: commands/tablecmds.c:8190 commands/tablecmds.c:8284 -#: commands/tablecmds.c:8385 commands/tablecmds.c:8542 -#: commands/tablecmds.c:8695 commands/tablecmds.c:8776 -#: commands/tablecmds.c:8910 commands/tablecmds.c:12847 -#: commands/tablecmds.c:14412 commands/tablecmds.c:17039 +#: commands/tablecmds.c:8385 commands/tablecmds.c:8537 +#: commands/tablecmds.c:8690 commands/tablecmds.c:8771 +#: commands/tablecmds.c:8905 commands/tablecmds.c:12842 +#: commands/tablecmds.c:14407 commands/tablecmds.c:17034 #, c-format msgid "cannot alter system column \"%s\"" msgstr "системный столбец \"%s\" нельзя изменить" @@ -12404,7 +12437,7 @@ msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "столбец \"%s\" в родительской таблице помечен как NOT NULL" -#: commands/tablecmds.c:7858 commands/tablecmds.c:9566 +#: commands/tablecmds.c:7858 commands/tablecmds.c:9561 #, c-format msgid "constraint must be added to child tables too" msgstr "ограничение также должно быть добавлено к дочерним таблицам" @@ -12490,24 +12523,24 @@ msgid "column \"%s\" of relation \"%s\" is not a generated column" msgstr "столбец \"%s\" отношения \"%s\" не является генерируемым столбцом" -#: commands/tablecmds.c:8489 +#: commands/tablecmds.c:8484 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "" "ALTER TABLE / DROP EXPRESSION нужно применять также к дочерним таблицам" -#: commands/tablecmds.c:8511 +#: commands/tablecmds.c:8506 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "нельзя удалить генерирующее выражение из наследуемого столбца" -#: commands/tablecmds.c:8550 +#: commands/tablecmds.c:8545 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "" "столбец \"%s\" отношения \"%s\" не является сохранённым генерируемым столбцом" -#: commands/tablecmds.c:8555 +#: commands/tablecmds.c:8550 #, c-format msgid "" "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" @@ -12515,53 +12548,53 @@ "столбец \"%s\" отношения \"%s\" пропускается, так как не является " "сохранённым генерируемым столбцом" -#: commands/tablecmds.c:8633 +#: commands/tablecmds.c:8628 #, c-format msgid "cannot refer to non-index column by number" msgstr "по номеру можно ссылаться только на столбец в индексе" -#: commands/tablecmds.c:8685 +#: commands/tablecmds.c:8680 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "столбец с номером %d отношения \"%s\" не существует" -#: commands/tablecmds.c:8704 +#: commands/tablecmds.c:8699 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "изменить статистику включённого столбца \"%s\" индекса \"%s\" нельзя" -#: commands/tablecmds.c:8709 +#: commands/tablecmds.c:8704 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "" "изменить статистику столбца \"%s\" (не выражения) индекса \"%s\" нельзя" -#: commands/tablecmds.c:8711 +#: commands/tablecmds.c:8706 #, c-format msgid "Alter statistics on table column instead." msgstr "Вместо этого измените статистику для столбца в таблице." -#: commands/tablecmds.c:8957 +#: commands/tablecmds.c:8952 #, c-format msgid "cannot drop column from typed table" msgstr "нельзя удалить столбец в типизированной таблице" -#: commands/tablecmds.c:9020 +#: commands/tablecmds.c:9015 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "столбец \"%s\" в таблице\"%s\" не существует, пропускается" -#: commands/tablecmds.c:9033 +#: commands/tablecmds.c:9028 #, c-format msgid "cannot drop system column \"%s\"" msgstr "нельзя удалить системный столбец \"%s\"" -#: commands/tablecmds.c:9043 +#: commands/tablecmds.c:9038 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "нельзя удалить наследованный столбец \"%s\"" -#: commands/tablecmds.c:9056 +#: commands/tablecmds.c:9051 #, c-format msgid "" "cannot drop column \"%s\" because it is part of the partition key of " @@ -12570,7 +12603,7 @@ "удалить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:9081 +#: commands/tablecmds.c:9076 #, c-format msgid "" "cannot drop column from only the partitioned table when partitions exist" @@ -12578,7 +12611,7 @@ "удалить столбец только из секционированной таблицы, когда существуют секции, " "нельзя" -#: commands/tablecmds.c:9286 +#: commands/tablecmds.c:9281 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned " @@ -12587,14 +12620,14 @@ "ALTER TABLE / ADD CONSTRAINT USING INDEX не поддерживается с " "секционированными таблицами" -#: commands/tablecmds.c:9311 +#: commands/tablecmds.c:9306 #, 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:9648 +#: commands/tablecmds.c:9643 #, c-format msgid "" "cannot use ONLY for foreign key on partitioned table \"%s\" referencing " @@ -12603,7 +12636,7 @@ "нельзя использовать ONLY для стороннего ключа в секционированной таблице " "\"%s\", ссылающегося на отношение \"%s\"" -#: commands/tablecmds.c:9654 +#: commands/tablecmds.c:9649 #, c-format msgid "" "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing " @@ -12612,25 +12645,25 @@ "нельзя добавить со свойством NOT VALID сторонний ключ в секционированной " "таблице \"%s\", ссылающийся на отношение \"%s\"" -#: commands/tablecmds.c:9657 +#: commands/tablecmds.c:9652 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "" "Эта функциональность с секционированными таблицами пока не поддерживается." -#: commands/tablecmds.c:9664 commands/tablecmds.c:10146 +#: commands/tablecmds.c:9659 commands/tablecmds.c:10141 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "указанный объект \"%s\" не является таблицей" -#: commands/tablecmds.c:9687 +#: commands/tablecmds.c:9682 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "" "ограничения в постоянных таблицах могут ссылаться только на постоянные " "таблицы" -#: commands/tablecmds.c:9694 +#: commands/tablecmds.c:9689 #, c-format msgid "" "constraints on unlogged tables may reference only permanent or unlogged " @@ -12639,13 +12672,13 @@ "ограничения в нежурналируемых таблицах могут ссылаться только на постоянные " "или нежурналируемые таблицы" -#: commands/tablecmds.c:9700 +#: commands/tablecmds.c:9695 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "" "ограничения во временных таблицах могут ссылаться только на временные таблицы" -#: commands/tablecmds.c:9704 +#: commands/tablecmds.c:9699 #, c-format msgid "" "constraints on temporary tables must involve temporary tables of this session" @@ -12653,7 +12686,7 @@ "ограничения во временных таблицах должны ссылаться только на временные " "таблицы текущего сеанса" -#: commands/tablecmds.c:9769 commands/tablecmds.c:9775 +#: commands/tablecmds.c:9764 commands/tablecmds.c:9770 #, c-format msgid "" "invalid %s action for foreign key constraint containing generated column" @@ -12661,22 +12694,22 @@ "некорректное действие %s для ограничения внешнего ключа, содержащего " "генерируемый столбец" -#: commands/tablecmds.c:9791 +#: commands/tablecmds.c:9786 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "число столбцов в источнике и назначении внешнего ключа не совпадает" -#: commands/tablecmds.c:9898 +#: commands/tablecmds.c:9893 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "ограничение внешнего ключа \"%s\" нельзя реализовать" -#: commands/tablecmds.c:9900 +#: commands/tablecmds.c:9895 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Столбцы ключа \"%s\" и \"%s\" имеют несовместимые типы: %s и %s." -#: commands/tablecmds.c:10075 +#: commands/tablecmds.c:10070 #, c-format msgid "" "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" @@ -12684,13 +12717,13 @@ "столбец \"%s\", фигурирующий в действии ON DELETE SET, должен входить во " "внешний ключ" -#: commands/tablecmds.c:10446 commands/tablecmds.c:10873 +#: commands/tablecmds.c:10441 commands/tablecmds.c:10868 #: parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:945 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "ограничения внешнего ключа для сторонних таблиц не поддерживаются" -#: commands/tablecmds.c:10856 +#: commands/tablecmds.c:10851 #, c-format msgid "" "cannot attach table \"%s\" as a partition because it is referenced by " @@ -12699,34 +12732,34 @@ "присоединить таблицу \"%s\" в качестве секции нельзя, так как на неё " "ссылается внешний ключ \"%s\"" -#: commands/tablecmds.c:11457 commands/tablecmds.c:11738 -#: commands/tablecmds.c:12650 commands/tablecmds.c:12724 +#: commands/tablecmds.c:11452 commands/tablecmds.c:11733 +#: commands/tablecmds.c:12645 commands/tablecmds.c:12719 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "ограничение \"%s\" в таблице \"%s\" не существует" -#: commands/tablecmds.c:11464 +#: commands/tablecmds.c:11459 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "ограничение \"%s\" в таблице \"%s\" не является внешним ключом" -#: commands/tablecmds.c:11502 +#: commands/tablecmds.c:11497 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "изменить ограничение \"%s\" таблицы \"%s\" нельзя" -#: commands/tablecmds.c:11505 +#: commands/tablecmds.c:11500 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "" "Ограничение \"%s\" является производным от ограничения \"%s\" таблицы \"%s\"." -#: commands/tablecmds.c:11507 +#: commands/tablecmds.c:11502 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "Вместо этого вы можете изменить родительское ограничение." -#: commands/tablecmds.c:11746 +#: commands/tablecmds.c:11741 #, c-format msgid "" "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" @@ -12734,51 +12767,51 @@ "ограничение \"%s\" в таблице \"%s\" не является внешним ключом или " "ограничением-проверкой" -#: commands/tablecmds.c:11823 +#: commands/tablecmds.c:11818 #, c-format msgid "constraint must be validated on child tables too" msgstr "ограничение также должно соблюдаться в дочерних таблицах" -#: commands/tablecmds.c:11910 +#: commands/tablecmds.c:11905 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "столбец \"%s\", указанный в ограничении внешнего ключа, не существует" -#: commands/tablecmds.c:11916 +#: commands/tablecmds.c:11911 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "системные столбцы нельзя использовать во внешних ключах" -#: commands/tablecmds.c:11920 +#: commands/tablecmds.c:11915 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "во внешнем ключе не может быть больше %d столбцов" -#: commands/tablecmds.c:11985 +#: commands/tablecmds.c:11980 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "" "использовать откладываемый первичный ключ в целевой внешней таблице \"%s\" " "нельзя" -#: commands/tablecmds.c:12002 +#: commands/tablecmds.c:11997 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "в целевой внешней таблице \"%s\" нет первичного ключа" -#: commands/tablecmds.c:12070 +#: commands/tablecmds.c:12065 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "в списке столбцов внешнего ключа не должно быть повторений" -#: commands/tablecmds.c:12162 +#: commands/tablecmds.c:12157 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "" "использовать откладываемое ограничение уникальности в целевой внешней " "таблице \"%s\" нельзя" -#: commands/tablecmds.c:12167 +#: commands/tablecmds.c:12162 #, c-format msgid "" "there is no unique constraint matching given keys for referenced table \"%s\"" @@ -12786,32 +12819,32 @@ "в целевой внешней таблице \"%s\" нет ограничения уникальности, " "соответствующего данным ключам" -#: commands/tablecmds.c:12606 +#: commands/tablecmds.c:12601 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "удалить наследованное ограничение \"%s\" таблицы \"%s\" нельзя" -#: commands/tablecmds.c:12656 +#: commands/tablecmds.c:12651 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" в таблице \"%s\" не существует, пропускается" -#: commands/tablecmds.c:12831 +#: commands/tablecmds.c:12826 #, c-format msgid "cannot alter column type of typed table" msgstr "изменить тип столбца в типизированной таблице нельзя" -#: commands/tablecmds.c:12857 +#: commands/tablecmds.c:12852 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "изменяя тип генерируемого столбца, нельзя указывать USING" -#: commands/tablecmds.c:12868 +#: commands/tablecmds.c:12863 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "изменить наследованный столбец \"%s\" нельзя" -#: commands/tablecmds.c:12877 +#: commands/tablecmds.c:12872 #, c-format msgid "" "cannot alter column \"%s\" because it is part of the partition key of " @@ -12820,7 +12853,7 @@ "изменить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:12927 +#: commands/tablecmds.c:12922 #, c-format msgid "" "result of USING clause for column \"%s\" cannot be cast automatically to " @@ -12828,45 +12861,45 @@ msgstr "" "результат USING для столбца \"%s\" нельзя автоматически привести к типу %s" -#: commands/tablecmds.c:12930 +#: commands/tablecmds.c:12925 #, c-format msgid "You might need to add an explicit cast." msgstr "Возможно, необходимо добавить явное приведение." -#: commands/tablecmds.c:12934 +#: commands/tablecmds.c:12929 #, 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:12938 +#: commands/tablecmds.c:12933 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Возможно, необходимо указать \"USING %s::%s\"." -#: commands/tablecmds.c:13037 +#: commands/tablecmds.c:13032 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "изменить наследованный столбец \"%s\" отношения \"%s\" нельзя" -#: commands/tablecmds.c:13066 +#: commands/tablecmds.c:13061 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Выражение USING ссылается на тип всей строки таблицы." -#: commands/tablecmds.c:13077 +#: commands/tablecmds.c:13072 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "" "тип наследованного столбца \"%s\" должен быть изменён и в дочерних таблицах" -#: commands/tablecmds.c:13202 +#: commands/tablecmds.c:13197 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "нельзя изменить тип столбца \"%s\" дважды" -#: commands/tablecmds.c:13240 +#: commands/tablecmds.c:13235 #, c-format msgid "" "generation expression for column \"%s\" cannot be cast automatically to type " @@ -12875,160 +12908,160 @@ "генерирующее выражение для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:13245 +#: commands/tablecmds.c:13240 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "" "значение по умолчанию для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:13549 +#: commands/tablecmds.c:13544 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "изменить тип столбца, задействованного в функции или процедуре, нельзя" -#: commands/tablecmds.c:13550 commands/tablecmds.c:13565 -#: commands/tablecmds.c:13585 commands/tablecmds.c:13604 -#: commands/tablecmds.c:13663 +#: commands/tablecmds.c:13545 commands/tablecmds.c:13560 +#: commands/tablecmds.c:13580 commands/tablecmds.c:13599 +#: commands/tablecmds.c:13658 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s зависит от столбца \"%s\"" -#: commands/tablecmds.c:13564 +#: commands/tablecmds.c:13559 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "" "изменить тип столбца, задействованного в представлении или правиле, нельзя" -#: commands/tablecmds.c:13584 +#: commands/tablecmds.c:13579 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "изменить тип столбца, задействованного в определении триггера, нельзя" -#: commands/tablecmds.c:13603 +#: commands/tablecmds.c:13598 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "изменить тип столбца, задействованного в определении политики, нельзя" -#: commands/tablecmds.c:13634 +#: commands/tablecmds.c:13629 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "изменить тип столбца, задействованного в генерируемом столбце, нельзя" -#: commands/tablecmds.c:13635 +#: commands/tablecmds.c:13630 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Столбец \"%s\" используется генерируемым столбцом \"%s\"." -#: commands/tablecmds.c:13662 +#: commands/tablecmds.c:13657 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "" "изменить тип столбца, задействованного в заданном для публикации предложении " "WHERE, нельзя" -#: commands/tablecmds.c:14520 commands/tablecmds.c:14532 +#: commands/tablecmds.c:14515 commands/tablecmds.c:14527 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "сменить владельца индекса \"%s\" нельзя" -#: commands/tablecmds.c:14522 commands/tablecmds.c:14534 +#: commands/tablecmds.c:14517 commands/tablecmds.c:14529 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Однако возможно сменить владельца таблицы, содержащей этот индекс." -#: commands/tablecmds.c:14548 +#: commands/tablecmds.c:14543 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "сменить владельца последовательности \"%s\" нельзя" -#: commands/tablecmds.c:14573 +#: commands/tablecmds.c:14568 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "сменить владельца отношения \"%s\" нельзя" -#: commands/tablecmds.c:15040 +#: commands/tablecmds.c:15035 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одной инструкции не может быть несколько подкоманд SET TABLESPACE" -#: commands/tablecmds.c:15117 +#: commands/tablecmds.c:15112 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "задать параметры отношения \"%s\" нельзя" -#: commands/tablecmds.c:15151 commands/view.c:440 +#: commands/tablecmds.c:15146 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "" "WITH CHECK OPTION поддерживается только с автообновляемыми представлениями" -#: commands/tablecmds.c:15402 +#: commands/tablecmds.c:15397 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "" "в табличных пространствах есть только таблицы, индексы и материализованные " "представления" -#: commands/tablecmds.c:15414 +#: commands/tablecmds.c:15409 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "перемещать объекты в/из табличного пространства pg_global нельзя" -#: commands/tablecmds.c:15506 +#: commands/tablecmds.c:15501 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "" "обработка прерывается из-за невозможности заблокировать отношение \"%s.%s\"" -#: commands/tablecmds.c:15522 +#: commands/tablecmds.c:15517 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "в табличном пространстве \"%s\" не найдены подходящие отношения" -#: commands/tablecmds.c:15644 +#: commands/tablecmds.c:15639 #, c-format msgid "cannot change inheritance of typed table" msgstr "изменить наследование типизированной таблицы нельзя" -#: commands/tablecmds.c:15649 commands/tablecmds.c:16149 +#: commands/tablecmds.c:15644 commands/tablecmds.c:16144 #, c-format msgid "cannot change inheritance of a partition" msgstr "изменить наследование секции нельзя" -#: commands/tablecmds.c:15654 +#: commands/tablecmds.c:15649 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "изменить наследование секционированной таблицы нельзя" -#: commands/tablecmds.c:15700 +#: commands/tablecmds.c:15695 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "наследование для временного отношения другого сеанса невозможно" -#: commands/tablecmds.c:15713 +#: commands/tablecmds.c:15708 #, c-format msgid "cannot inherit from a partition" msgstr "наследование от секции невозможно" -#: commands/tablecmds.c:15735 commands/tablecmds.c:18603 +#: commands/tablecmds.c:15730 commands/tablecmds.c:18598 #, c-format msgid "circular inheritance not allowed" msgstr "циклическое наследование недопустимо" -#: commands/tablecmds.c:15736 commands/tablecmds.c:18604 +#: commands/tablecmds.c:15731 commands/tablecmds.c:18599 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" уже является потомком \"%s\"." -#: commands/tablecmds.c:15749 +#: commands/tablecmds.c:15744 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "" "триггер \"%s\" не позволяет таблице \"%s\" стать потомком в иерархии " "наследования" -#: commands/tablecmds.c:15751 +#: commands/tablecmds.c:15746 #, c-format msgid "" "ROW triggers with transition tables are not supported in inheritance " @@ -13037,34 +13070,34 @@ "Триггеры ROW с переходными таблицами не поддерживаются в иерархиях " "наследования." -#: commands/tablecmds.c:15940 +#: commands/tablecmds.c:15935 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "столбец \"%s\" в дочерней таблице должен быть помечен как NOT NULL" -#: commands/tablecmds.c:15949 +#: commands/tablecmds.c:15944 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "столбец \"%s\" в дочерней таблице должен быть генерируемым" -#: commands/tablecmds.c:15953 +#: commands/tablecmds.c:15948 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "столбец \"%s\" в дочерней таблице должен быть не генерируемым" -#: commands/tablecmds.c:15991 +#: commands/tablecmds.c:15986 #, c-format msgid "child table is missing column \"%s\"" msgstr "в дочерней таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:16072 +#: commands/tablecmds.c:16067 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "" "дочерняя таблица \"%s\" содержит другое определение ограничения-проверки " "\"%s\"" -#: commands/tablecmds.c:16079 +#: commands/tablecmds.c:16074 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on child table " @@ -13073,7 +13106,7 @@ "ограничение \"%s\" конфликтует с ненаследуемым ограничением дочерней таблицы " "\"%s\"" -#: commands/tablecmds.c:16089 +#: commands/tablecmds.c:16084 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" @@ -13081,82 +13114,82 @@ "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "дочерней таблицы \"%s\"" -#: commands/tablecmds.c:16127 +#: commands/tablecmds.c:16122 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "в дочерней таблице не хватает ограничения \"%s\"" -#: commands/tablecmds.c:16213 +#: commands/tablecmds.c:16208 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "" "секция \"%s\" уже ожидает отсоединения от секционированной таблицы \"%s.%s\"" -#: commands/tablecmds.c:16242 commands/tablecmds.c:16288 +#: commands/tablecmds.c:16237 commands/tablecmds.c:16283 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "отношение \"%s\" не является секцией отношения \"%s\"" -#: commands/tablecmds.c:16294 +#: commands/tablecmds.c:16289 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "отношение \"%s\" не является предком отношения \"%s\"" -#: commands/tablecmds.c:16521 +#: commands/tablecmds.c:16516 #, c-format msgid "typed tables cannot inherit" msgstr "типизированные таблицы не могут наследоваться" -#: commands/tablecmds.c:16551 +#: commands/tablecmds.c:16546 #, c-format msgid "table is missing column \"%s\"" msgstr "в таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:16562 +#: commands/tablecmds.c:16557 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблица содержит столбец \"%s\", тогда как тип требует \"%s\"" -#: commands/tablecmds.c:16571 +#: commands/tablecmds.c:16566 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблица \"%s\" содержит столбец \"%s\" другого типа" -#: commands/tablecmds.c:16585 +#: commands/tablecmds.c:16580 #, c-format msgid "table has extra column \"%s\"" msgstr "таблица содержит лишний столбец \"%s\"" -#: commands/tablecmds.c:16637 +#: commands/tablecmds.c:16632 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - это не типизированная таблица" -#: commands/tablecmds.c:16811 +#: commands/tablecmds.c:16806 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать неуникальный индекс \"%s\"" -#: commands/tablecmds.c:16817 +#: commands/tablecmds.c:16812 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать не непосредственный индекс " "\"%s\"" -#: commands/tablecmds.c:16823 +#: commands/tablecmds.c:16818 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать индекс с выражением \"%s\"" -#: commands/tablecmds.c:16829 +#: commands/tablecmds.c:16824 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "для идентификации реплики нельзя использовать частичный индекс \"%s\"" -#: commands/tablecmds.c:16846 +#: commands/tablecmds.c:16841 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column %d is a " @@ -13165,7 +13198,7 @@ "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "%d - системный" -#: commands/tablecmds.c:16853 +#: commands/tablecmds.c:16848 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column \"%s\" is " @@ -13174,13 +13207,13 @@ "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "\"%s\" допускает NULL" -#: commands/tablecmds.c:17105 +#: commands/tablecmds.c:17100 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "" "изменить состояние журналирования таблицы %s нельзя, так как она временная" -#: commands/tablecmds.c:17129 +#: commands/tablecmds.c:17124 #, c-format msgid "" "cannot change table \"%s\" to unlogged because it is part of a publication" @@ -13188,12 +13221,12 @@ "таблицу \"%s\" нельзя сделать нежурналируемой, так как она включена в " "публикацию" -#: commands/tablecmds.c:17131 +#: commands/tablecmds.c:17126 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Нежурналируемые отношения не поддерживают репликацию." -#: commands/tablecmds.c:17176 +#: commands/tablecmds.c:17171 #, c-format msgid "" "could not change table \"%s\" to logged because it references unlogged table " @@ -13202,7 +13235,7 @@ "не удалось сделать таблицу \"%s\" журналируемой, так как она ссылается на " "нежурналируемую таблицу \"%s\"" -#: commands/tablecmds.c:17186 +#: commands/tablecmds.c:17181 #, c-format msgid "" "could not change table \"%s\" to unlogged because it references logged table " @@ -13211,91 +13244,91 @@ "не удалось сделать таблицу \"%s\" нежурналируемой, так как она ссылается на " "журналируемую таблицу \"%s\"" -#: commands/tablecmds.c:17244 +#: commands/tablecmds.c:17239 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "переместить последовательность с владельцем в другую схему нельзя" -#: commands/tablecmds.c:17352 +#: commands/tablecmds.c:17347 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "отношение \"%s\" уже существует в схеме \"%s\"" -#: commands/tablecmds.c:17777 +#: commands/tablecmds.c:17772 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" - это не таблица и не материализованное представление" -#: commands/tablecmds.c:17930 +#: commands/tablecmds.c:17925 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - это не составной тип" -#: commands/tablecmds.c:17960 +#: commands/tablecmds.c:17955 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "сменить схему индекса \"%s\" нельзя" -#: commands/tablecmds.c:17962 commands/tablecmds.c:17976 +#: commands/tablecmds.c:17957 commands/tablecmds.c:17971 #, c-format msgid "Change the schema of the table instead." msgstr "Однако возможно сменить владельца таблицы." -#: commands/tablecmds.c:17966 +#: commands/tablecmds.c:17961 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "сменить схему составного типа \"%s\" нельзя" -#: commands/tablecmds.c:17974 +#: commands/tablecmds.c:17969 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "сменить схему TOAST-таблицы \"%s\" нельзя" -#: commands/tablecmds.c:18006 +#: commands/tablecmds.c:18001 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "стратегия секционирования по списку не поддерживает несколько столбцов" -#: commands/tablecmds.c:18072 +#: commands/tablecmds.c:18067 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "столбец \"%s\", упомянутый в ключе секционирования, не существует" -#: commands/tablecmds.c:18080 +#: commands/tablecmds.c:18075 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "системный столбец \"%s\" нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:18091 commands/tablecmds.c:18170 +#: commands/tablecmds.c:18086 commands/tablecmds.c:18165 #, c-format msgid "cannot use generated column in partition key" msgstr "генерируемый столбец нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:18160 +#: commands/tablecmds.c:18155 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "" "выражения ключей секционирования не могут содержать ссылки на системный " "столбец" -#: commands/tablecmds.c:18221 +#: commands/tablecmds.c:18216 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "" "функции в выражении ключа секционирования должны быть помечены как IMMUTABLE" -#: commands/tablecmds.c:18230 +#: commands/tablecmds.c:18225 #, c-format msgid "cannot use constant expression as partition key" msgstr "" "в качестве ключа секционирования нельзя использовать константное выражение" -#: commands/tablecmds.c:18251 +#: commands/tablecmds.c:18246 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не удалось определить правило сортировки для выражения секционирования" -#: commands/tablecmds.c:18286 +#: commands/tablecmds.c:18281 #, c-format msgid "" "You must specify a hash operator class or define a default hash operator " @@ -13304,7 +13337,7 @@ "Вы должны указать класс операторов хеширования или определить класс " "операторов хеширования по умолчанию для этого типа данных." -#: commands/tablecmds.c:18292 +#: commands/tablecmds.c:18287 #, c-format msgid "" "You must specify a btree operator class or define a default btree operator " @@ -13313,27 +13346,27 @@ "Вы должны указать класс операторов B-дерева или определить класс операторов " "B-дерева по умолчанию для этого типа данных." -#: commands/tablecmds.c:18543 +#: commands/tablecmds.c:18538 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" уже является секцией" -#: commands/tablecmds.c:18549 +#: commands/tablecmds.c:18544 #, c-format msgid "cannot attach a typed table as partition" msgstr "подключить типизированную таблицу в качестве секции нельзя" -#: commands/tablecmds.c:18565 +#: commands/tablecmds.c:18560 #, c-format msgid "cannot attach inheritance child as partition" msgstr "подключить потомок в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:18579 +#: commands/tablecmds.c:18574 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "подключить родитель в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:18613 +#: commands/tablecmds.c:18608 #, c-format msgid "" "cannot attach a temporary relation as partition of permanent relation \"%s\"" @@ -13341,7 +13374,7 @@ "подключить временное отношение в качестве секции постоянного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:18621 +#: commands/tablecmds.c:18616 #, c-format msgid "" "cannot attach a permanent relation as partition of temporary relation \"%s\"" @@ -13349,102 +13382,102 @@ "подключить постоянное отношение в качестве секции временного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:18629 +#: commands/tablecmds.c:18624 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "подключить секцию к временному отношению в другом сеансе нельзя" -#: commands/tablecmds.c:18636 +#: commands/tablecmds.c:18631 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "" "подключить временное отношение из другого сеанса в качестве секции нельзя" -#: commands/tablecmds.c:18656 +#: commands/tablecmds.c:18651 #, c-format msgid "table \"%s\" being attached contains an identity column \"%s\"" msgstr "присоединяемая таблица \"%s\" содержит столбец идентификации \"%s\"" -#: commands/tablecmds.c:18658 +#: commands/tablecmds.c:18653 #, c-format msgid "The new partition may not contain an identity column." msgstr "Новая секция не может содержать столбец идентификации." -#: commands/tablecmds.c:18666 +#: commands/tablecmds.c:18661 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "" "таблица \"%s\" содержит столбец \"%s\", отсутствующий в родителе \"%s\"" -#: commands/tablecmds.c:18669 +#: commands/tablecmds.c:18664 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "" "Новая секция может содержать только столбцы, имеющиеся в родительской " "таблице." -#: commands/tablecmds.c:18681 +#: commands/tablecmds.c:18676 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "триггер \"%s\" не позволяет сделать таблицу \"%s\" секцией" -#: commands/tablecmds.c:18683 +#: commands/tablecmds.c:18678 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "Триггеры ROW с переходными таблицами для секций не поддерживаются." -#: commands/tablecmds.c:18859 +#: commands/tablecmds.c:18854 #, c-format msgid "" "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "" "нельзя присоединить стороннюю таблицу \"%s\" в качестве секции таблицы \"%s\"" -#: commands/tablecmds.c:18862 +#: commands/tablecmds.c:18857 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Секционированная таблица \"%s\" содержит уникальные индексы." -#: commands/tablecmds.c:19185 +#: commands/tablecmds.c:19180 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "" "секции нельзя отсоединять в режиме CONCURRENTLY, когда существует секция по " "умолчанию" -#: commands/tablecmds.c:19297 +#: commands/tablecmds.c:19292 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "секционированная таблица \"%s\" была параллельно удалена" -#: commands/tablecmds.c:19303 +#: commands/tablecmds.c:19298 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "секция \"%s\" была параллельно удалена" -#: commands/tablecmds.c:19928 commands/tablecmds.c:19948 -#: commands/tablecmds.c:19969 commands/tablecmds.c:19988 -#: commands/tablecmds.c:20038 +#: commands/tablecmds.c:19923 commands/tablecmds.c:19943 +#: commands/tablecmds.c:19964 commands/tablecmds.c:19983 +#: commands/tablecmds.c:20033 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "нельзя присоединить индекс \"%s\" в качестве секции индекса \"%s\"" -#: commands/tablecmds.c:19931 +#: commands/tablecmds.c:19926 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Индекс \"%s\" уже присоединён к другому индексу." -#: commands/tablecmds.c:19951 +#: commands/tablecmds.c:19946 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Индекс \"%s\" не является индексом какой-либо секции таблицы \"%s\"." -#: commands/tablecmds.c:19972 +#: commands/tablecmds.c:19967 #, c-format msgid "The index definitions do not match." msgstr "Определения индексов не совпадают." -#: commands/tablecmds.c:19991 +#: commands/tablecmds.c:19986 #, c-format msgid "" "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint " @@ -13453,27 +13486,27 @@ "Индекс \"%s\" принадлежит ограничению в таблице \"%s\", но для индекса " "\"%s\" ограничения нет." -#: commands/tablecmds.c:20041 +#: commands/tablecmds.c:20036 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "К секции \"%s\" уже присоединён другой индекс." -#: commands/tablecmds.c:20277 +#: commands/tablecmds.c:20272 #, c-format msgid "column data type %s does not support compression" msgstr "тим данных столбца %s не поддерживает сжатие" -#: commands/tablecmds.c:20284 +#: commands/tablecmds.c:20279 #, c-format msgid "invalid compression method \"%s\"" msgstr "неверный метод сжатия \"%s\"" -#: commands/tablecmds.c:20310 +#: commands/tablecmds.c:20305 #, c-format msgid "invalid storage type \"%s\"" msgstr "неверный тип хранилища \"%s\"" -#: commands/tablecmds.c:20320 +#: commands/tablecmds.c:20315 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип данных столбца %s совместим только с хранилищем PLAIN" @@ -14028,7 +14061,7 @@ "Создайте тип в виде оболочки, затем определите для него функции ввода-вывода " "и в завершение выполните полноценную команду CREATE TYPE." -#: commands/typecmds.c:331 commands/typecmds.c:1460 commands/typecmds.c:4480 +#: commands/typecmds.c:331 commands/typecmds.c:1467 commands/typecmds.c:4487 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "атрибут типа \"%s\" не распознан" @@ -14048,7 +14081,7 @@ msgid "alignment \"%s\" not recognized" msgstr "тип выравнивания \"%s\" не распознан" -#: commands/typecmds.c:454 commands/typecmds.c:4354 +#: commands/typecmds.c:454 commands/typecmds.c:4361 #, c-format msgid "storage \"%s\" not recognized" msgstr "неизвестная стратегия хранения \"%s\"" @@ -14098,62 +14131,62 @@ msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "ограничения-проверки для доменов не могут иметь свойства NO INHERIT" -#: commands/typecmds.c:980 commands/typecmds.c:2940 +#: commands/typecmds.c:980 commands/typecmds.c:2947 #, c-format msgid "unique constraints not possible for domains" msgstr "ограничения уникальности невозможны для доменов" -#: commands/typecmds.c:986 commands/typecmds.c:2946 +#: commands/typecmds.c:986 commands/typecmds.c:2953 #, c-format msgid "primary key constraints not possible for domains" msgstr "ограничения первичного ключа невозможны для доменов" -#: commands/typecmds.c:992 commands/typecmds.c:2952 +#: commands/typecmds.c:992 commands/typecmds.c:2959 #, c-format msgid "exclusion constraints not possible for domains" msgstr "ограничения-исключения невозможны для доменов" -#: commands/typecmds.c:998 commands/typecmds.c:2958 +#: commands/typecmds.c:998 commands/typecmds.c:2965 #, c-format msgid "foreign key constraints not possible for domains" msgstr "ограничения внешних ключей невозможны для доменов" -#: commands/typecmds.c:1007 commands/typecmds.c:2967 +#: commands/typecmds.c:1007 commands/typecmds.c:2974 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "" "возможность определения отложенных ограничений для доменов не поддерживается" -#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2563 #, c-format msgid "%s is not an enum" msgstr "\"%s\" не является перечислением" -#: commands/typecmds.c:1468 +#: commands/typecmds.c:1475 #, c-format msgid "type attribute \"subtype\" is required" msgstr "требуется атрибут типа \"subtype\"" -#: commands/typecmds.c:1473 +#: commands/typecmds.c:1480 #, c-format msgid "range subtype cannot be %s" msgstr "%s не может быть подтипом диапазона" -#: commands/typecmds.c:1492 +#: commands/typecmds.c:1499 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "" "указано правило сортировки для диапазона, но подтип не поддерживает " "сортировку" -#: commands/typecmds.c:1502 +#: commands/typecmds.c:1509 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "" "функцию получения канонического диапазона нельзя задать без предварительно " "созданного типа-пустышки" -#: commands/typecmds.c:1503 +#: commands/typecmds.c:1510 #, c-format msgid "" "Create the type as a shell type, then create its canonicalization function, " @@ -14162,96 +14195,96 @@ "Создайте тип в виде оболочки, затем определите для него функции приведения к " "каноническому виду и в завершение выполните полноценную команду CREATE TYPE." -#: commands/typecmds.c:1975 +#: commands/typecmds.c:1982 #, c-format msgid "type input function %s has multiple matches" msgstr "функция ввода типа %s присутствует в нескольких экземплярах" -#: commands/typecmds.c:1993 +#: commands/typecmds.c:2000 #, c-format msgid "type input function %s must return type %s" msgstr "функция ввода типа %s должна возвращать тип %s" -#: commands/typecmds.c:2009 +#: commands/typecmds.c:2016 #, c-format msgid "type input function %s should not be volatile" msgstr "функция ввода типа %s не должна быть изменчивой" -#: commands/typecmds.c:2037 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s must return type %s" msgstr "функция вывода типа %s должна возвращать тип %s" -#: commands/typecmds.c:2044 +#: commands/typecmds.c:2051 #, c-format msgid "type output function %s should not be volatile" msgstr "функция вывода типа %s не должна быть изменчивой" -#: commands/typecmds.c:2073 +#: commands/typecmds.c:2080 #, c-format msgid "type receive function %s has multiple matches" msgstr "функция получения типа %s присутствует в нескольких экземплярах" -#: commands/typecmds.c:2091 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s must return type %s" msgstr "функция получения типа %s должна возвращать тип %s" -#: commands/typecmds.c:2098 +#: commands/typecmds.c:2105 #, c-format msgid "type receive function %s should not be volatile" msgstr "функция получения типа %s не должна быть изменчивой" -#: commands/typecmds.c:2126 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s must return type %s" msgstr "функция отправки типа %s должна возвращать тип %s" -#: commands/typecmds.c:2133 +#: commands/typecmds.c:2140 #, c-format msgid "type send function %s should not be volatile" msgstr "функция отправки типа %s не должна быть изменчивой" -#: commands/typecmds.c:2160 +#: commands/typecmds.c:2167 #, c-format msgid "typmod_in function %s must return type %s" msgstr "функция TYPMOD_IN %s должна возвращать тип %s" -#: commands/typecmds.c:2167 +#: commands/typecmds.c:2174 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "функция ввода модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:2194 +#: commands/typecmds.c:2201 #, c-format msgid "typmod_out function %s must return type %s" msgstr "функция TYPMOD_OUT %s должна возвращать тип %s" -#: commands/typecmds.c:2201 +#: commands/typecmds.c:2208 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "функция вывода модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:2228 +#: commands/typecmds.c:2235 #, c-format msgid "type analyze function %s must return type %s" msgstr "функция анализа типа %s должна возвращать тип %s" -#: commands/typecmds.c:2257 +#: commands/typecmds.c:2264 #, c-format msgid "type subscripting function %s must return type %s" msgstr "" "функция %s, реализующая для типа обращение по индексу, должна возвращать тип " "%s" -#: commands/typecmds.c:2267 +#: commands/typecmds.c:2274 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "" "для пользовательских типов нельзя использовать функцию-обработчик обращения " "по индексу %s" -#: commands/typecmds.c:2313 +#: commands/typecmds.c:2320 #, c-format msgid "" "You must specify an operator class for the range type or define a default " @@ -14260,141 +14293,141 @@ "Вы должны указать класс операторов для типа диапазона или определить класс " "операторов по умолчанию для этого подтипа." -#: commands/typecmds.c:2344 +#: commands/typecmds.c:2351 #, c-format msgid "range canonical function %s must return range type" msgstr "" "функция получения канонического диапазона %s должна возвращать диапазон" -#: commands/typecmds.c:2350 +#: commands/typecmds.c:2357 #, c-format msgid "range canonical function %s must be immutable" msgstr "" "функция получения канонического диапазона %s должна быть постоянной " "(IMMUTABLE)" -#: commands/typecmds.c:2386 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "функция различий для подтипа диапазона (%s) должна возвращать тип %s" -#: commands/typecmds.c:2393 +#: commands/typecmds.c:2400 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "" "функция различий для подтипа диапазона (%s) должна быть постоянной " "(IMMUTABLE)" -#: commands/typecmds.c:2420 +#: commands/typecmds.c:2427 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "значение OID массива в pg_type не задано в режиме двоичного обновления" -#: commands/typecmds.c:2453 +#: commands/typecmds.c:2460 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "" "значение OID мультидиапазона в pg_type не задано в режиме двоичного " "обновления" -#: commands/typecmds.c:2486 +#: commands/typecmds.c:2493 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "" "значение OID массива мультидиапазонов в pg_type не задано в режиме двоичного " "обновления" -#: commands/typecmds.c:2868 commands/typecmds.c:3093 +#: commands/typecmds.c:2875 commands/typecmds.c:3100 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "ограничение \"%s\" для домена \"%s\" не существует" -#: commands/typecmds.c:2872 +#: commands/typecmds.c:2879 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" для домена \"%s\" не существует, пропускается" -#: commands/typecmds.c:3100 +#: commands/typecmds.c:3107 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "" "ограничение \"%s\" для домена \"%s\" не является ограничением-проверкой" -#: commands/typecmds.c:3180 +#: commands/typecmds.c:3187 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "столбец \"%s\" таблицы \"%s\" содержит значения NULL" -#: commands/typecmds.c:3269 +#: commands/typecmds.c:3276 #, c-format msgid "" "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "" "столбец \"%s\" таблицы \"%s\" содержит значения, нарушающие новое ограничение" -#: commands/typecmds.c:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 -#: commands/typecmds.c:4073 +#: commands/typecmds.c:3505 commands/typecmds.c:3779 commands/typecmds.c:3864 +#: commands/typecmds.c:4080 #, c-format msgid "%s is not a domain" msgstr "\"%s\" - это не домен" -#: commands/typecmds.c:3532 commands/typecmds.c:3686 +#: commands/typecmds.c:3539 commands/typecmds.c:3693 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ограничение \"%s\" для домена \"%s\" уже существует" -#: commands/typecmds.c:3583 +#: commands/typecmds.c:3590 #, c-format msgid "cannot use table references in domain check constraint" msgstr "в ограничении-проверке для домена нельзя ссылаться на таблицы" -#: commands/typecmds.c:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 +#: commands/typecmds.c:3791 commands/typecmds.c:3876 commands/typecmds.c:4230 #, c-format msgid "%s is a table's row type" msgstr "%s - это тип строк таблицы" -#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 +#: commands/typecmds.c:3801 commands/typecmds.c:3886 commands/typecmds.c:4128 #, c-format msgid "cannot alter array type %s" msgstr "изменить тип массива \"%s\" нельзя" -#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 +#: commands/typecmds.c:3803 commands/typecmds.c:3888 commands/typecmds.c:4130 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Однако можно изменить тип %s, что повлечёт изменение типа массива." -#: commands/typecmds.c:3892 +#: commands/typecmds.c:3899 #, c-format msgid "cannot alter multirange type %s" msgstr "изменить мультидиапазонный тип %s нельзя" -#: commands/typecmds.c:3895 +#: commands/typecmds.c:3902 #, c-format msgid "You can alter type %s, which will alter the multirange type as well." msgstr "" "Однако можно изменить тип %s, что повлечёт изменение мультидиапазонного типа." -#: commands/typecmds.c:4202 +#: commands/typecmds.c:4209 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "тип \"%s\" уже существует в схеме \"%s\"" -#: commands/typecmds.c:4382 +#: commands/typecmds.c:4389 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "сменить вариант хранения типа на PLAIN нельзя" -#: commands/typecmds.c:4475 +#: commands/typecmds.c:4482 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "у типа нельзя изменить атрибут \"%s\"" -#: commands/typecmds.c:4493 +#: commands/typecmds.c:4500 #, c-format msgid "must be superuser to alter a type" msgstr "для модификации типа нужно быть суперпользователем" -#: commands/typecmds.c:4514 commands/typecmds.c:4523 +#: commands/typecmds.c:4521 commands/typecmds.c:4530 #, c-format msgid "%s is not a base type" msgstr "%s — не базовый тип" @@ -14870,7 +14903,7 @@ msgid "cutoff for removing and freezing tuples is far in the past" msgstr "момент отсечки для удаления и замораживания кортежей далеко в прошлом" -#: commands/vacuum.c:1152 commands/vacuum.c:1157 +#: commands/vacuum.c:1152 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -14887,6 +14920,17 @@ msgid "cutoff for freezing multixacts is far in the past" msgstr "момент отсечки для замораживания мультитранзакций далеко в прошлом" +#: commands/vacuum.c:1157 +#, 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:1912 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" @@ -15305,8 +15349,8 @@ msgstr "В таблице задан тип %s, а в запросе ожидается %s." #: executor/execExprInterp.c:2115 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 -#: utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1745 +#: utils/cache/typcache.c:1904 utils/cache/typcache.c:2051 #: utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" @@ -15332,8 +15376,8 @@ "элементов %s." #: executor/execExprInterp.c:2953 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5599 -#: utils/adt/arrayfuncs.c:6118 utils/adt/arraysubs.c:150 +#: utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5608 +#: utils/adt/arrayfuncs.c:6125 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" @@ -15355,7 +15399,7 @@ #: utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 #: utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 #: utils/adt/arrayfuncs.c:3533 utils/adt/arrayfuncs.c:5371 -#: utils/adt/arrayfuncs.c:6210 utils/adt/arrayfuncs.c:6554 +#: utils/adt/arrayfuncs.c:6217 utils/adt/arrayfuncs.c:6561 #: utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 #: utils/adt/arrayutils.c:99 #, c-format @@ -15637,7 +15681,7 @@ #: executor/execReplication.c:352 parser/parse_cte.c:303 #: parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1343 #: utils/adt/array_userfuncs.c:1486 utils/adt/arrayfuncs.c:3858 -#: utils/adt/arrayfuncs.c:4413 utils/adt/arrayfuncs.c:6434 +#: utils/adt/arrayfuncs.c:4413 utils/adt/arrayfuncs.c:6441 #: utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" @@ -15891,7 +15935,7 @@ msgid "could not rewind hash-join temporary file" msgstr "не удалось переместиться во временном файле хеш-соединения" -#: executor/nodeIndexonlyscan.c:239 +#: executor/nodeIndexonlyscan.c:221 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "" @@ -17370,12 +17414,12 @@ msgstr "" "Пользователь \"%s\" имеет пароль, неподходящий для аутентификации по MD5." -#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 +#: libpq/crypt.c:204 libpq/crypt.c:246 libpq/crypt.c:267 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Пароль не подходит для пользователя \"%s\"." -#: libpq/crypt.c:284 +#: libpq/crypt.c:286 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Пароль пользователя \"%s\" представлен в неизвестном формате." @@ -17913,7 +17957,7 @@ msgid "could not receive data from client: %m" msgstr "не удалось получить данные от клиента: %m" -#: libpq/pqcomm.c:1149 tcop/postgres.c:4537 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4553 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "закрытие подключения из-за потери синхронизации протокола" @@ -18395,7 +18439,7 @@ msgid "could not implement %s" msgstr "не удалось реализовать %s" -#: optimizer/util/clauses.c:4962 +#: optimizer/util/clauses.c:4973 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "внедрённая в код SQL-функция \"%s\"" @@ -19362,7 +19406,7 @@ #: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 #: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 #: parser/parse_expr.c:2155 parser/parse_expr.c:2763 parser/parse_expr.c:3414 -#: parser/parse_expr.c:3643 parser/parse_target.c:998 +#: parser/parse_expr.c:3643 parser/parse_expr.c:4079 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "привести тип %s к %s нельзя" @@ -20068,45 +20112,45 @@ msgid "aggregate ORDER BY is not implemented for window functions" msgstr "агрегатное предложение ORDER BY для оконных функций не реализовано" -#: parser/parse_expr.c:4081 +#: parser/parse_expr.c:4091 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" msgstr "" "предложение JSON FORMAT ENCODING можно использовать только с типом bytea" -#: parser/parse_expr.c:4101 +#: parser/parse_expr.c:4111 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "в предикате IS JSON нельзя использовать тип %s" -#: parser/parse_expr.c:4127 parser/parse_expr.c:4248 +#: parser/parse_expr.c:4137 parser/parse_expr.c:4258 #, c-format msgid "cannot use type %s in RETURNING clause of %s" msgstr "тип %s нельзя использовать в предложении RETURNING функции %s" -#: parser/parse_expr.c:4129 +#: parser/parse_expr.c:4139 #, c-format msgid "Try returning json or jsonb." msgstr "Попробуйте возвратить тип json или jsonb." -#: parser/parse_expr.c:4177 +#: parser/parse_expr.c:4187 #, c-format msgid "cannot use non-string types with WITH UNIQUE KEYS clause" msgstr "" "с предложением WITH UNIQUE KEYS можно использовать только строковые типы " "данных" -#: parser/parse_expr.c:4251 +#: parser/parse_expr.c:4261 #, c-format msgid "Try returning a string type or bytea." msgstr "Попробуйте возвратить строковый тип или bytea." -#: parser/parse_expr.c:4319 +#: parser/parse_expr.c:4329 #, c-format msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" msgstr "FORMAT JSON не может указываться в предложении RETURNING %s()" -#: parser/parse_expr.c:4332 +#: parser/parse_expr.c:4342 #, c-format msgid "" "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" @@ -20114,8 +20158,8 @@ "когда используется WITH WRAPPER, поведение QUOTES в SQL/JSON задать нельзя" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4346 parser/parse_expr.c:4375 parser/parse_expr.c:4406 -#: parser/parse_expr.c:4432 parser/parse_expr.c:4458 +#: parser/parse_expr.c:4356 parser/parse_expr.c:4385 parser/parse_expr.c:4416 +#: parser/parse_expr.c:4442 parser/parse_expr.c:4468 #: parser/parse_jsontable.c:94 #, c-format msgid "invalid %s behavior" @@ -20123,7 +20167,7 @@ #. 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:4349 parser/parse_expr.c:4378 +#: parser/parse_expr.c:4359 parser/parse_expr.c:4388 #, c-format msgid "" "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " @@ -20135,14 +20179,14 @@ #. 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:4356 parser/parse_expr.c:4385 parser/parse_expr.c:4414 -#: parser/parse_expr.c:4442 parser/parse_expr.c:4468 +#: parser/parse_expr.c:4366 parser/parse_expr.c:4395 parser/parse_expr.c:4424 +#: parser/parse_expr.c:4452 parser/parse_expr.c:4478 #, 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:4359 parser/parse_expr.c:4388 +#: parser/parse_expr.c:4369 parser/parse_expr.c:4398 #, c-format msgid "" "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " @@ -20151,13 +20195,13 @@ "В %s для форматируемых столбцов допускается только ERROR, NULL, EMPTY ARRAY, " "EMPTY OBJECT или выражение DEFAULT." -#: parser/parse_expr.c:4407 +#: parser/parse_expr.c:4417 #, 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:4417 +#: parser/parse_expr.c:4427 #, c-format msgid "" "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." @@ -20166,13 +20210,13 @@ #. 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:4435 parser/parse_expr.c:4461 +#: parser/parse_expr.c:4445 parser/parse_expr.c:4471 #, 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:4445 parser/parse_expr.c:4471 +#: parser/parse_expr.c:4455 parser/parse_expr.c:4481 #, c-format msgid "" "Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." @@ -20180,12 +20224,12 @@ "В %s для скалярных столбцов допускается только ERROR, NULL или выражение " "DEFAULT." -#: parser/parse_expr.c:4505 +#: parser/parse_expr.c:4515 #, c-format msgid "JSON path expression must be of type %s, not of type %s" msgstr "выражение пути JSON должно быть типа %s, а не типа %s" -#: parser/parse_expr.c:4745 +#: parser/parse_expr.c:4755 #, c-format msgid "" "can only specify a constant, non-aggregate function, or operator expression " @@ -20194,28 +20238,28 @@ "в DEFAULT может задаваться только константа, вызов не агрегатной функции или " "выражение с оператором" -#: parser/parse_expr.c:4750 +#: parser/parse_expr.c:4760 #, c-format msgid "DEFAULT expression must not contain column references" msgstr "выражения в DEFAULT не могут содержать ссылки на столбцы" -#: parser/parse_expr.c:4755 +#: parser/parse_expr.c:4765 #, c-format msgid "DEFAULT expression must not return a set" msgstr "выражение в DEFAULT не может возвращать множество" -#: parser/parse_expr.c:4770 +#: parser/parse_expr.c:4780 #, c-format msgid "collation of DEFAULT expression conflicts with RETURNING clause" msgstr "" "правило сортировки выражения DEFAULT конфликтует с предложением RETURNING" -#: parser/parse_expr.c:4849 parser/parse_expr.c:4858 +#: parser/parse_expr.c:4868 parser/parse_expr.c:4877 #, c-format msgid "cannot cast behavior expression of type %s to %s" msgstr "привести выражение поведения, имеющее тип %s, к типу %s нельзя" -#: parser/parse_expr.c:4852 +#: parser/parse_expr.c:4871 #, c-format msgid "You will need to explicitly cast the expression to type %s." msgstr "Приведите выражение к типу %s явно." @@ -21498,7 +21542,7 @@ 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 " @@ -21515,7 +21559,7 @@ "столбец %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 " @@ -22552,12 +22596,12 @@ msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "отключение автопрокрутки (чтобы включить, передайте SIGHUP)" -#: postmaster/walsummarizer.c:741 +#: postmaster/walsummarizer.c:781 #, c-format msgid "WAL summarization is not progressing" msgstr "процесс обобщения WAL не продвигается" -#: postmaster/walsummarizer.c:742 +#: postmaster/walsummarizer.c:782 #, c-format msgid "" "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/" @@ -22566,7 +22610,7 @@ "Обобщение должно охватить %X/%X, но оно остановилось на позиции %X/%X на " "диске и %X/%X в памяти." -#: postmaster/walsummarizer.c:756 +#: postmaster/walsummarizer.c:796 #, c-format msgid "still waiting for WAL summarization through %X/%X after %ld second" msgid_plural "" @@ -22575,22 +22619,22 @@ msgstr[1] "ожидание обобщения позиции %X/%X продолжается %ld сек." msgstr[2] "ожидание обобщения позиции %X/%X продолжается %ld сек." -#: postmaster/walsummarizer.c:761 +#: postmaster/walsummarizer.c:801 #, c-format msgid "Summarization has reached %X/%X on disk and %X/%X in memory." msgstr "Процесс обобщения достиг позиции %X/%X на диске и %X/%X в памяти." -#: postmaster/walsummarizer.c:1001 +#: postmaster/walsummarizer.c:1100 #, c-format msgid "could not find a valid record after %X/%X" msgstr "не удалось найти корректную запись после %X/%X" -#: postmaster/walsummarizer.c:1046 +#: postmaster/walsummarizer.c:1145 #, c-format msgid "could not read WAL from timeline %u at %X/%X: %s" msgstr "не удалось прочитать WAL с линии времени %u в позиции %X/%X: %s" -#: postmaster/walsummarizer.c:1052 +#: postmaster/walsummarizer.c:1151 #, c-format msgid "could not read WAL from timeline %u at %X/%X" msgstr "не удалось прочитать WAL с линии времени %u в позиции %X/%X" @@ -22636,7 +22680,7 @@ msgstr "не удалось очистить путь поиска: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:344 -#: replication/libpqwalreceiver/libpqwalreceiver.c:542 +#: replication/libpqwalreceiver/libpqwalreceiver.c:556 #, c-format msgid "invalid connection string syntax: %s" msgstr "ошибочный синтаксис строки подключения: %s" @@ -22663,7 +22707,8 @@ "сервера: %s" #: replication/libpqwalreceiver/libpqwalreceiver.c:489 -#: replication/libpqwalreceiver/libpqwalreceiver.c:788 +#: replication/libpqwalreceiver/libpqwalreceiver.c:821 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1168 #, c-format msgid "invalid response from primary server" msgstr "неверный ответ главного сервера" @@ -22677,91 +22722,103 @@ "Не удалось идентифицировать систему, получено строк: %d, полей: %d " "(ожидалось: %d и %d (или более))." -#: replication/libpqwalreceiver/libpqwalreceiver.c:631 -#: replication/libpqwalreceiver/libpqwalreceiver.c:638 -#: replication/libpqwalreceiver/libpqwalreceiver.c:668 +#: replication/libpqwalreceiver/libpqwalreceiver.c:504 +#, c-format +msgid "could not parse WAL location \"%s\"" +msgstr "не удалось разобрать позицию в WAL \"%s\"" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:701 #, c-format msgid "could not start WAL streaming: %s" msgstr "не удалось начать трансляцию WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:692 +#: replication/libpqwalreceiver/libpqwalreceiver.c:725 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "не удалось отправить главному серверу сообщение о конце передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:715 +#: replication/libpqwalreceiver/libpqwalreceiver.c:748 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "неожиданный набор данных после конца передачи" -#: replication/libpqwalreceiver/libpqwalreceiver.c:730 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ошибка при остановке потоковой операции COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:740 +#: replication/libpqwalreceiver/libpqwalreceiver.c:773 #, c-format msgid "error reading result of streaming command: %s" msgstr "ошибка при чтении результата команды передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:749 -#: replication/libpqwalreceiver/libpqwalreceiver.c:982 +#: replication/libpqwalreceiver/libpqwalreceiver.c:782 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1015 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "неожиданный результат после CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:776 +#: replication/libpqwalreceiver/libpqwalreceiver.c:809 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "не удалось получить файл истории линии времени с главного сервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:789 +#: replication/libpqwalreceiver/libpqwalreceiver.c:822 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Ожидался 1 кортеж с 2 полями, однако получено кортежей: %d, полей: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:945 -#: replication/libpqwalreceiver/libpqwalreceiver.c:998 -#: replication/libpqwalreceiver/libpqwalreceiver.c:1005 +#: replication/libpqwalreceiver/libpqwalreceiver.c:978 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1031 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1038 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не удалось получить данные из потока WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1025 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1058 #, c-format msgid "could not send data to WAL stream: %s" msgstr "не удалось отправить данные в поток WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1126 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1160 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "не удалось создать слот репликации \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1165 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1169 +#, 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:1208 #, c-format msgid "could not alter replication slot \"%s\": %s" msgstr "не удалось изменить свойства слота репликации \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1199 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1242 #, c-format msgid "invalid query response" msgstr "неверный ответ на запрос" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1200 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1243 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Ожидалось полей: %d, получено: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1270 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1313 #, c-format msgid "the query interface requires a database connection" msgstr "для интерфейса запросов требуется подключение к БД" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1302 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1345 msgid "empty query" msgstr "пустой запрос" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1308 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1351 msgid "unexpected pipeline mode" msgstr "неожиданный режим канала" @@ -22833,7 +22890,7 @@ msgstr "недостаточно слотов для процессов логической репликации" #: replication/logical/launcher.c:441 replication/logical/launcher.c:527 -#: replication/slot.c:1585 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 +#: replication/slot.c:1587 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 #: storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 #: storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 #: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 @@ -22896,8 +22953,8 @@ msgstr "" "слот репликации \"%s\" нельзя использовать для логического декодирования" -#: replication/logical/logical.c:546 replication/slot.c:827 -#: replication/slot.c:858 +#: replication/logical/logical.c:546 replication/slot.c:829 +#: replication/slot.c:860 #, c-format msgid "This replication slot is being synchronized from the primary server." msgstr "Этот слот репликации синхронизируется с ведущего сервера." @@ -23079,7 +23136,7 @@ "репликации с ID %d" #: replication/logical/origin.c:957 replication/logical/origin.c:1158 -#: replication/slot.c:2446 +#: replication/slot.c:2448 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "Увеличьте параметр \"max_replication_slots\" и повторите попытку." @@ -23150,19 +23207,19 @@ msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "целевое отношение логической репликации \"%s.%s\" не существует" -#: replication/logical/reorderbuffer.c:4129 +#: replication/logical/reorderbuffer.c:4145 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не удалось записать в файл данных для XID %u: %m" -#: replication/logical/reorderbuffer.c:4475 -#: replication/logical/reorderbuffer.c:4500 +#: replication/logical/reorderbuffer.c:4491 +#: replication/logical/reorderbuffer.c:4516 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "не удалось прочитать файл подкачки буфера пересортировки: %m" -#: replication/logical/reorderbuffer.c:4479 -#: replication/logical/reorderbuffer.c:4504 +#: replication/logical/reorderbuffer.c:4495 +#: replication/logical/reorderbuffer.c:4520 #, c-format msgid "" "could not read from reorderbuffer spill file: read %d instead of %u bytes" @@ -23170,18 +23227,18 @@ "не удалось прочитать файл подкачки буфера пересортировки (прочитано байт: " "%d, требовалось: %u)" -#: replication/logical/reorderbuffer.c:4754 +#: replication/logical/reorderbuffer.c:4770 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "" "ошибка при удалении файла \"%s\" в процессе удаления pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:5250 +#: replication/logical/reorderbuffer.c:5266 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d, требовалось: %d)" -#: replication/logical/slotsync.c:226 replication/logical/slotsync.c:604 +#: replication/logical/slotsync.c:226 replication/logical/slotsync.c:607 #, c-format msgid "could not synchronize replication slot \"%s\"" msgstr "не удалось синхронизировать слот репликации \"%s\"" @@ -23197,12 +23254,12 @@ "WAL в позиции LSN %X/%X и xmin каталога %u, но на резервном сервере текущий " "LSN %X/%X и xmin каталога %u." -#: replication/logical/slotsync.c:483 +#: replication/logical/slotsync.c:482 #, c-format msgid "dropped replication slot \"%s\" of database with OID %u" msgstr "слот репликации \"%s\" базы данных с OID %u удалён" -#: replication/logical/slotsync.c:605 +#: replication/logical/slotsync.c:608 #, c-format msgid "" "Synchronization could lead to data loss, because the standby could not build " @@ -23211,12 +23268,12 @@ "Синхронизация могла привести к потере данных, так как резервный сервер не " "смог получить согласованный снимок для декодирования WAL в позиции LSN %X/%X." -#: replication/logical/slotsync.c:614 +#: replication/logical/slotsync.c:617 #, c-format msgid "newly created replication slot \"%s\" is sync-ready now" msgstr "созданный слот репликации \"%s\" сейчас готов к синхронизации" -#: replication/logical/slotsync.c:653 +#: replication/logical/slotsync.c:656 #, c-format msgid "" "skipping slot synchronization because the received slot sync LSN %X/%X for " @@ -23225,7 +23282,7 @@ "синхронизация слота пропускается, потому что полученная позиция LSN %X/%X " "для слота \"%s\" предшествует позиции %X/%X на резервном сервере" -#: replication/logical/slotsync.c:675 +#: replication/logical/slotsync.c:678 #, c-format msgid "" "exiting from slot synchronization because same name slot \"%s\" already " @@ -23234,32 +23291,32 @@ "синхронизация слота отменяется, потому что слот с таким же именем \"%s\" уже " "существует на резервном сервере" -#: replication/logical/slotsync.c:846 +#: replication/logical/slotsync.c:849 #, c-format msgid "could not fetch failover logical slots info from the primary server: %s" msgstr "" "не удалось получить информацию о переносимых логических слотах с главного " "сервера: %s" -#: replication/logical/slotsync.c:992 +#: replication/logical/slotsync.c:995 #, 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:994 +#: replication/logical/slotsync.c:997 #, c-format msgid "Check if primary_slot_name is configured correctly." msgstr "Проверьте правильность настройки primary_slot_name." -#: replication/logical/slotsync.c:1014 +#: replication/logical/slotsync.c:1017 #, c-format msgid "cannot synchronize replication slots from a standby server" msgstr "синхронизировать слоты репликации с резервного сервера нельзя" #. translator: second %s is a GUC variable name -#: replication/logical/slotsync.c:1023 +#: replication/logical/slotsync.c:1026 #, c-format msgid "" "replication slot \"%s\" specified by \"%s\" does not exist on primary server" @@ -23269,32 +23326,32 @@ #. translator: first %s is a connection option; second %s is a GUC #. variable name #. -#: replication/logical/slotsync.c:1056 +#: replication/logical/slotsync.c:1059 #, c-format msgid "" "replication slot synchronization requires \"%s\" to be specified in \"%s\"" msgstr "для синхронизации слотов репликации требуется указание \"%s\" в \"%s\"" -#: replication/logical/slotsync.c:1075 +#: replication/logical/slotsync.c:1078 #, 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:1090 replication/logical/slotsync.c:1118 +#: replication/logical/slotsync.c:1093 replication/logical/slotsync.c:1121 #, c-format msgid "replication slot synchronization requires \"%s\" to be set" msgstr "для синхронизации слотов репликации требуется установить \"%s\"" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1104 +#: replication/logical/slotsync.c:1107 #, c-format msgid "replication slot synchronization requires \"%s\" to be enabled" msgstr "для синхронизации слотов репликации требуется включить \"%s\"" #. translator: %s is a GUC variable name -#: replication/logical/slotsync.c:1161 +#: replication/logical/slotsync.c:1164 #, c-format msgid "" "replication slot synchronization worker will stop because \"%s\" is disabled" @@ -23302,7 +23359,7 @@ "процесс синхронизации слотов репликации будет остановлен, так как \"%s\" " "отключён" -#: replication/logical/slotsync.c:1179 +#: replication/logical/slotsync.c:1182 #, c-format msgid "" "replication slot synchronization worker will restart because of a parameter " @@ -23311,7 +23368,7 @@ "процесс синхронизации слотов репликации будет перезапущен вследствие " "изменения параметров" -#: replication/logical/slotsync.c:1204 +#: replication/logical/slotsync.c:1207 #, c-format msgid "" "replication slot synchronization will stop because of a parameter change" @@ -23319,7 +23376,7 @@ "процесс синхронизации слотов репликации будет остановлен вследствие " "изменения параметров" -#: replication/logical/slotsync.c:1240 +#: replication/logical/slotsync.c:1243 #, c-format msgid "" "replication slot synchronization worker will stop because promotion is " @@ -23328,7 +23385,7 @@ "процесс синхронизации слотов репликации будет остановлен, так как вызвана " "процедура повышения сервера" -#: replication/logical/slotsync.c:1254 +#: replication/logical/slotsync.c:1257 #, c-format msgid "" "replication slot synchronization will stop because promotion is triggered" @@ -23336,7 +23393,7 @@ "синхронизация слотов репликации будет остановлена, так как вызвана процедура " "повышения сервера" -#: replication/logical/slotsync.c:1374 +#: replication/logical/slotsync.c:1377 #, c-format msgid "" "replication slot synchronization worker will not start because promotion was " @@ -23345,7 +23402,7 @@ "процесс синхронизации слотов репликации не будет запущен, так как вызвана " "процедура повышения сервера" -#: replication/logical/slotsync.c:1386 +#: replication/logical/slotsync.c:1389 #, c-format msgid "" "replication slot synchronization will not start because promotion was " @@ -23354,18 +23411,18 @@ "синхронизация слотов репликации не будет запущена, так как вызвана процедура " "повышения сервера" -#: replication/logical/slotsync.c:1395 +#: replication/logical/slotsync.c:1398 #, c-format msgid "cannot synchronize replication slots concurrently" msgstr "многопоточная синхронизация слотов репликации не поддерживается" -#: replication/logical/slotsync.c:1507 +#: replication/logical/slotsync.c:1510 #, c-format msgid "slot sync worker started" msgstr "рабочий процесс синхронизации слотов запущен" -#: replication/logical/slotsync.c:1570 replication/slotfuncs.c:926 -#: replication/walreceiver.c:307 +#: replication/logical/slotsync.c:1573 replication/slotfuncs.c:926 +#: replication/walreceiver.c:316 #, c-format msgid "could not connect to the primary server: %s" msgstr "не удалось подключиться к главному серверу: %s" @@ -23500,14 +23557,14 @@ msgstr "" "не удалось начать копирование начального содержимого таблицы \"%s.%s\": %s" -#: replication/logical/tablesync.c:1469 +#: replication/logical/tablesync.c:1470 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "" "при копировании таблицы не удалось начать транзакцию на сервере публикации: " "%s" -#: replication/logical/tablesync.c:1529 replication/logical/worker.c:2363 +#: replication/logical/tablesync.c:1530 replication/logical/worker.c:2373 #, c-format msgid "" "user \"%s\" cannot replicate into relation with row-level security enabled: " @@ -23516,7 +23573,7 @@ "пользователь \"%s\" не может реплицировать данные в отношение с включённой " "защитой на уровне строк: \"%s\"" -#: replication/logical/tablesync.c:1542 +#: replication/logical/tablesync.c:1543 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "" @@ -23541,13 +23598,22 @@ "транзакций репликации, передаваемых в потоке, пока все таблицы не " "синхронизированы." -#: replication/logical/worker.c:854 replication/logical/worker.c:969 +#: replication/logical/worker.c:821 replication/logical/worker.c:938 +#: replication/logical/worker.c:2615 +#, c-format +msgid "" +"logical replication column %d not found in tuple: only %d column(s) received" +msgstr "" +"столбец %d для логической репликации не найден в кортеже; всего получено " +"столбцов: %d" + +#: replication/logical/worker.c:860 replication/logical/worker.c:979 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "" "неправильный формат двоичных данных для столбца логической репликации %d" -#: replication/logical/worker.c:2506 +#: replication/logical/worker.c:2516 #, c-format msgid "" "publisher did not send replica identity column expected by the logical " @@ -23556,7 +23622,7 @@ "сервер публикации не передал столбец идентификации реплики, ожидаемый для " "целевого отношения логической репликации \"%s.%s\"" -#: replication/logical/worker.c:2513 +#: replication/logical/worker.c:2523 #, c-format msgid "" "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY " @@ -23567,22 +23633,22 @@ "IDENTITY, ни ключа PRIMARY KEY, и публикуемое отношение не имеет " "характеристики REPLICA IDENTITY FULL" -#: replication/logical/worker.c:3384 +#: replication/logical/worker.c:3399 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "неверный тип сообщения логической репликации \"??? (%d)\"" -#: replication/logical/worker.c:3556 +#: replication/logical/worker.c:3571 #, c-format msgid "data stream from publisher has ended" msgstr "поток данных с сервера публикации закончился" -#: replication/logical/worker.c:3710 +#: replication/logical/worker.c:3725 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "завершение обработчика логической репликации из-за тайм-аута" -#: replication/logical/worker.c:3904 +#: replication/logical/worker.c:3919 #, c-format msgid "" "logical replication worker for subscription \"%s\" will stop because the " @@ -23591,7 +23657,7 @@ "процесс логической репликации для подписки \"%s\" будет остановлен, так как " "подписка была удалена" -#: replication/logical/worker.c:3918 +#: replication/logical/worker.c:3933 #, c-format msgid "" "logical replication worker for subscription \"%s\" will stop because the " @@ -23600,7 +23666,7 @@ "процесс логической репликации для подписки \"%s\" будет остановлен, так как " "подписка была отключена" -#: replication/logical/worker.c:3949 +#: replication/logical/worker.c:3964 #, c-format msgid "" "logical replication parallel apply worker for subscription \"%s\" will stop " @@ -23609,7 +23675,7 @@ "параллельный применяющий процесс логической репликации для подписки \"%s\" " "будет остановлен вследствие изменения параметров" -#: replication/logical/worker.c:3953 +#: replication/logical/worker.c:3968 #, c-format msgid "" "logical replication worker for subscription \"%s\" will restart because of a " @@ -23618,7 +23684,7 @@ "процесс логической репликации для подписки \"%s\" будет перезапущен " "вследствие изменения параметров" -#: replication/logical/worker.c:3967 +#: replication/logical/worker.c:3982 #, c-format msgid "" "logical replication parallel apply worker for subscription \"%s\" will stop " @@ -23628,7 +23694,7 @@ "подписки \"%s\" будет остановлен, потому что владелец подписки был лишён " "прав суперпользователя" -#: replication/logical/worker.c:3971 +#: replication/logical/worker.c:3986 #, c-format msgid "" "logical replication worker for subscription \"%s\" will restart because the " @@ -23637,12 +23703,12 @@ "процесс логической репликации для подписки \"%s\" будет перезапущен, потому " "что владелец подписки был лишён прав суперпользователя" -#: replication/logical/worker.c:4499 +#: replication/logical/worker.c:4514 #, c-format msgid "subscription has no replication slot set" msgstr "для подписки не задан слот репликации" -#: replication/logical/worker.c:4627 +#: replication/logical/worker.c:4642 #, c-format msgid "" "logical replication worker for subscription %u will not start because the " @@ -23651,7 +23717,7 @@ "процесс логической репликации для подписки %u не будет запущен, так как " "подписка была удалена при старте" -#: replication/logical/worker.c:4643 +#: replication/logical/worker.c:4658 #, c-format msgid "" "logical replication worker for subscription \"%s\" will not start because " @@ -23660,7 +23726,7 @@ "процесс логической репликации для подписки \"%s\" не будет запущен, так как " "подписка была отключена при старте" -#: replication/logical/worker.c:4667 +#: replication/logical/worker.c:4682 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " @@ -23669,35 +23735,35 @@ "процесс синхронизации таблицы при логической репликации для подписки \"%s\", " "таблицы \"%s\" запущен" -#: replication/logical/worker.c:4672 +#: replication/logical/worker.c:4687 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "" "запускается применяющий процесс логической репликации для подписки \"%s\"" -#: replication/logical/worker.c:4806 +#: replication/logical/worker.c:4817 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "подписка \"%s\" была отключена из-за ошибки" -#: replication/logical/worker.c:4854 +#: replication/logical/worker.c:4865 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "" "обработчик логической репликации начинает пропускать транзакцию с LSN %X/%X" -#: replication/logical/worker.c:4868 +#: replication/logical/worker.c:4879 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "" "обработчик логической репликации завершил пропуск транзакции с LSN %X/%X" -#: replication/logical/worker.c:4956 +#: replication/logical/worker.c:4967 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "значение skip-LSN для подписки \"%s\" очищено" -#: replication/logical/worker.c:4957 +#: replication/logical/worker.c:4968 #, c-format msgid "" "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN " @@ -23706,7 +23772,7 @@ "Позиция завершения удалённой транзакции в WAL (LSN) %X/%X не совпала со " "значением skip-LSN %X/%X." -#: replication/logical/worker.c:4985 +#: replication/logical/worker.c:4996 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23715,7 +23781,7 @@ "обработка внешних данных для источника репликации \"%s\" в контексте " "сообщения типа \"%s\"" -#: replication/logical/worker.c:4989 +#: replication/logical/worker.c:5000 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23724,7 +23790,7 @@ "обработка внешних данных из источника репликации \"%s\" в контексте " "сообщения типа \"%s\" в транзакции %u" -#: replication/logical/worker.c:4994 +#: replication/logical/worker.c:5005 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23733,7 +23799,7 @@ "обработка внешних данных для источника репликации \"%s\" в контексте " "сообщения типа \"%s\" в транзакции %u, конечная позиция %X/%X" -#: replication/logical/worker.c:5005 +#: replication/logical/worker.c:5016 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23743,7 +23809,7 @@ "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\" в " "транзакции %u" -#: replication/logical/worker.c:5012 +#: replication/logical/worker.c:5023 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23754,7 +23820,7 @@ "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\" в " "транзакции %u, конечная позиция %X/%X" -#: replication/logical/worker.c:5023 +#: replication/logical/worker.c:5034 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23765,7 +23831,7 @@ "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\", столбца " "\"%s\", в транзакции %u" -#: replication/logical/worker.c:5031 +#: replication/logical/worker.c:5042 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23877,7 +23943,7 @@ msgstr "" "слот репликации, созданный на ведомом сервере, не может быть переносимым" -#: replication/slot.c:374 replication/slot.c:878 +#: replication/slot.c:374 replication/slot.c:880 #, c-format msgid "cannot enable failover for a temporary replication slot" msgstr "временный слот репликации не может быть переносимым" @@ -23903,7 +23969,7 @@ msgid "replication slot \"%s\" does not exist" msgstr "слот репликации \"%s\" не существует" -#: replication/slot.c:635 replication/slot.c:1395 +#: replication/slot.c:635 replication/slot.c:1397 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "слот репликации \"%s\" занят процессом с PID %d" @@ -23918,65 +23984,65 @@ msgid "acquired physical replication slot \"%s\"" msgstr "получен слот физической репликации \"%s\"" -#: replication/slot.c:758 +#: replication/slot.c:760 #, c-format msgid "released logical replication slot \"%s\"" msgstr "освобождён слот логической репликации \"%s\"" -#: replication/slot.c:760 +#: replication/slot.c:762 #, c-format msgid "released physical replication slot \"%s\"" msgstr "освобождён слот физической репликации \"%s\"" -#: replication/slot.c:826 +#: replication/slot.c:828 #, c-format msgid "cannot drop replication slot \"%s\"" msgstr "удалить слот репликации \"%s\" нельзя" -#: replication/slot.c:845 +#: replication/slot.c:847 #, c-format msgid "cannot use %s with a physical replication slot" msgstr "выполнить %s со слотом физической репликации нельзя" -#: replication/slot.c:857 +#: replication/slot.c:859 #, c-format msgid "cannot alter replication slot \"%s\"" msgstr "изменить слот репликации \"%s\" нельзя" -#: replication/slot.c:867 +#: replication/slot.c:869 #, c-format msgid "cannot enable failover for a replication slot on the standby" msgstr "сделать переносимым слот репликации на ведомом сервере нельзя" -#: replication/slot.c:998 replication/slot.c:1965 replication/slot.c:2356 +#: replication/slot.c:1000 replication/slot.c:1967 replication/slot.c:2358 #, c-format msgid "could not remove directory \"%s\"" msgstr "ошибка при удалении каталога \"%s\"" -#: replication/slot.c:1430 +#: replication/slot.c:1432 #, c-format msgid "replication slots can only be used if \"max_replication_slots\" > 0" msgstr "" "слоты репликации можно использовать, только если \"max_replication_slots\" > " "0" -#: replication/slot.c:1435 +#: replication/slot.c:1437 #, c-format msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" msgstr "" "слоты репликации можно использовать, только если \"wal_level\" >= \"replica\"" -#: replication/slot.c:1447 +#: replication/slot.c:1449 #, c-format msgid "permission denied to use replication slots" msgstr "нет прав для использования слотов репликации" -#: replication/slot.c:1448 +#: replication/slot.c:1450 #, c-format msgid "Only roles with the %s attribute may use replication slots." msgstr "Использовать слоты репликации могут только роли с атрибутом %s." -#: replication/slot.c:1559 +#: replication/slot.c:1561 #, c-format msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." @@ -23984,12 +24050,12 @@ msgstr[1] "Позиция restart_lsn %X/%X слота превысила предел на %llu Б." msgstr[2] "Позиция restart_lsn %X/%X слота превысила предел на %llu Б." -#: replication/slot.c:1567 +#: replication/slot.c:1569 #, c-format msgid "The slot conflicted with xid horizon %u." msgstr "Слот конфликтует с горизонтом xid %u." -#: replication/slot.c:1572 +#: replication/slot.c:1574 msgid "" "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the " "primary server." @@ -23997,50 +24063,50 @@ "Для логического декодирования на ведомом сервере требуется \"wal_level\" >= " "\"logical\" на ведущем." -#: replication/slot.c:1580 +#: replication/slot.c:1582 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "завершение процесса %d для освобождения слота репликации \"%s\"" -#: replication/slot.c:1582 +#: replication/slot.c:1584 #, c-format msgid "invalidating obsolete replication slot \"%s\"" msgstr "аннулирование устаревшего слота репликации \"%s\"" -#: replication/slot.c:2294 +#: replication/slot.c:2296 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл слота репликации \"%s\" имеет неправильную сигнатуру (%u вместо %u)" -#: replication/slot.c:2301 +#: replication/slot.c:2303 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "файл состояния snapbuild \"%s\" имеет неподдерживаемую версию %u" -#: replication/slot.c:2308 +#: replication/slot.c:2310 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "у файла слота репликации \"%s\" неверная длина: %u" -#: replication/slot.c:2344 +#: replication/slot.c:2346 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "" "в файле слота репликации \"%s\" неверная контрольная сумма (%u вместо %u)" -#: replication/slot.c:2380 +#: replication/slot.c:2382 #, c-format msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" msgstr "" "существует слот логической репликации \"%s\", но \"wal_level\" < \"logical\"" -#: replication/slot.c:2382 +#: replication/slot.c:2384 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "Смените \"wal_level\" на \"logical\" или более высокий уровень." -#: replication/slot.c:2394 +#: replication/slot.c:2396 #, c-format msgid "" "logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = " @@ -24049,34 +24115,34 @@ "на ведомом сервере существует слот логической репликации \"%s\", но " "\"hot_standby\" = \"off\"" -#: replication/slot.c:2396 +#: replication/slot.c:2398 #, c-format msgid "Change \"hot_standby\" to be \"on\"." msgstr "Смените значение \"hot_standby\" на \"on\"." -#: replication/slot.c:2401 +#: replication/slot.c:2403 #, c-format msgid "" "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "" "существует слот физической репликации \"%s\", но \"wal_level\" < \"replica\"" -#: replication/slot.c:2403 +#: replication/slot.c:2405 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "Смените \"wal_level\" на \"replica\" или более высокий уровень." -#: replication/slot.c:2445 +#: replication/slot.c:2447 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершением активно слишком много слотов репликации" -#: replication/slot.c:2672 +#: replication/slot.c:2674 #, c-format msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" msgstr "слот репликации \"%s\", указанный в параметре \"%s\", не существует" -#: replication/slot.c:2674 replication/slot.c:2708 replication/slot.c:2723 +#: replication/slot.c:2676 replication/slot.c:2710 replication/slot.c:2725 #, c-format msgid "" "Logical replication is waiting on the standby associated with replication " @@ -24085,30 +24151,30 @@ "Логическая репликация ожидает резервного сервера, связанного со слотом " "репликации \"%s\"." -#: replication/slot.c:2676 +#: replication/slot.c:2678 #, c-format msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." msgstr "Создайте слот репликации \"%s\" или опустите параметр \"%s\"." -#: replication/slot.c:2686 +#: replication/slot.c:2688 #, c-format msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" msgstr "" "слот логической репликации \"%s\" не может быть указан в параметре \"%s\"" -#: replication/slot.c:2688 +#: replication/slot.c:2690 #, c-format msgid "" "Logical replication is waiting for correction on replication slot \"%s\"." msgstr "Логическая репликация ожидает исправления слота репликации \"%s\"." -#: replication/slot.c:2690 +#: replication/slot.c:2692 #, c-format msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." msgstr "" "Удалите указание слота логической репликации \"%s\" из параметра \"%s\"." -#: replication/slot.c:2706 +#: replication/slot.c:2708 #, c-format msgid "" "physical replication slot \"%s\" specified in parameter \"%s\" has been " @@ -24117,14 +24183,14 @@ "слот физической репликации \"%s\", указанный в параметре \"%s\", был " "аннулирован" -#: replication/slot.c:2710 +#: replication/slot.c:2712 #, c-format msgid "" "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." msgstr "" "Удалите и пересоздайте слот репликации \"%s\" или опустите параметр \"%s\"." -#: replication/slot.c:2721 +#: replication/slot.c:2723 #, c-format msgid "" "replication slot \"%s\" specified in parameter \"%s\" does not have " @@ -24133,7 +24199,7 @@ "у слота репликации \"%s\", указанного в параметре \"%s\", нулевое значение " "active_pid" -#: replication/slot.c:2725 +#: replication/slot.c:2727 #, c-format msgid "" "Start the standby associated with the replication slot \"%s\", or amend " @@ -24278,77 +24344,95 @@ msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "число синхронных резервных серверов (%d) должно быть больше нуля" -#: replication/walreceiver.c:176 +#: replication/walreceiver.c:183 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "завершение процесса считывания журнала по команде администратора" -#: replication/walreceiver.c:354 +#: replication/walreceiver.c:365 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "идентификаторы СУБД на главном и резервном серверах различаются" -#: replication/walreceiver.c:355 +#: replication/walreceiver.c:366 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Идентификатор на главном сервере: %s, на резервном: %s." -#: replication/walreceiver.c:366 +#: replication/walreceiver.c:377 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "" "последняя линия времени %u на главном сервере отстаёт от восстанавливаемой " "линии времени %u" -#: replication/walreceiver.c:419 +#: replication/walreceiver.c:420 +#, 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:435 +#, c-format +msgid "" +"terminating walreceiver due to timeout while waiting for upstream to catch up" +msgstr "" +"завершение приёма журнала из-за тайм-аута при ожидании достижения требуемой " +"позиции вышестоящим сервером" + +#: replication/walreceiver.c:496 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "" "начало передачи журнала с главного сервера, с позиции %X/%X на линии времени " "%u" -#: replication/walreceiver.c:423 +#: replication/walreceiver.c:500 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "перезапуск передачи журнала с позиции %X/%X на линии времени %u" -#: replication/walreceiver.c:458 +#: replication/walreceiver.c:535 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "продолжить передачу WAL нельзя, восстановление уже окончено" -#: replication/walreceiver.c:502 +#: replication/walreceiver.c:579 #, c-format msgid "replication terminated by primary server" msgstr "репликация прекращена главным сервером" -#: replication/walreceiver.c:503 +#: replication/walreceiver.c:580 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "На линии времени %u в %X/%X достигнут конец журнала." -#: replication/walreceiver.c:593 +#: replication/walreceiver.c:670 #, c-format msgid "terminating walreceiver due to timeout" msgstr "завершение приёма журнала из-за тайм-аута" -#: replication/walreceiver.c:625 +#: replication/walreceiver.c:702 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "" "на главном сервере больше нет журналов для запрошенной линии времени %u" -#: replication/walreceiver.c:641 replication/walreceiver.c:1071 +#: replication/walreceiver.c:718 replication/walreceiver.c:1148 #, c-format msgid "could not close WAL segment %s: %m" msgstr "не удалось закрыть сегмент WAL %s: %m" -#: replication/walreceiver.c:760 +#: replication/walreceiver.c:837 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "загрузка файла истории для линии времени %u с главного сервера" -#: replication/walreceiver.c:959 +#: replication/walreceiver.c:1036 #, c-format msgid "could not write to WAL segment %s at offset %d, length %lu: %m" msgstr "не удалось записать в сегмент WAL %s (смещение %d, длина %lu): %m" @@ -24395,73 +24479,73 @@ "запрошенная начальная точка %X/%X впереди позиции сброшенных данных журнала " "на этом сервере (%X/%X)" -#: replication/walsender.c:1178 +#: replication/walsender.c:1200 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "" "нераспознанное значение для параметра CREATE_REPLICATION_SLOT \"%s\": \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1284 +#: replication/walsender.c:1306 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s требуется выполнять не в транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1294 +#: replication/walsender.c:1316 #, c-format msgid "%s must be called inside a transaction" msgstr "%s требуется выполнять внутри транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1300 +#: replication/walsender.c:1322 #, 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:1305 +#: replication/walsender.c:1327 #, 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:1311 +#: replication/walsender.c:1333 #, c-format msgid "%s must be called before any query" msgstr "%s требуется выполнять до каких-либо запросов" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1317 +#: replication/walsender.c:1339 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s требуется вызывать не в подтранзакции" -#: replication/walsender.c:1490 +#: replication/walsender.c:1512 #, c-format msgid "terminating walsender process after promotion" msgstr "завершение процесса передачи журнала после повышения" -#: replication/walsender.c:2035 +#: replication/walsender.c:2057 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "" "нельзя выполнять новые команды, пока процесс передачи WAL находится в режиме " "остановки" -#: replication/walsender.c:2070 +#: replication/walsender.c:2092 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "" "нельзя выполнять команды SQL в процессе, передающем WAL для физической " "репликации" -#: replication/walsender.c:2103 +#: replication/walsender.c:2125 #, c-format msgid "received replication command: %s" msgstr "получена команда репликации: %s" -#: replication/walsender.c:2111 tcop/fastpath.c:209 tcop/postgres.c:1143 +#: replication/walsender.c:2133 tcop/fastpath.c:209 tcop/postgres.c:1143 #: tcop/postgres.c:1501 tcop/postgres.c:1753 tcop/postgres.c:2235 #: tcop/postgres.c:2673 tcop/postgres.c:2750 #, c-format @@ -24471,32 +24555,32 @@ msgstr "" "текущая транзакция прервана, команды до конца блока транзакции игнорируются" -#: replication/walsender.c:2268 replication/walsender.c:2303 +#: replication/walsender.c:2290 replication/walsender.c:2325 #, c-format msgid "unexpected EOF on standby connection" msgstr "неожиданный обрыв соединения с резервным сервером" -#: replication/walsender.c:2291 +#: replication/walsender.c:2313 #, c-format msgid "invalid standby message type \"%c\"" msgstr "неверный тип сообщения резервного сервера: \"%c\"" -#: replication/walsender.c:2380 +#: replication/walsender.c:2402 #, c-format msgid "unexpected message type \"%c\"" msgstr "неожиданный тип сообщения \"%c\"" -#: replication/walsender.c:2801 +#: replication/walsender.c:2823 #, 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\" не могут применяться правила" @@ -24562,56 +24646,56 @@ 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\"" @@ -24619,62 +24703,62 @@ "элементу %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 нельзя" @@ -25109,27 +25193,29 @@ msgstr "" "функция, возвращающая запись, вызвана в контексте, не допускающем этот тип" -#: storage/buffer/bufmgr.c:656 storage/buffer/bufmgr.c:812 +#: storage/aio/read_stream.c:417 storage/buffer/bufmgr.c:656 +#: storage/buffer/bufmgr.c:1215 storage/buffer/bufmgr.c:1283 +#: storage/buffer/bufmgr.c:2181 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "обращаться к временным таблицам других сеансов нельзя" -#: storage/buffer/bufmgr.c:1539 +#: storage/buffer/bufmgr.c:1548 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "некорректная страница в блоке %u отношения %s; страница обнуляется" -#: storage/buffer/bufmgr.c:2284 storage/buffer/localbuf.c:361 +#: storage/buffer/bufmgr.c:2307 storage/buffer/localbuf.c:361 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "не удалось увеличить отношение \"%s\" до блока %u" -#: storage/buffer/bufmgr.c:2355 +#: storage/buffer/bufmgr.c:2378 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "неожиданные данные после EOF в блоке %u отношения %s" -#: storage/buffer/bufmgr.c:2357 +#: storage/buffer/bufmgr.c:2380 #, c-format msgid "" "This has been seen to occur with buggy kernels; consider updating your " @@ -25138,17 +25224,17 @@ "Эта ситуация может возникать из-за ошибок в ядре; возможно, вам следует " "обновить ОС." -#: storage/buffer/bufmgr.c:5721 +#: storage/buffer/bufmgr.c:5744 #, c-format msgid "could not write block %u of %s" msgstr "не удалось запись блок %u файла %s" -#: storage/buffer/bufmgr.c:5723 +#: storage/buffer/bufmgr.c:5746 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Множественные сбои - возможно, постоянная ошибка записи." -#: storage/buffer/bufmgr.c:5745 storage/buffer/bufmgr.c:5765 +#: storage/buffer/bufmgr.c:5768 storage/buffer/bufmgr.c:5788 #, c-format msgid "writing block %u of relation %s" msgstr "запись блока %u отношения %s" @@ -25512,7 +25598,7 @@ "Только роли с правами роли, которой принадлежит процесс, или с правами роли " "\"%s\" могут завершить этот процесс." -#: storage/ipc/procsignal.c:417 +#: storage/ipc/procsignal.c:424 #, c-format msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "" @@ -25567,17 +25653,12 @@ "недостаточно разделяемой памяти для структуры данных \"%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:72 #, c-format msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d не относится к обслуживающему процессу PostgreSQL" -#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1486 #: utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" @@ -25949,7 +26030,7 @@ "число запрошенных подключений резервных серверов превышает " "\"max_wal_senders\" (сейчас: %d)" -#: storage/lmgr/proc.c:1546 +#: storage/lmgr/proc.c:1579 #, c-format msgid "" "process %d avoided deadlock for %s on %s by rearranging queue order after " @@ -25958,7 +26039,7 @@ "процесс %d избежал взаимоблокировки, ожидая в режиме %s блокировку \"%s\", " "изменив порядок очереди через %ld.%03d мс" -#: storage/lmgr/proc.c:1561 +#: storage/lmgr/proc.c:1594 #, c-format msgid "" "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" @@ -25966,19 +26047,19 @@ "процесс %d обнаружил взаимоблокировку, ожидая в режиме %s блокировку \"%s\" " "в течение %ld.%03d мс" -#: storage/lmgr/proc.c:1570 +#: storage/lmgr/proc.c:1603 #, 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:1577 +#: storage/lmgr/proc.c:1610 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "процесс %d получил в режиме %s блокировку \"%s\" через %ld.%03d мс" -#: storage/lmgr/proc.c:1594 +#: storage/lmgr/proc.c:1627 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "" @@ -26143,37 +26224,37 @@ msgid "direct SSL connection rejected" msgstr "запрос прямого SSL-соединения отвергнут" -#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#: tcop/backend_startup.c:490 tcop/backend_startup.c:518 #, c-format msgid "incomplete startup packet" msgstr "неполный стартовый пакет" -#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#: tcop/backend_startup.c:502 tcop/backend_startup.c:539 #, c-format msgid "invalid length of startup packet" msgstr "неверная длина стартового пакета" -#: tcop/backend_startup.c:573 +#: tcop/backend_startup.c:574 #, c-format msgid "SSLRequest accepted" msgstr "SSLRequest принят" -#: tcop/backend_startup.c:576 +#: tcop/backend_startup.c:577 #, c-format msgid "SSLRequest rejected" msgstr "SSLRequest отвергнут" -#: tcop/backend_startup.c:585 +#: tcop/backend_startup.c:586 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "не удалось отправить ответ в процессе SSL-согласования: %m" -#: tcop/backend_startup.c:603 +#: tcop/backend_startup.c:604 #, c-format msgid "received unencrypted data after SSL request" msgstr "после запроса SSL получены незашифрованные данные" -#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 +#: tcop/backend_startup.c:605 tcop/backend_startup.c:668 #, c-format msgid "" "This could be either a client-software bug or evidence of an attempted man-" @@ -26182,45 +26263,45 @@ "Это может свидетельствовать об ошибке в клиентском ПО или о попытке атаки " "MITM." -#: tcop/backend_startup.c:627 +#: tcop/backend_startup.c:637 #, c-format msgid "GSSENCRequest accepted" msgstr "GSSENCRequest принят" -#: tcop/backend_startup.c:630 +#: tcop/backend_startup.c:640 #, c-format msgid "GSSENCRequest rejected" msgstr "GSSENCRequest отвергнут" -#: tcop/backend_startup.c:639 +#: tcop/backend_startup.c:649 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "не удалось отправить ответ в процессе согласования GSSAPI: %m" -#: tcop/backend_startup.c:657 +#: tcop/backend_startup.c:667 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "после запроса шифрования GSSAPI получены незашифрованные данные" -#: tcop/backend_startup.c:681 +#: tcop/backend_startup.c:700 #, 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:744 +#: tcop/backend_startup.c:763 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Допустимые значения: \"false\", 0, \"true\", 1, \"database\"." -#: tcop/backend_startup.c:785 +#: tcop/backend_startup.c:804 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "" "неверная структура стартового пакета: последним байтом должен быть терминатор" -#: tcop/backend_startup.c:802 +#: tcop/backend_startup.c:821 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "в стартовом пакете не указано имя пользователя PostgreSQL" @@ -26276,7 +26357,7 @@ msgid "incorrect binary data format in function argument %d" msgstr "неправильный формат двоичных данных в аргументе функции %d" -#: tcop/postgres.c:468 tcop/postgres.c:5016 +#: tcop/postgres.c:468 tcop/postgres.c:5032 #, c-format msgid "invalid frontend message type %d" msgstr "неправильный тип клиентского сообщения %d" @@ -26541,12 +26622,12 @@ msgid "terminating connection due to idle-session timeout" msgstr "закрытие подключения из-за тайм-аута простоя сеанса" -#: tcop/postgres.c:3568 +#: tcop/postgres.c:3569 #, c-format msgid "stack depth limit exceeded" msgstr "превышен предел глубины стека" -#: tcop/postgres.c:3569 +#: tcop/postgres.c:3570 #, c-format msgid "" "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), " @@ -26556,12 +26637,12 @@ "КБ), предварительно убедившись, что ОС предоставляет достаточный размер " "стека." -#: tcop/postgres.c:3616 +#: tcop/postgres.c:3632 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "Значение \"max_stack_depth\" не должно превышать %ld КБ." -#: tcop/postgres.c:3618 +#: tcop/postgres.c:3634 #, c-format msgid "" "Increase the platform's stack depth limit via \"ulimit -s\" or local " @@ -26570,20 +26651,20 @@ "Увеличьте предел глубины стека в системе с помощью команды \"ulimit -s\" или " "эквивалента в вашей ОС." -#: tcop/postgres.c:3641 +#: tcop/postgres.c:3657 #, c-format msgid "\"client_connection_check_interval\" must be set to 0 on this platform." msgstr "" "Значение \"client_connection_check_interval\" должно равняться 0 на этой " "платформе." -#: tcop/postgres.c:3662 +#: tcop/postgres.c:3678 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "" "Этот параметр нельзя включить, когда \"log_statement_stats\" равен true." -#: tcop/postgres.c:3677 +#: tcop/postgres.c:3693 #, c-format msgid "" "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", " @@ -26593,49 +26674,49 @@ "\"log_parser_stats\", \"log_planner_stats\" или \"log_executor_stats\" равны " "true." -#: tcop/postgres.c:4102 +#: tcop/postgres.c:4118 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "неверный аргумент командной строки для серверного процесса: %s" -#: tcop/postgres.c:4103 tcop/postgres.c:4109 +#: tcop/postgres.c:4119 tcop/postgres.c:4125 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Для дополнительной информации попробуйте \"%s --help\"." -#: tcop/postgres.c:4107 +#: tcop/postgres.c:4123 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: неверный аргумент командной строки: %s" -#: tcop/postgres.c:4160 +#: tcop/postgres.c:4176 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: не указаны ни база данных, ни пользователь" -#: tcop/postgres.c:4913 +#: tcop/postgres.c:4929 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "неверный подтип сообщения CLOSE: %d" -#: tcop/postgres.c:4950 +#: tcop/postgres.c:4966 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "неверный подтип сообщения DESCRIBE: %d" -#: tcop/postgres.c:5037 +#: tcop/postgres.c:5053 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "" "вызовы функций через fastpath не поддерживаются для реплицирующих соединений" -#: tcop/postgres.c:5041 +#: tcop/postgres.c:5057 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "" "протокол расширенных запросов не поддерживается для реплицирующих соединений" -#: tcop/postgres.c:5221 +#: tcop/postgres.c:5237 #, c-format msgid "" "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s " @@ -26742,17 +26823,17 @@ msgid "unrecognized simple dictionary parameter: \"%s\"" msgstr "нераспознанный параметр словаря simple: \"%s\"" -#: tsearch/dict_synonym.c:118 +#: tsearch/dict_synonym.c:117 #, c-format msgid "unrecognized synonym parameter: \"%s\"" msgstr "нераспознанный параметр функции синонимов: \"%s\"" -#: tsearch/dict_synonym.c:125 +#: tsearch/dict_synonym.c:124 #, c-format msgid "missing Synonyms parameter" msgstr "отсутствует параметр Synonyms" -#: tsearch/dict_synonym.c:132 +#: tsearch/dict_synonym.c:131 #, c-format msgid "could not open synonym file \"%s\": %m" msgstr "не удалось открыть файл синонимов \"%s\": %m" @@ -26868,18 +26949,18 @@ msgid "syntax error" msgstr "ошибка синтаксиса" -#: tsearch/spell.c:1181 tsearch/spell.c:1193 tsearch/spell.c:1753 -#: tsearch/spell.c:1758 tsearch/spell.c:1763 +#: tsearch/spell.c:1181 tsearch/spell.c:1188 tsearch/spell.c:1199 +#: tsearch/spell.c:1768 tsearch/spell.c:1773 tsearch/spell.c:1778 #, c-format msgid "invalid affix alias \"%s\"" msgstr "неверное указание аффикса \"%s\"" -#: tsearch/spell.c:1234 tsearch/spell.c:1305 tsearch/spell.c:1454 +#: tsearch/spell.c:1240 tsearch/spell.c:1311 tsearch/spell.c:1469 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "не удалось открыть файл аффиксов \"%s\": %m" -#: tsearch/spell.c:1288 +#: tsearch/spell.c:1294 #, c-format msgid "" "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag " @@ -26888,22 +26969,27 @@ "словарь Ispell поддерживает для флага только значения \"default\", \"long\" " "и \"num\"" -#: tsearch/spell.c:1332 +#: tsearch/spell.c:1338 #, c-format msgid "invalid number of flag vector aliases" msgstr "неверное количество векторов флагов" -#: tsearch/spell.c:1355 +#: tsearch/spell.c:1361 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "количество псевдонимов превышает заданное число %d" -#: tsearch/spell.c:1569 +#: tsearch/spell.c:1435 +#, c-format +msgid "number of aliases is less than specified number %d" +msgstr "количество псевдонимов меньше заданного числа %d" + +#: tsearch/spell.c:1584 #, 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)" @@ -26945,63 +27031,69 @@ 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" -#: utils/activity/pgstat.c:435 +#: 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:436 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "ошибка удаления постоянного файла статистики \"%s\": %m" -#: utils/activity/pgstat.c:1254 +#: utils/activity/pgstat.c:1265 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "неверный вид статистики: \"%s\"" -#: utils/activity/pgstat.c:1334 +#: utils/activity/pgstat.c:1345 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "не удалось открыть временный файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1454 +#: utils/activity/pgstat.c:1465 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "не удалось записать во временный файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1463 +#: utils/activity/pgstat.c:1474 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "не удалось закрыть временный файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1471 +#: utils/activity/pgstat.c:1482 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "" "не удалось переименовать временный файл статистики из \"%s\" в \"%s\": %m" -#: utils/activity/pgstat.c:1520 +#: utils/activity/pgstat.c:1531 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "не удалось открыть файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1692 +#: utils/activity/pgstat.c:1703 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "файл статистики \"%s\" испорчен" @@ -27152,7 +27244,7 @@ #: 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:1918 utils/adt/numeric.c:4455 +#: utils/adt/int8.c:1286 utils/adt/numeric.c:1924 utils/adt/numeric.c:4461 #: utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 #: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1178 #: utils/adt/varlena.c:3182 @@ -27196,12 +27288,12 @@ msgstr "Массивы с разными размерностями несовместимы для соединения." #: utils/adt/array_userfuncs.c:977 utils/adt/array_userfuncs.c:985 -#: utils/adt/arrayfuncs.c:5622 utils/adt/arrayfuncs.c:5628 +#: utils/adt/arrayfuncs.c:5631 utils/adt/arrayfuncs.c:5637 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "аккумулировать массивы различной размерности нельзя" -#: utils/adt/array_userfuncs.c:997 +#: utils/adt/array_userfuncs.c:997 utils/adt/arrayfuncs.c:5593 #, c-format msgid "array size exceeds the maximum allowed (%zu)" msgstr "размер массива превышает предел (%zu)" @@ -27321,7 +27413,7 @@ msgstr "Неожиданный конец ввода." #: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 -#: utils/adt/arrayfuncs.c:6114 +#: utils/adt/arrayfuncs.c:6121 #, c-format msgid "invalid number of dimensions: %d" msgstr "неверное число размерностей: %d" @@ -27338,8 +27430,8 @@ "с бинарными данными связан тип элемента массива %u (%s) вместо ожидаемого %u " "(%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 -#: utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2996 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:451 +#: utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:3071 #, c-format msgid "no binary input function available for type %s" msgstr "для типа %s нет функции ввода двоичных данных" @@ -27349,8 +27441,8 @@ msgid "improper binary format in array element %d" msgstr "неподходящий двоичный формат в элементе массива %d" -#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 -#: utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:3029 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:456 +#: utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:3104 #, c-format msgid "no binary output function available for type %s" msgstr "для типа %s нет функции вывода двоичных данных" @@ -27362,8 +27454,8 @@ #: 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:6100 -#: utils/adt/arrayfuncs.c:6126 utils/adt/arrayfuncs.c:6137 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6107 +#: utils/adt/arrayfuncs.c:6133 utils/adt/arrayfuncs.c:6144 #: utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 #: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 #: utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 @@ -27417,8 +27509,8 @@ msgid "cannot compare arrays of different element types" msgstr "нельзя сравнивать массивы с элементами разных типов" -#: utils/adt/arrayfuncs.c:4183 utils/adt/multirangetypes.c:2806 -#: utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1361 +#: utils/adt/arrayfuncs.c:4183 utils/adt/multirangetypes.c:2807 +#: utils/adt/multirangetypes.c:2879 utils/adt/rangetypes.c:1361 #: utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" @@ -27434,52 +27526,52 @@ msgid "data type %s is not an array type" msgstr "тип данных %s не является типом массива" -#: utils/adt/arrayfuncs.c:5567 +#: utils/adt/arrayfuncs.c:5568 #, c-format msgid "cannot accumulate null arrays" msgstr "аккумулировать NULL-массивы нельзя" -#: utils/adt/arrayfuncs.c:5595 +#: utils/adt/arrayfuncs.c:5604 #, c-format msgid "cannot accumulate empty arrays" msgstr "аккумулировать пустые массивы нельзя" -#: utils/adt/arrayfuncs.c:5998 utils/adt/arrayfuncs.c:6038 +#: utils/adt/arrayfuncs.c:6005 utils/adt/arrayfuncs.c:6045 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "массив размерностей или массив нижних границ не может быть null" -#: utils/adt/arrayfuncs.c:6101 utils/adt/arrayfuncs.c:6127 +#: utils/adt/arrayfuncs.c:6108 utils/adt/arrayfuncs.c:6134 #, c-format msgid "Dimension array must be one dimensional." msgstr "Массив размерностей должен быть одномерным." -#: utils/adt/arrayfuncs.c:6106 utils/adt/arrayfuncs.c:6132 +#: utils/adt/arrayfuncs.c:6113 utils/adt/arrayfuncs.c:6139 #, c-format msgid "dimension values cannot be null" msgstr "значения размерностей не могут быть null" -#: utils/adt/arrayfuncs.c:6138 +#: utils/adt/arrayfuncs.c:6145 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Массив нижних границ и массив размерностей имеют разные размеры." -#: utils/adt/arrayfuncs.c:6419 +#: utils/adt/arrayfuncs.c:6426 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "удаление элементов из многомерных массивов не поддерживается" -#: utils/adt/arrayfuncs.c:6696 +#: utils/adt/arrayfuncs.c:6703 #, c-format msgid "thresholds must be one-dimensional array" msgstr "границы должны задаваться одномерным массивом" -#: utils/adt/arrayfuncs.c:6701 +#: utils/adt/arrayfuncs.c:6708 #, c-format msgid "thresholds array must not contain NULLs" msgstr "массив границ не должен содержать NULL" -#: utils/adt/arrayfuncs.c:6934 +#: utils/adt/arrayfuncs.c:6941 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "число удаляемых элементов должно быть от 0 до %d" @@ -27520,7 +27612,7 @@ msgstr "преобразование кодировки из %s в ASCII не поддерживается" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 +#: utils/adt/bool.c:149 utils/adt/cash.c:370 utils/adt/datetime.c:4142 #: utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 #: utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 #: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 @@ -27528,8 +27620,8 @@ #: 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:803 utils/adt/numeric.c:7222 -#: utils/adt/numeric.c:7425 utils/adt/numeric.c:8372 utils/adt/numutils.c:356 +#: utils/adt/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7228 +#: utils/adt/numeric.c:7431 utils/adt/numeric.c:8378 utils/adt/numutils.c:356 #: utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 #: utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 #: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 @@ -27540,26 +27632,26 @@ 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:723 utils/adt/float.c:99 +#: utils/adt/cash.c:161 utils/adt/cash.c:739 utils/adt/float.c:99 #: 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:3192 utils/adt/numeric.c:3215 utils/adt/numeric.c:3300 -#: utils/adt/numeric.c:3318 utils/adt/numeric.c:3414 utils/adt/numeric.c:8921 -#: utils/adt/numeric.c:9234 utils/adt/numeric.c:9582 utils/adt/numeric.c:9698 -#: utils/adt/numeric.c:11209 utils/adt/timestamp.c:3713 +#: 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:3198 utils/adt/numeric.c:3221 utils/adt/numeric.c:3306 +#: utils/adt/numeric.c:3324 utils/adt/numeric.c:3420 utils/adt/numeric.c:8927 +#: utils/adt/numeric.c:9240 utils/adt/numeric.c:9588 utils/adt/numeric.c:9704 +#: utils/adt/numeric.c:11215 utils/adt/timestamp.c:3717 #, 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:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 #: utils/adt/numutils.c:964 utils/adt/numutils.c:1011 #, c-format @@ -27592,9 +27684,9 @@ msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%s: точность уменьшена до дозволенного максимума: %d" -#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4426 -#: utils/adt/formatting.c:4435 utils/adt/formatting.c:4540 -#: utils/adt/formatting.c:4550 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4438 +#: utils/adt/formatting.c:4447 utils/adt/formatting.c:4552 +#: utils/adt/formatting.c:4562 #, c-format msgid "date out of range: \"%s\"" msgstr "дата вне диапазона: \"%s\"" @@ -27627,21 +27719,21 @@ msgstr "дата вне диапазона для типа timestamp" #: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 -#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 -#: utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 -#: utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 -#: utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 -#: utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 -#: utils/adt/timestamp.c:6070 +#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4730 +#: utils/adt/timestamp.c:4945 utils/adt/timestamp.c:5093 +#: utils/adt/timestamp.c:5346 utils/adt/timestamp.c:5547 +#: utils/adt/timestamp.c:5594 utils/adt/timestamp.c:5818 +#: utils/adt/timestamp.c:5865 utils/adt/timestamp.c:5945 +#: utils/adt/timestamp.c:6074 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "единица \"%s\" для типа %s не поддерживается" #: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 -#: utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 -#: utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 -#: utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 -#: utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 +#: utils/adt/timestamp.c:4744 utils/adt/timestamp.c:4962 +#: utils/adt/timestamp.c:5107 utils/adt/timestamp.c:5306 +#: utils/adt/timestamp.c:5603 utils/adt/timestamp.c:5874 +#: utils/adt/timestamp.c:5915 utils/adt/timestamp.c:6135 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "единица \"%s\" для типа %s не распознана" @@ -27649,38 +27741,38 @@ #: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 #: utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 #: utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 -#: utils/adt/formatting.c:4271 utils/adt/formatting.c:4307 -#: utils/adt/formatting.c:4394 utils/adt/formatting.c:4516 utils/adt/json.c:366 +#: utils/adt/formatting.c:4283 utils/adt/formatting.c:4319 +#: utils/adt/formatting.c:4406 utils/adt/formatting.c:4528 utils/adt/json.c:366 #: utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 #: utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 #: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 -#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 -#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 -#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 -#: utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 -#: utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 -#: utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 -#: utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 -#: utils/adt/timestamp.c:3266 utils/adt/timestamp.c:3279 -#: utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 -#: utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 -#: utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 -#: utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 -#: utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 -#: utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 -#: utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 -#: utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 -#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 -#: utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 -#: utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 -#: utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 -#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2575 +#: utils/adt/timestamp.c:3070 utils/adt/timestamp.c:3079 +#: utils/adt/timestamp.c:3096 utils/adt/timestamp.c:3101 +#: utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3133 +#: utils/adt/timestamp.c:3144 utils/adt/timestamp.c:3150 +#: utils/adt/timestamp.c:3156 utils/adt/timestamp.c:3161 +#: utils/adt/timestamp.c:3214 utils/adt/timestamp.c:3223 +#: utils/adt/timestamp.c:3244 utils/adt/timestamp.c:3249 +#: utils/adt/timestamp.c:3270 utils/adt/timestamp.c:3283 +#: utils/adt/timestamp.c:3297 utils/adt/timestamp.c:3305 +#: utils/adt/timestamp.c:3311 utils/adt/timestamp.c:3316 +#: utils/adt/timestamp.c:4384 utils/adt/timestamp.c:4536 +#: utils/adt/timestamp.c:4612 utils/adt/timestamp.c:4648 +#: utils/adt/timestamp.c:4738 utils/adt/timestamp.c:4817 +#: utils/adt/timestamp.c:4853 utils/adt/timestamp.c:4956 +#: utils/adt/timestamp.c:5411 utils/adt/timestamp.c:5685 +#: utils/adt/timestamp.c:6203 utils/adt/timestamp.c:6213 +#: utils/adt/timestamp.c:6218 utils/adt/timestamp.c:6224 +#: utils/adt/timestamp.c:6264 utils/adt/timestamp.c:6351 +#: utils/adt/timestamp.c:6392 utils/adt/timestamp.c:6396 +#: utils/adt/timestamp.c:6450 utils/adt/timestamp.c:6454 +#: utils/adt/timestamp.c:6460 utils/adt/timestamp.c:6501 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:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4599 +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4611 #, c-format msgid "time out of range" msgstr "время вне диапазона" @@ -27707,9 +27799,9 @@ #: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 #: utils/adt/float.c:1112 utils/adt/int.c:664 utils/adt/int.c:711 -#: utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2596 -#: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 -#: utils/adt/timestamp.c:3888 +#: utils/adt/int.c:746 utils/adt/int8.c:413 utils/adt/numeric.c:2602 +#: utils/adt/timestamp.c:3814 utils/adt/timestamp.c:3851 +#: utils/adt/timestamp.c:3892 #, c-format msgid "invalid preceding or following size in window function" msgstr "неверное смещение PRECEDING или FOLLOWING в оконной функции" @@ -27719,12 +27811,12 @@ msgid "time zone displacement out of range" msgstr "смещение часового пояса вне диапазона" -#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6246 utils/adt/timestamp.c:6483 #, c-format msgid "interval time zone \"%s\" must be finite" msgstr "задающий часовой пояс интервал \"%s\" должен быть конечным" -#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6253 utils/adt/timestamp.c:6490 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "" @@ -27903,34 +27995,34 @@ #: utils/adt/float.c:1247 utils/adt/float.c:1321 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:4594 utils/adt/numeric.c:4599 +#: utils/adt/int8.c:1307 utils/adt/numeric.c:4600 utils/adt/numeric.c:4605 #, c-format msgid "smallint out of range" msgstr "smallint вне диапазона" -#: utils/adt/float.c:1447 utils/adt/numeric.c:3710 utils/adt/numeric.c:10113 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3716 utils/adt/numeric.c:10119 #, c-format msgid "cannot take square root of a negative number" msgstr "извлечь квадратный корень отрицательного числа нельзя" -#: utils/adt/float.c:1515 utils/adt/numeric.c:3998 utils/adt/numeric.c:4110 +#: utils/adt/float.c:1515 utils/adt/numeric.c:4004 utils/adt/numeric.c:4116 #, c-format msgid "zero raised to a negative power is undefined" msgstr "ноль в отрицательной степени даёт неопределённость" -#: utils/adt/float.c:1519 utils/adt/numeric.c:4002 utils/adt/numeric.c:11004 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4008 utils/adt/numeric.c:11010 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "отрицательное число в дробной степени даёт комплексный результат" -#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3910 -#: utils/adt/numeric.c:10784 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3916 +#: utils/adt/numeric.c:10790 #, c-format msgid "cannot take logarithm of zero" msgstr "вычислить логарифм нуля нельзя" -#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3848 -#: utils/adt/numeric.c:3905 utils/adt/numeric.c:10788 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3854 +#: utils/adt/numeric.c:3911 utils/adt/numeric.c:10794 #, c-format msgid "cannot take logarithm of a negative number" msgstr "вычислить логарифм отрицательного числа нельзя" @@ -27944,22 +28036,22 @@ msgid "input is out of range" msgstr "введённое значение вне диапазона" -#: utils/adt/float.c:4000 utils/adt/numeric.c:1858 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1864 #, c-format msgid "count must be greater than zero" msgstr "счётчик должен быть больше нуля" -#: utils/adt/float.c:4005 utils/adt/numeric.c:1869 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1875 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "операнд, нижняя и верхняя границы не могут быть NaN" -#: utils/adt/float.c:4011 utils/adt/numeric.c:1874 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1880 #, c-format msgid "lower and upper bounds must be finite" msgstr "нижняя и верхняя границы должны быть конечными" -#: utils/adt/float.c:4077 utils/adt/numeric.c:1888 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1894 #, c-format msgid "lower bound cannot equal upper bound" msgstr "нижняя граница не может равняться верхней" @@ -28062,18 +28154,18 @@ msgstr "преобразовать регистр не удалось: %s" #: utils/adt/formatting.c:1653 utils/adt/formatting.c:1801 -#: utils/adt/formatting.c:1991 +#: utils/adt/formatting.c:2003 #, c-format msgid "could not determine which collation to use for %s function" msgstr "" "не удалось определить, какое правило сортировки использовать для функции %s" -#: utils/adt/formatting.c:2412 +#: utils/adt/formatting.c:2424 #, c-format msgid "invalid combination of date conventions" msgstr "неверное сочетание стилей дат" -#: utils/adt/formatting.c:2413 +#: utils/adt/formatting.c:2425 #, c-format msgid "" "Do not mix Gregorian and ISO week date conventions in a formatting template." @@ -28081,27 +28173,27 @@ "Не смешивайте Григорианский стиль дат (недель) с ISO в одном шаблоне " "форматирования." -#: utils/adt/formatting.c:2435 +#: utils/adt/formatting.c:2447 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "конфликтующие значения поля \"%s\" в строке форматирования" -#: utils/adt/formatting.c:2437 +#: utils/adt/formatting.c:2449 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Это значение противоречит предыдущему значению поля того же типа." -#: utils/adt/formatting.c:2504 +#: utils/adt/formatting.c:2516 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "входная строка короче, чем требует поле форматирования \"%s\"" -#: utils/adt/formatting.c:2506 +#: utils/adt/formatting.c:2518 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Требуется символов: %d, а осталось только %d." -#: utils/adt/formatting.c:2508 utils/adt/formatting.c:2522 +#: utils/adt/formatting.c:2520 utils/adt/formatting.c:2534 #, c-format msgid "" "If your source string is not fixed-width, try using the \"FM\" modifier." @@ -28109,132 +28201,132 @@ "Если входная строка имеет переменную длину, попробуйте использовать " "модификатор \"FM\"." -#: utils/adt/formatting.c:2518 utils/adt/formatting.c:2531 -#: utils/adt/formatting.c:2752 utils/adt/formatting.c:3652 +#: utils/adt/formatting.c:2530 utils/adt/formatting.c:2543 +#: utils/adt/formatting.c:2764 utils/adt/formatting.c:3664 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "неверное значение \"%s\" для \"%s\"" -#: utils/adt/formatting.c:2520 +#: utils/adt/formatting.c:2532 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Поле должно поглотить символов: %d, но удалось разобрать только %d." -#: utils/adt/formatting.c:2533 +#: utils/adt/formatting.c:2545 #, c-format msgid "Value must be an integer." msgstr "Значение должно быть целым числом." -#: utils/adt/formatting.c:2538 +#: utils/adt/formatting.c:2550 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "значение \"%s\" во входной строке вне диапазона" -#: utils/adt/formatting.c:2540 +#: utils/adt/formatting.c:2552 #, c-format msgid "Value must be in the range %d to %d." msgstr "Значение должно быть в интервале %d..%d." -#: utils/adt/formatting.c:2754 +#: utils/adt/formatting.c:2766 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "" "Данное значение не соответствует ни одному из допустимых значений для этого " "поля." -#: utils/adt/formatting.c:2970 utils/adt/formatting.c:2990 -#: utils/adt/formatting.c:3010 utils/adt/formatting.c:3030 -#: utils/adt/formatting.c:3049 utils/adt/formatting.c:3068 -#: utils/adt/formatting.c:3092 utils/adt/formatting.c:3110 -#: utils/adt/formatting.c:3128 utils/adt/formatting.c:3146 -#: utils/adt/formatting.c:3163 utils/adt/formatting.c:3180 +#: utils/adt/formatting.c:2982 utils/adt/formatting.c:3002 +#: utils/adt/formatting.c:3022 utils/adt/formatting.c:3042 +#: utils/adt/formatting.c:3061 utils/adt/formatting.c:3080 +#: utils/adt/formatting.c:3104 utils/adt/formatting.c:3122 +#: utils/adt/formatting.c:3140 utils/adt/formatting.c:3158 +#: utils/adt/formatting.c:3175 utils/adt/formatting.c:3192 #, c-format msgid "localized string format value too long" msgstr "слишком длинное значение формата локализованной строки" -#: utils/adt/formatting.c:3460 +#: utils/adt/formatting.c:3472 #, c-format msgid "unmatched format separator \"%c\"" msgstr "нет соответствия для заданного в формате разделителя \"%c\"" -#: utils/adt/formatting.c:3521 +#: utils/adt/formatting.c:3533 #, c-format msgid "unmatched format character \"%s\"" msgstr "нет соответствия для заданного в формате символа \"%s\"" -#: utils/adt/formatting.c:3654 +#: utils/adt/formatting.c:3666 #, c-format msgid "Time zone abbreviation is not recognized." msgstr "Сокращённое название часового пояса не распознано." -#: utils/adt/formatting.c:3855 +#: utils/adt/formatting.c:3867 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ошибка синтаксиса в значении для шаблона \"Y,YYY\"" -#: utils/adt/formatting.c:3944 +#: utils/adt/formatting.c:3956 #, c-format msgid "input string is too short for datetime format" msgstr "входная строка короче, чем требует формат datetime" -#: utils/adt/formatting.c:3952 +#: utils/adt/formatting.c:3964 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "" "после разбора формата datetime во входной строке остались дополнительные " "символы" -#: utils/adt/formatting.c:4496 +#: utils/adt/formatting.c:4508 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "во входной строке для типа timestamptz нет указания часового пояса" -#: utils/adt/formatting.c:4502 +#: utils/adt/formatting.c:4514 #, c-format msgid "timestamptz out of range" msgstr "значение timestamptz вне диапазона" -#: utils/adt/formatting.c:4530 +#: utils/adt/formatting.c:4542 #, c-format msgid "datetime format is zoned but not timed" msgstr "в формате datetime указан часовой пояс, но отсутствует время" -#: utils/adt/formatting.c:4579 +#: utils/adt/formatting.c:4591 #, c-format msgid "missing time zone in input string for type timetz" msgstr "во входной строке для типа timetz нет указания часового пояса" -#: utils/adt/formatting.c:4585 +#: utils/adt/formatting.c:4597 #, c-format msgid "timetz out of range" msgstr "значение timetz вне диапазона" -#: utils/adt/formatting.c:4611 +#: utils/adt/formatting.c:4623 #, c-format msgid "datetime format is not dated and not timed" msgstr "в формате datetime нет ни даты, ни времени" -#: utils/adt/formatting.c:4788 +#: utils/adt/formatting.c:4800 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "час \"%d\" не соответствует 12-часовому формату времени" -#: utils/adt/formatting.c:4790 +#: utils/adt/formatting.c:4802 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Используйте 24-часовой формат или передавайте часы от 1 до 12." -#: utils/adt/formatting.c:4902 +#: utils/adt/formatting.c:4914 #, c-format msgid "cannot calculate day of year without year information" msgstr "нельзя рассчитать день года без информации о годе" -#: utils/adt/formatting.c:5867 +#: utils/adt/formatting.c:5879 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" не поддерживается при вводе" -#: utils/adt/formatting.c:5879 +#: utils/adt/formatting.c:5891 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" не поддерживается при вводе" @@ -28327,8 +28419,8 @@ msgid "invalid int2vector data" msgstr "неверные данные int2vector" -#: utils/adt/int.c:1558 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 -#: utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 +#: utils/adt/int.c:1558 utils/adt/int8.c:1433 utils/adt/numeric.c:1771 +#: utils/adt/timestamp.c:6550 utils/adt/timestamp.c:6636 #, c-format msgid "step size cannot equal zero" msgstr "размер шага не может быть нулевым" @@ -28337,19 +28429,19 @@ #: 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:4543 +#: 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:4549 #: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, 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 вне диапазона" @@ -28824,7 +28916,7 @@ # skip-rule: space-before-period #: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 -#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 +#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1581 #, c-format msgid "" "jsonpath item method .%s() can only be applied to a string or numeric value" @@ -28856,26 +28948,26 @@ "метод .%s() в jsonpath может применяться только к булевскому, строковому или " "числовому значению" -#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1528 +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1517 #, c-format msgid "" "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" msgstr "" "аргумент \"%s\" метода элемента jsonpath .%s() не подходит для типа numeric" -#: utils/adt/jsonpath_exec.c:1487 +#: utils/adt/jsonpath_exec.c:1483 #, 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:1501 +#: utils/adt/jsonpath_exec.c:1497 #, c-format msgid "scale of jsonpath item method .%s() is out of range for type integer" msgstr "" "масштаб в аргументе метода элемента jsonpath .%s() вне диапазона типа integer" -#: utils/adt/jsonpath_exec.c:1561 utils/adt/jsonpath_exec.c:1585 +#: utils/adt/jsonpath_exec.c:1549 utils/adt/jsonpath_exec.c:1573 #, c-format msgid "" "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" @@ -28883,7 +28975,7 @@ "аргумент \"%s\" метода элемента jsonpath .%s() не подходит для типа integer" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1648 +#: utils/adt/jsonpath_exec.c:1636 #, c-format msgid "" "jsonpath item method .%s() can only be applied to a boolean, string, " @@ -28892,84 +28984,84 @@ "метод .%s() в jsonpath может применяться только к булевскому, строковому, " "числовому значению или к дате/времени" -#: utils/adt/jsonpath_exec.c:2137 +#: utils/adt/jsonpath_exec.c:2125 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "" "левый операнд оператора %s в jsonpath не является одним числовым значением" -#: utils/adt/jsonpath_exec.c:2144 +#: utils/adt/jsonpath_exec.c:2132 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "" "правый операнд оператора %s в jsonpath не является одним числовым значением" -#: utils/adt/jsonpath_exec.c:2212 +#: utils/adt/jsonpath_exec.c:2200 #, 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:2311 +#: utils/adt/jsonpath_exec.c:2299 #, 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:2357 +#: utils/adt/jsonpath_exec.c:2345 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "метод .%s() в jsonpath может применяться только к строке" -#: utils/adt/jsonpath_exec.c:2450 +#: utils/adt/jsonpath_exec.c:2438 #, 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:2484 utils/adt/jsonpath_exec.c:2490 -#: utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 -#: utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 -#: utils/adt/jsonpath_exec.c:2720 +#: utils/adt/jsonpath_exec.c:2472 utils/adt/jsonpath_exec.c:2478 +#: utils/adt/jsonpath_exec.c:2505 utils/adt/jsonpath_exec.c:2533 +#: utils/adt/jsonpath_exec.c:2586 utils/adt/jsonpath_exec.c:2637 +#: utils/adt/jsonpath_exec.c:2708 #, c-format msgid "%s format is not recognized: \"%s\"" msgstr "формат %s не распознан: \"%s\"" -#: utils/adt/jsonpath_exec.c:2486 +#: utils/adt/jsonpath_exec.c:2474 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "" "Воспользуйтесь аргументом datetime для указания формата входных данных." -#: utils/adt/jsonpath_exec.c:2679 utils/adt/jsonpath_exec.c:2760 +#: utils/adt/jsonpath_exec.c:2667 utils/adt/jsonpath_exec.c:2748 #, 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:2840 +#: utils/adt/jsonpath_exec.c:2828 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "метод .%s() в jsonpath может применяться только к объекту" -#: utils/adt/jsonpath_exec.c:3124 +#: utils/adt/jsonpath_exec.c:3112 #, c-format msgid "could not convert value of type %s to jsonpath" msgstr "преобразовать значение типа %s в jsonpath не удалось" -#: utils/adt/jsonpath_exec.c:3158 +#: utils/adt/jsonpath_exec.c:3146 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "не удалось найти в jsonpath переменную \"%s\"" -#: utils/adt/jsonpath_exec.c:3211 +#: utils/adt/jsonpath_exec.c:3199 #, c-format msgid "\"vars\" argument is not an object" msgstr "аргумент \"vars\" не является объектом" -#: utils/adt/jsonpath_exec.c:3212 +#: utils/adt/jsonpath_exec.c:3200 #, c-format msgid "" "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." @@ -28977,27 +29069,27 @@ "Параметры jsonpath должны передаваться в виде пар ключ-значение в объекте " "\"vars\"." -#: utils/adt/jsonpath_exec.c:3475 +#: utils/adt/jsonpath_exec.c:3463 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "индекс элемента в jsonpath не является одним числовым значением" -#: utils/adt/jsonpath_exec.c:3487 +#: utils/adt/jsonpath_exec.c:3475 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "индекс массива в jsonpath вне целочисленного диапазона" -#: utils/adt/jsonpath_exec.c:3671 +#: utils/adt/jsonpath_exec.c:3659 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "значение %s нельзя преобразовать в %s без сведений о часовом поясе" -#: utils/adt/jsonpath_exec.c:3673 +#: utils/adt/jsonpath_exec.c:3661 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Для передачи часового пояса используйте функцию *_tz()." -#: utils/adt/jsonpath_exec.c:3981 +#: utils/adt/jsonpath_exec.c:3969 #, c-format msgid "" "JSON path expression for column \"%s\" must return single item when no " @@ -29006,14 +29098,14 @@ "выражение пути JSON для столбца \"%s\" в отсутствие обёртки должно " "возвращать одиночный элемент" -#: utils/adt/jsonpath_exec.c:3983 utils/adt/jsonpath_exec.c:3988 +#: utils/adt/jsonpath_exec.c:3971 utils/adt/jsonpath_exec.c:3976 #, 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:3987 +#: utils/adt/jsonpath_exec.c:3975 #, c-format msgid "" "JSON path expression in JSON_QUERY must return single item when no wrapper " @@ -29022,14 +29114,14 @@ "выражение пути JSON в JSON_QUERY в отсутствие обёртки должно возвращать " "одиночный элемент" -#: utils/adt/jsonpath_exec.c:4045 utils/adt/jsonpath_exec.c:4069 +#: utils/adt/jsonpath_exec.c:4033 utils/adt/jsonpath_exec.c:4057 #, c-format msgid "JSON path expression for column \"%s\" must return single scalar item" msgstr "" "выражение пути JSON для столбца \"%s\" должно возвращать один скалярный " "элемент" -#: utils/adt/jsonpath_exec.c:4050 utils/adt/jsonpath_exec.c:4074 +#: utils/adt/jsonpath_exec.c:4038 utils/adt/jsonpath_exec.c:4062 #, c-format msgid "JSON path expression in JSON_VALUE must return single scalar item" msgstr "" @@ -29198,12 +29290,12 @@ 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" @@ -29282,10 +29374,10 @@ msgid "cannot subtract inet values of different sizes" msgstr "нельзя вычитать значения inet разного размера" -#: utils/adt/numeric.c:793 utils/adt/numeric.c:3660 utils/adt/numeric.c:7217 -#: utils/adt/numeric.c:7420 utils/adt/numeric.c:7892 utils/adt/numeric.c:10587 -#: utils/adt/numeric.c:11062 utils/adt/numeric.c:11156 -#: utils/adt/numeric.c:11291 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3666 utils/adt/numeric.c:7223 +#: utils/adt/numeric.c:7426 utils/adt/numeric.c:7898 utils/adt/numeric.c:10593 +#: utils/adt/numeric.c:11068 utils/adt/numeric.c:11162 +#: utils/adt/numeric.c:11297 #, c-format msgid "value overflows numeric format" msgstr "значение переполняет формат numeric" @@ -29305,99 +29397,99 @@ msgid "invalid digit in external \"numeric\" value" msgstr "неверная цифра во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 +#: utils/adt/numeric.c:1333 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "точность NUMERIC %d должна быть между 1 и %d" -#: utils/adt/numeric.c:1341 +#: utils/adt/numeric.c:1338 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "порядок NUMERIC %d должен быть между %d и %d" -#: utils/adt/numeric.c:1359 +#: utils/adt/numeric.c:1365 #, c-format msgid "invalid NUMERIC type modifier" msgstr "неверный модификатор типа NUMERIC" -#: utils/adt/numeric.c:1725 +#: utils/adt/numeric.c:1731 #, c-format msgid "start value cannot be NaN" msgstr "начальное значение не может быть NaN" -#: utils/adt/numeric.c:1729 +#: utils/adt/numeric.c:1735 #, c-format msgid "start value cannot be infinity" msgstr "начальное значение не может быть бесконечностью" -#: utils/adt/numeric.c:1736 +#: utils/adt/numeric.c:1742 #, c-format msgid "stop value cannot be NaN" msgstr "конечное значение не может быть NaN" -#: utils/adt/numeric.c:1740 +#: utils/adt/numeric.c:1746 #, c-format msgid "stop value cannot be infinity" msgstr "конечное значение не может быть бесконечностью" -#: utils/adt/numeric.c:1753 +#: utils/adt/numeric.c:1759 #, c-format msgid "step size cannot be NaN" msgstr "размер шага не может быть NaN" -#: utils/adt/numeric.c:1757 +#: utils/adt/numeric.c:1763 #, c-format msgid "step size cannot be infinity" msgstr "размер шага не может быть бесконечностью" -#: utils/adt/numeric.c:3650 +#: utils/adt/numeric.c:3656 #, c-format msgid "factorial of a negative number is undefined" msgstr "факториал отрицательного числа даёт неопределённость" -#: utils/adt/numeric.c:4257 +#: utils/adt/numeric.c:4263 #, c-format msgid "lower bound cannot be NaN" msgstr "нижняя граница не может быть NaN" -#: utils/adt/numeric.c:4261 +#: utils/adt/numeric.c:4267 #, c-format msgid "lower bound cannot be infinity" msgstr "нижняя граница не может быть бесконечностью" -#: utils/adt/numeric.c:4268 +#: utils/adt/numeric.c:4274 #, c-format msgid "upper bound cannot be NaN" msgstr "верхняя граница не может быть NaN" -#: utils/adt/numeric.c:4272 +#: utils/adt/numeric.c:4278 #, c-format msgid "upper bound cannot be infinity" msgstr "верхняя граница не может быть бесконечностью" -#: utils/adt/numeric.c:4433 utils/adt/numeric.c:4521 utils/adt/numeric.c:4581 -#: utils/adt/numeric.c:4777 +#: utils/adt/numeric.c:4439 utils/adt/numeric.c:4527 utils/adt/numeric.c:4587 +#: utils/adt/numeric.c:4783 #, c-format msgid "cannot convert NaN to %s" msgstr "нельзя преобразовать NaN в %s" -#: utils/adt/numeric.c:4437 utils/adt/numeric.c:4525 utils/adt/numeric.c:4585 -#: utils/adt/numeric.c:4781 +#: utils/adt/numeric.c:4443 utils/adt/numeric.c:4531 utils/adt/numeric.c:4591 +#: utils/adt/numeric.c:4787 #, c-format msgid "cannot convert infinity to %s" msgstr "нельзя представить бесконечность в %s" -#: utils/adt/numeric.c:4790 +#: utils/adt/numeric.c:4796 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn вне диапазона" -#: utils/adt/numeric.c:7982 utils/adt/numeric.c:8033 +#: utils/adt/numeric.c:7988 utils/adt/numeric.c:8039 #, c-format msgid "numeric field overflow" msgstr "переполнение поля numeric" -#: utils/adt/numeric.c:7983 +#: utils/adt/numeric.c:7989 #, c-format msgid "" "A field with precision %d, scale %d must round to an absolute value less " @@ -29406,13 +29498,13 @@ "Поле с точностью %d, порядком %d должно округляться до абсолютного значения " "меньше чем %s%d." -#: utils/adt/numeric.c:8034 +#: utils/adt/numeric.c:8040 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "" "Поле с точностью %d, порядком %d не может содержать значение бесконечности." -#: utils/adt/numeric.c:11360 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/numeric.c:11366 utils/adt/pseudorandomfuncs.c:135 #: utils/adt/pseudorandomfuncs.c:159 #, c-format msgid "lower bound must be less than or equal to upper bound" @@ -29464,31 +29556,31 @@ msgid "locale name \"%s\" contains non-ASCII characters" msgstr "имя локали \"%s\" содержит не-ASCII символы" -#: utils/adt/pg_locale.c:1510 +#: utils/adt/pg_locale.c:1518 #, c-format msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" msgstr "" "не удалось открыть сортировщик для локали \"%s\" с правилами \"%s\": %s" -#: utils/adt/pg_locale.c:1524 utils/adt/pg_locale.c:3001 -#: utils/adt/pg_locale.c:3074 +#: utils/adt/pg_locale.c:1532 utils/adt/pg_locale.c:3011 +#: utils/adt/pg_locale.c:3084 #, c-format msgid "ICU is not supported in this build" msgstr "ICU не поддерживается в данной сборке" -#: utils/adt/pg_locale.c:1552 +#: utils/adt/pg_locale.c:1560 #, c-format msgid "could not create locale \"%s\": %m" msgstr "не удалось создать локаль \"%s\": %m" -#: utils/adt/pg_locale.c:1555 +#: utils/adt/pg_locale.c:1563 #, c-format msgid "" "The operating system could not find any locale data for the locale name " "\"%s\"." msgstr "Операционная система не может найти данные локали с именем \"%s\"." -#: utils/adt/pg_locale.c:1676 +#: utils/adt/pg_locale.c:1688 #, c-format msgid "" "collations with different collate and ctype values are not supported on this " @@ -29497,17 +29589,17 @@ "правила сортировки с разными значениями collate и ctype не поддерживаются на " "этой платформе" -#: utils/adt/pg_locale.c:1723 +#: utils/adt/pg_locale.c:1735 #, c-format msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "для правила сортировки \"%s\", лишённого версии, была записана версия" -#: utils/adt/pg_locale.c:1729 +#: utils/adt/pg_locale.c:1741 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "несовпадение версии для правила сортировки \"%s\"" -#: utils/adt/pg_locale.c:1731 +#: utils/adt/pg_locale.c:1743 #, c-format msgid "" "The collation in the database was created using version %s, but the " @@ -29516,7 +29608,7 @@ "Правило сортировки в базе данных было создано с версией %s, но операционная " "система предоставляет версию %s." -#: utils/adt/pg_locale.c:1734 +#: utils/adt/pg_locale.c:1746 #, c-format msgid "" "Rebuild all objects affected by this collation and run ALTER COLLATION %s " @@ -29526,98 +29618,98 @@ "ALTER COLLATION %s REFRESH VERSION либо соберите PostgreSQL с правильной " "версией библиотеки." -#: utils/adt/pg_locale.c:1778 utils/adt/pg_locale.c:2565 -#: utils/adt/pg_locale.c:2590 +#: utils/adt/pg_locale.c:1790 utils/adt/pg_locale.c:2572 +#: utils/adt/pg_locale.c:2597 #, c-format msgid "invalid locale name \"%s\" for builtin provider" msgstr "неверное имя локали \"%s\" для встроенного провайдера" -#: utils/adt/pg_locale.c:1820 +#: utils/adt/pg_locale.c:1832 #, c-format msgid "could not load locale \"%s\"" msgstr "не удалось загрузить локаль \"%s\"" -#: utils/adt/pg_locale.c:1845 +#: utils/adt/pg_locale.c:1857 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "" "не удалось получить версию правила сортировки для локали \"%s\" (код ошибки: " "%lu)" -#: utils/adt/pg_locale.c:1901 utils/adt/pg_locale.c:1914 +#: utils/adt/pg_locale.c:1922 utils/adt/pg_locale.c:1935 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "не удалось преобразовать строку в UTF-16 (код ошибки: %lu)" -#: utils/adt/pg_locale.c:1926 +#: utils/adt/pg_locale.c:1947 #, c-format msgid "could not compare Unicode strings: %m" msgstr "не удалось сравнить строки в Unicode: %m" -#: utils/adt/pg_locale.c:2100 +#: utils/adt/pg_locale.c:2119 #, c-format msgid "collation failed: %s" msgstr "ошибка в библиотеке сортировки: %s" -#: utils/adt/pg_locale.c:2319 utils/adt/pg_locale.c:2354 +#: utils/adt/pg_locale.c:2326 utils/adt/pg_locale.c:2361 #, c-format msgid "sort key generation failed: %s" msgstr "не удалось сгенерировать ключ сортировки: %s" -#: utils/adt/pg_locale.c:2644 +#: utils/adt/pg_locale.c:2651 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "не удалось определить язык для локали \"%s\": %s" -#: utils/adt/pg_locale.c:2665 utils/adt/pg_locale.c:2681 +#: utils/adt/pg_locale.c:2672 utils/adt/pg_locale.c:2688 #, c-format msgid "could not open collator for locale \"%s\": %s" msgstr "не удалось открыть сортировщик для локали \"%s\": %s" -#: utils/adt/pg_locale.c:2706 +#: utils/adt/pg_locale.c:2713 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "ICU не поддерживает кодировку \"%s\"" -#: utils/adt/pg_locale.c:2713 +#: utils/adt/pg_locale.c:2720 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "не удалось открыть преобразователь ICU для кодировки \"%s\": %s" -#: utils/adt/pg_locale.c:2731 utils/adt/pg_locale.c:2750 -#: utils/adt/pg_locale.c:2806 utils/adt/pg_locale.c:2817 +#: utils/adt/pg_locale.c:2742 utils/adt/pg_locale.c:2760 +#: utils/adt/pg_locale.c:2816 utils/adt/pg_locale.c:2827 #, c-format msgid "%s failed: %s" msgstr "ошибка %s: %s" -#: utils/adt/pg_locale.c:2992 +#: utils/adt/pg_locale.c:3002 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "не удалось получить из названия локали \"%s\" метку языка: %s" -#: utils/adt/pg_locale.c:3033 +#: utils/adt/pg_locale.c:3043 #, c-format msgid "could not get language from ICU locale \"%s\": %s" msgstr "не удалось определить язык для локали ICU \"%s\": %s" -#: utils/adt/pg_locale.c:3035 utils/adt/pg_locale.c:3064 +#: utils/adt/pg_locale.c:3045 utils/adt/pg_locale.c:3074 #, c-format msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." msgstr "" "Чтобы отключить проверку локалей ICU, установите для параметра \"%s\" " "значение \"%s\"." -#: utils/adt/pg_locale.c:3062 +#: utils/adt/pg_locale.c:3072 #, c-format msgid "ICU locale \"%s\" has unknown language \"%s\"" msgstr "для локали ICU \"%s\" получен неизвестный язык \"%s\"" -#: utils/adt/pg_locale.c:3213 +#: utils/adt/pg_locale.c:3223 #, c-format msgid "invalid multibyte character for locale" msgstr "неверный многобайтный символ для локали" -#: utils/adt/pg_locale.c:3214 +#: utils/adt/pg_locale.c:3224 #, c-format msgid "" "The server's LC_CTYPE locale is probably incompatible with the database " @@ -29825,8 +29917,8 @@ msgstr "" "Чтобы обозначить отсутствующий аргумент унарного оператора, укажите NONE." -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10526 -#: utils/adt/ruleutils.c:10739 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10528 +#: utils/adt/ruleutils.c:10741 #, c-format msgid "too many arguments" msgstr "слишком много аргументов" @@ -30018,22 +30110,22 @@ msgid "cannot compare record types with different numbers of columns" msgstr "сравнивать типы записей с разным числом столбцов нельзя" -#: utils/adt/ruleutils.c:2694 +#: utils/adt/ruleutils.c:2696 #, c-format msgid "input is a query, not an expression" msgstr "на вход поступил запрос, а не выражение" -#: utils/adt/ruleutils.c:2706 +#: utils/adt/ruleutils.c:2708 #, c-format msgid "expression contains variables of more than one relation" msgstr "выражение содержит переменные из нескольких отношений" -#: utils/adt/ruleutils.c:2713 +#: utils/adt/ruleutils.c:2715 #, c-format msgid "expression contains variables" msgstr "выражение содержит переменные" -#: utils/adt/ruleutils.c:5246 +#: utils/adt/ruleutils.c:5248 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "правило \"%s\" имеет неподдерживаемый тип событий %d" @@ -30082,21 +30174,21 @@ #: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 #: utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 -#: utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 -#: utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 -#: utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 -#: utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 -#: utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 -#: utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 -#: utils/adt/timestamp.c:3537 utils/adt/timestamp.c:3546 -#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 -#: utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 -#: utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 -#: utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 -#: utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 -#: utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 -#: utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 -#: utils/adt/timestamp.c:5097 +#: utils/adt/timestamp.c:2811 utils/adt/timestamp.c:2820 +#: utils/adt/timestamp.c:2835 utils/adt/timestamp.c:2909 +#: utils/adt/timestamp.c:2926 utils/adt/timestamp.c:2983 +#: utils/adt/timestamp.c:3026 utils/adt/timestamp.c:3404 +#: utils/adt/timestamp.c:3462 utils/adt/timestamp.c:3485 +#: utils/adt/timestamp.c:3494 utils/adt/timestamp.c:3518 +#: utils/adt/timestamp.c:3541 utils/adt/timestamp.c:3550 +#: utils/adt/timestamp.c:3685 utils/adt/timestamp.c:3786 +#: utils/adt/timestamp.c:4193 utils/adt/timestamp.c:4230 +#: utils/adt/timestamp.c:4278 utils/adt/timestamp.c:4287 +#: utils/adt/timestamp.c:4379 utils/adt/timestamp.c:4426 +#: utils/adt/timestamp.c:4435 utils/adt/timestamp.c:4531 +#: utils/adt/timestamp.c:4584 utils/adt/timestamp.c:4594 +#: utils/adt/timestamp.c:4789 utils/adt/timestamp.c:4799 +#: utils/adt/timestamp.c:5101 #, c-format msgid "interval out of range" msgstr "interval вне диапазона" @@ -30121,33 +30213,33 @@ msgid "interval(%d) precision must be between %d and %d" msgstr "точность interval(%d) должна быть между %d и %d" -#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 +#: utils/adt/timestamp.c:4568 utils/adt/timestamp.c:4773 #, c-format msgid "origin out of range" msgstr "начало вне диапазона" -#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#: utils/adt/timestamp.c:4573 utils/adt/timestamp.c:4778 #, c-format msgid "timestamps cannot be binned into infinite intervals" msgstr "значения timestamp нельзя подогнать под бесконечные интервалы" -#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 +#: utils/adt/timestamp.c:4578 utils/adt/timestamp.c:4783 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "" "значения timestamp нельзя подогнать под интервалы, содержащие месяцы или годы" -#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 +#: utils/adt/timestamp.c:4589 utils/adt/timestamp.c:4794 #, c-format msgid "stride must be greater than zero" msgstr "шаг должен быть больше нуля" -#: utils/adt/timestamp.c:5091 +#: utils/adt/timestamp.c:5095 #, c-format msgid "Months usually have fractional weeks." msgstr "В месяцах обычно дробное количество недель." -#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#: utils/adt/timestamp.c:6555 utils/adt/timestamp.c:6641 #, c-format msgid "step size cannot be infinite" msgstr "размер шага не может быть бесконечным" @@ -30266,62 +30358,67 @@ 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\" имеет не символьный тип" @@ -30668,71 +30765,71 @@ 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, отбирающее столбец, возвратило более одного значения" -#: utils/cache/lsyscache.c:1055 +#: utils/cache/lsyscache.c:1116 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "приведение типа %s к типу %s не существует" -#: utils/cache/lsyscache.c:2925 utils/cache/lsyscache.c:2958 -#: utils/cache/lsyscache.c:2991 utils/cache/lsyscache.c:3024 +#: utils/cache/lsyscache.c:3000 utils/cache/lsyscache.c:3033 +#: utils/cache/lsyscache.c:3066 utils/cache/lsyscache.c:3099 #, c-format msgid "type %s is only a shell" msgstr "тип %s является пустышкой" -#: utils/cache/lsyscache.c:2930 +#: utils/cache/lsyscache.c:3005 #, c-format msgid "no input function available for type %s" msgstr "для типа %s нет функции ввода" -#: utils/cache/lsyscache.c:2963 +#: utils/cache/lsyscache.c:3038 #, c-format msgid "no output function available for type %s" msgstr "для типа %s нет функции вывода" @@ -30751,30 +30848,30 @@ msgid "cached plan must not change result type" msgstr "в кешированном плане не должен изменяться тип результата" -#: utils/cache/relcache.c:3817 +#: utils/cache/relcache.c:3819 #, c-format msgid "heap relfilenumber value not set when in binary upgrade mode" msgstr "" "значение relfilenumber для кучи не задано в режиме двоичного обновления" -#: utils/cache/relcache.c:3825 +#: utils/cache/relcache.c:3827 #, c-format msgid "unexpected request for new relfilenumber in binary upgrade mode" msgstr "" "неожиданный запрос нового значения relfilenumber в режиме двоичного " "обновления" -#: utils/cache/relcache.c:6555 +#: utils/cache/relcache.c:6557 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "создать файл инициализации для кеша отношений \"%s\" не удалось: %m" -#: utils/cache/relcache.c:6557 +#: utils/cache/relcache.c:6559 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Продолжаем всё равно, хотя что-то не так." -#: utils/cache/relcache.c:6887 +#: utils/cache/relcache.c:6889 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "не удалось стереть файл кеша \"%s\": %m" @@ -30795,7 +30892,7 @@ msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "ошибка контрольной суммы в файле сопоставления отношений \"%s\"" -#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 +#: utils/cache/typcache.c:1805 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "тип записи не зарегистрирован" @@ -34699,16 +34796,26 @@ msgid "could not attach to dynamic shared area" msgstr "не удалось подключиться к динамической разделяемой области" -#: utils/mmgr/mcxt.c:1158 +#: utils/mmgr/mcxt.c:1161 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Ошибка при запросе блока размером %zu в контексте памяти \"%s\"." -#: utils/mmgr/mcxt.c:1314 +#: utils/mmgr/mcxt.c:1317 #, c-format msgid "logging memory contexts of PID %d" msgstr "вывод информации о памяти процесса с PID %d" +#: utils/mmgr/mcxt.c:1690 +#, c-format +msgid "invalid memory allocation request size %zu + %zu" +msgstr "недопустимый размер в запросе на выделение памяти: %zu + %zu" + +#: utils/mmgr/mcxt.c:1709 +#, 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" @@ -35321,7 +35428,7 @@ msgid "unexpected end after backslash" msgstr "неожиданный конец строки после обратной косой черты" -#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 +#: jsonpath_scan.l:201 repl_scanner.l:215 scan.l:756 msgid "unterminated quoted string" msgstr "незавершённая строка в кавычках" @@ -35500,6 +35607,10 @@ msgstr "Используйте для записи спецсимволов синтаксис спецстрок E'\\r\\n'." #, c-format +#~ msgid "requested shared memory size overflows size_t" +#~ msgstr "запрошенный размер разделяемой памяти не умещается в size_t" + +#, c-format #~ msgid "aborting startup due to startup process failure" #~ msgstr "прерывание запуска из-за ошибки в стартовом процессе" diff -Nru postgresql-17-17.10/src/backend/postmaster/autovacuum.c postgresql-17-17.11/src/backend/postmaster/autovacuum.c --- postgresql-17-17.10/src/backend/postmaster/autovacuum.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/postmaster/autovacuum.c 2026-08-10 20:54:09.000000000 +0000 @@ -1054,8 +1054,8 @@ 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 -Nru postgresql-17-17.10/src/backend/postmaster/walsummarizer.c postgresql-17-17.11/src/backend/postmaster/walsummarizer.c --- postgresql-17-17.10/src/backend/postmaster/walsummarizer.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/postmaster/walsummarizer.c 2026-08-10 20:54:09.000000000 +0000 @@ -102,6 +102,8 @@ bool historic; XLogRecPtr read_upto; bool end_of_wal; + int num_descendant_tlis; + TimeLineID *descendant_tlis; } SummarizerReadLocalXLogPrivate; /* Pointer to shared memory state. */ @@ -146,9 +148,13 @@ static void WalSummarizerShutdown(int code, Datum arg); static XLogRecPtr GetLatestLSN(TimeLineID *tli); static void HandleWalSummarizerInterrupts(void); +static XLogRecPtr WalSummarizerSwitchPoint(TimeLineID current_tli, List *tles, + int *num_descendant_tlis, + TimeLineID **descendant_tlis); 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, @@ -157,6 +163,9 @@ 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, @@ -220,16 +229,19 @@ * 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); @@ -350,6 +362,7 @@ { XLogRecPtr latest_lsn; TimeLineID latest_tli; + XLogRecPtr maximum_lsn; XLogRecPtr end_of_summary_lsn; /* Flush any leaked data in the top-level context */ @@ -380,11 +393,33 @@ 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))); } /* @@ -395,12 +430,15 @@ 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); @@ -414,9 +452,11 @@ } /* 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); @@ -853,6 +893,62 @@ } /* + * 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. */ static void @@ -905,7 +1001,8 @@ */ 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; @@ -923,11 +1020,13 @@ 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) @@ -1483,6 +1582,54 @@ } /* + * 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 * from the current timeline, or give up if reading from a historic timeline. diff -Nru postgresql-17-17.10/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c postgresql-17-17.11/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c --- postgresql-17-17.10/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c 2026-08-10 20:54:09.000000000 +0000 @@ -113,7 +113,7 @@ /* Prototypes for private functions */ static PGresult *libpqrcv_PQexec(PGconn *streamConn, const char *query); static PGresult *libpqrcv_PQgetResult(PGconn *streamConn); -static char *stringlist_to_identifierstr(PGconn *conn, List *strings); +static char *stringlist_to_identifierstr(List *strings); /* * Module initialization function @@ -492,6 +492,20 @@ } 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; @@ -563,6 +577,32 @@ } /* + * 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. * * Returns true if we switched successfully to copy-both mode. False @@ -587,8 +627,10 @@ /* 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"); @@ -603,7 +645,6 @@ { char *pubnames_str; List *pubnames; - char *pubnames_literal; appendStringInfoString(&cmd, " ("); @@ -611,8 +652,10 @@ 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) @@ -620,25 +663,15 @@ 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 && @@ -1045,7 +1078,8 @@ initStringInfo(&cmd); - appendStringInfo(&cmd, "CREATE_REPLICATION_SLOT \"%s\"", slotname); + appendStringInfoString(&cmd, "CREATE_REPLICATION_SLOT "); + appendQuotedIdentifier(&cmd, slotname); if (temporary) appendStringInfoString(&cmd, " TEMPORARY"); @@ -1127,6 +1161,14 @@ 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)))); @@ -1152,8 +1194,9 @@ PGresult *res; initStringInfo(&cmd); - appendStringInfo(&cmd, "ALTER_REPLICATION_SLOT %s ( FAILOVER %s )", - quote_identifier(slotname), + appendStringInfoString(&cmd, "ALTER_REPLICATION_SLOT "); + appendQuotedIdentifier(&cmd, slotname); + appendStringInfo(&cmd, " ( FAILOVER %s )", failover ? "true" : "false"); res = libpqrcv_PQexec(conn->streamConn, cmd.data); @@ -1334,10 +1377,10 @@ * * 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; @@ -1348,21 +1391,12 @@ 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 -Nru postgresql-17-17.10/src/backend/replication/logical/logical.c postgresql-17-17.11/src/backend/replication/logical/logical.c --- postgresql-17-17.10/src/backend/replication/logical/logical.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/logical/logical.c 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ 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 @@ * 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 @@ -748,7 +815,9 @@ /* * 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 -Nru postgresql-17-17.10/src/backend/replication/logical/reorderbuffer.c postgresql-17-17.11/src/backend/replication/logical/reorderbuffer.c --- postgresql-17-17.10/src/backend/replication/logical/reorderbuffer.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/logical/reorderbuffer.c 2026-08-10 20:54:09.000000000 +0000 @@ -2081,8 +2081,7 @@ 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_prepared(txn)); @@ -2090,13 +2089,6 @@ /* Free all resources allocated for toast reconstruction */ ReorderBufferToastReset(rb, txn); - /* Return the spec insert change if it is not NULL */ - if (specinsert != NULL) - { - ReorderBufferReturnChange(rb, specinsert, true); - specinsert = NULL; - } - /* * For the streaming case, stop the stream and remember the command ID and * snapshot for the streaming run. @@ -2360,7 +2352,7 @@ * CheckTableNotInUse() and locking. */ - /* clear out a pending (and thus failed) speculation */ + /* clear out a pending (= failed) speculative insertion */ if (specinsert != NULL) { ReorderBufferReturnChange(rb, specinsert, true); @@ -2663,6 +2655,13 @@ if (using_subtxn) RollbackAndReleaseCurrentSubTransaction(); + /* Free the specinsert change before freeing the ReorderBufferTXN */ + if (specinsert != NULL) + { + ReorderBufferReturnChange(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 @@ -2689,8 +2688,7 @@ /* 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 { @@ -2935,6 +2933,24 @@ 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); + + /* + * 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 -Nru postgresql-17-17.10/src/backend/replication/logical/slotsync.c postgresql-17-17.11/src/backend/replication/logical/slotsync.c --- postgresql-17-17.10/src/backend/replication/logical/slotsync.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/logical/slotsync.c 2026-08-10 20:54:09.000000000 +0000 @@ -274,7 +274,7 @@ { 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); @@ -447,6 +447,7 @@ /* 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; /* @@ -454,8 +455,8 @@ * 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 @@ -472,17 +473,19 @@ if (synced_slot) { - ReplicationSlotAcquire(NameStr(local_slot->data.name), true); + NameData slot_name = local_slot->data.name; + + ReplicationSlotAcquire(NameStr(slot_name), true); 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 -Nru postgresql-17-17.10/src/backend/replication/logical/tablesync.c postgresql-17-17.11/src/backend/replication/logical/tablesync.c --- postgresql-17-17.10/src/backend/replication/logical/tablesync.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/logical/tablesync.c 2026-08-10 20:54:09.000000000 +0000 @@ -1268,6 +1268,7 @@ /* Do the copy */ (void) CopyFrom(cstate); + EndCopyFrom(cstate); logicalrep_rel_close(relmapentry, NoLock); } diff -Nru postgresql-17-17.10/src/backend/replication/logical/worker.c postgresql-17-17.11/src/backend/replication/logical/worker.c --- postgresql-17-17.10/src/backend/replication/logical/worker.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/logical/worker.c 2026-08-10 20:54:09.000000000 +0000 @@ -813,9 +813,15 @@ 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; @@ -926,7 +932,11 @@ 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) { @@ -2599,7 +2609,12 @@ 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, @@ -4731,10 +4746,6 @@ 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 -Nru postgresql-17-17.10/src/backend/replication/repl_scanner.l postgresql-17-17.11/src/backend/replication/repl_scanner.l --- postgresql-17-17.10/src/backend/replication/repl_scanner.l 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/repl_scanner.l 2026-08-10 20:54:09.000000000 +0000 @@ -191,6 +191,10 @@ return IDENT; } +{xddouble} { + addlitchar('"'); + } + {xdinside} { addlit(yytext, yyleng); } diff -Nru postgresql-17-17.10/src/backend/replication/slot.c postgresql-17-17.11/src/backend/replication/slot.c --- postgresql-17-17.10/src/backend/replication/slot.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/slot.c 2026-08-10 20:54:09.000000000 +0000 @@ -702,48 +702,50 @@ */ 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; - slot->inactive_since = now; - SpinLockRelease(&slot->mutex); - ConditionVariableBroadcast(&slot->active_cv); - } - else - { - SpinLockAcquire(&slot->mutex); - slot->inactive_since = now; - SpinLockRelease(&slot->mutex); - } + now = GetCurrentTimestamp(); + + 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; + slot->inactive_since = now; + SpinLockRelease(&slot->mutex); + ConditionVariableBroadcast(&slot->active_cv); + } + else + { + SpinLockAcquire(&slot->mutex); + slot->inactive_since = now; + SpinLockRelease(&slot->mutex); + } - MyReplicationSlot = NULL; + MyReplicationSlot = NULL; + } /* might not have been set when we've been a plain slot */ LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); diff -Nru postgresql-17-17.10/src/backend/replication/walreceiver.c postgresql-17-17.11/src/backend/replication/walreceiver.c --- postgresql-17-17.10/src/backend/replication/walreceiver.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/walreceiver.c 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ 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 * corresponding the filename of recvFile. @@ -190,6 +197,8 @@ TimeLineID startpointTLI; TimeLineID primaryTLI; bool first_stream; + bool upstream_catchup_logged = false; + TimestampTz upstream_catchup_deadline = 0; WalRcvData *walrcv; TimestampTz now; char *err; @@ -341,8 +350,10 @@ /* * 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, @@ -367,6 +378,72 @@ 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 * become the primary later on, we don't select the same timeline that diff -Nru postgresql-17-17.10/src/backend/replication/walreceiverfuncs.c postgresql-17-17.11/src/backend/replication/walreceiverfuncs.c --- postgresql-17-17.10/src/backend/replication/walreceiverfuncs.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/walreceiverfuncs.c 2026-08-10 20:54:09.000000000 +0000 @@ -265,11 +265,6 @@ Assert(walrcv->walRcvState == WALRCV_STOPPED || walrcv->walRcvState == WALRCV_WAITING); - if (conninfo != NULL) - strlcpy((char *) 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 @@ -287,10 +282,19 @@ 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((char *) walrcv->conninfo, conninfo, MAXCONNINFO); + else + walrcv->conninfo[0] = '\0'; } else walrcv->walRcvState = WALRCV_RESTARTING; diff -Nru postgresql-17-17.10/src/backend/replication/walsender.c postgresql-17-17.11/src/backend/replication/walsender.c --- postgresql-17-17.10/src/backend/replication/walsender.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/replication/walsender.c 2026-08-10 20:54:09.000000000 +0000 @@ -1091,7 +1091,29 @@ 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 -Nru postgresql-17-17.10/src/backend/rewrite/rewriteDefine.c postgresql-17-17.11/src/backend/rewrite/rewriteDefine.c --- postgresql-17-17.10/src/backend/rewrite/rewriteDefine.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/rewrite/rewriteDefine.c 2026-08-10 20:54:09.000000000 +0000 @@ -161,6 +161,7 @@ /* * 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 @@ 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 @@ * ... 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 @@ (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 -Nru postgresql-17-17.10/src/backend/statistics/dependencies.c postgresql-17-17.11/src/backend/statistics/dependencies.c --- postgresql-17-17.10/src/backend/statistics/dependencies.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/statistics/dependencies.c 2026-08-10 20:54:09.000000000 +0000 @@ -536,7 +536,7 @@ 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 -Nru postgresql-17-17.10/src/backend/storage/aio/read_stream.c postgresql-17-17.11/src/backend/storage/aio/read_stream.c --- postgresql-17-17.10/src/backend/storage/aio/read_stream.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/storage/aio/read_stream.c 2026-08-10 20:54:09.000000000 +0000 @@ -407,6 +407,16 @@ smgr = RelationGetSmgr(rel); /* + * 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. That * currently means advice to the kernel to tell it that we will soon read. * This number also affects how far we look ahead for opportunities to @@ -460,7 +470,12 @@ LimitAdditionalLocalPins(&max_pinned_buffers); else LimitAdditionalPins(&max_pinned_buffers); - Assert(max_pinned_buffers > 0); + + /* + * The limit might be zero on a system configured with too few buffers for + * the number of connections. We need at least one to make progress. + */ + max_pinned_buffers = Max(1, max_pinned_buffers); /* * We need one extra entry for buffers and per-buffer data, because users diff -Nru postgresql-17-17.10/src/backend/storage/buffer/bufmgr.c postgresql-17-17.11/src/backend/storage/buffer/bufmgr.c --- postgresql-17-17.10/src/backend/storage/buffer/bufmgr.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/storage/buffer/bufmgr.c 2026-08-10 20:54:09.000000000 +0000 @@ -649,7 +649,7 @@ 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), @@ -802,18 +802,9 @@ 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); @@ -1108,7 +1099,7 @@ * 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 smgr_persistence, @@ -1201,7 +1192,7 @@ * * 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, @@ -1212,6 +1203,18 @@ int flags; /* + * 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() * scales a lot better. @@ -1260,7 +1263,7 @@ return buffer; } -static pg_attribute_always_inline bool +static pg_always_inline bool StartReadBuffersImpl(ReadBuffersOperation *operation, Buffer *buffers, BlockNumber blockNum, @@ -1273,6 +1276,12 @@ 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; @@ -1597,7 +1606,7 @@ * * 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, @@ -2158,9 +2167,23 @@ 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, diff -Nru postgresql-17-17.10/src/backend/storage/ipc/procsignal.c postgresql-17-17.11/src/backend/storage/ipc/procsignal.c --- postgresql-17-17.10/src/backend/storage/ipc/procsignal.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/storage/ipc/procsignal.c 2026-08-10 20:54:09.000000000 +0000 @@ -176,6 +176,16 @@ 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. + */ + slot->pss_pid = MyProcPid; + pg_memory_barrier(); + + /* * Initialize barrier state. Since we're a brand-new process, there * shouldn't be any leftover backend-private state that needs to be * updated. Therefore, we can broadcast the latest barrier generation and @@ -192,9 +202,6 @@ pg_atomic_write_u64(&slot->pss_barrierGeneration, barrier_generation); pg_memory_barrier(); - /* Mark slot with my PID */ - slot->pss_pid = MyProcPid; - /* Remember slot location for CheckProcSignal */ MyProcSignalSlot = slot; diff -Nru postgresql-17-17.10/src/backend/storage/lmgr/proc.c postgresql-17-17.11/src/backend/storage/lmgr/proc.c --- postgresql-17-17.10/src/backend/storage/lmgr/proc.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/storage/lmgr/proc.c 2026-08-10 20:54:09.000000000 +0000 @@ -839,7 +839,10 @@ ProcKill(int code, Datum arg) { PGPROC *proc; + PGPROC *leader; dlist_head *procgloballist; + bool push_leader; + bool push_self; Assert(MyProc != NULL); @@ -871,69 +874,99 @@ 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. */ - if (MyProc->lockGroupLeader != NULL) + 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. + */ + 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 -Nru postgresql-17-17.10/src/backend/tcop/backend_startup.c postgresql-17-17.11/src/backend/tcop/backend_startup.c --- postgresql-17-17.10/src/backend/tcop/backend_startup.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/tcop/backend_startup.c 2026-08-10 20:54:09.000000000 +0000 @@ -625,8 +625,13 @@ 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 -Nru postgresql-17-17.10/src/backend/tcop/postgres.c postgresql-17-17.11/src/backend/tcop/postgres.c --- postgresql-17-17.10/src/backend/tcop/postgres.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/tcop/postgres.c 2026-08-10 20:54:09.000000000 +0000 @@ -3521,7 +3521,8 @@ /* * 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); @@ -3575,13 +3576,28 @@ bool stack_is_too_deep(void) { +#ifndef HAVE__BUILTIN_FRAME_ADDRESS char stack_top_loc; +#endif long 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 = (long) (stack_base_ptr - &stack_top_loc); + stack_depth = (long) (stack_base_ptr - stack_address); /* * Take abs value, since stacks grow up on some machines, down on others diff -Nru postgresql-17-17.10/src/backend/tcop/pquery.c postgresql-17-17.11/src/backend/tcop/pquery.c --- postgresql-17-17.10/src/backend/tcop/pquery.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/tcop/pquery.c 2026-08-10 20:54:09.000000000 +0000 @@ -1007,8 +1007,8 @@ portal->holdStore, portal->holdContext, false, - NULL, - NULL); + portal->tupDesc, + gettext_noop("query result type does not match portal result type")); switch (portal->strategy) { diff -Nru postgresql-17-17.10/src/backend/tcop/utility.c postgresql-17-17.11/src/backend/tcop/utility.c --- postgresql-17-17.10/src/backend/tcop/utility.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/tcop/utility.c 2026-08-10 20:54:09.000000000 +0000 @@ -1364,7 +1364,8 @@ address = AlterDomainAddConstraint(stmt->typeName, stmt->def, - &secondaryObject); + &secondaryObject, + false); break; case 'X': /* DROP CONSTRAINT */ address = @@ -1875,7 +1876,21 @@ { 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, @@ -1898,7 +1913,8 @@ /* Run parse analysis ... */ stmt = transformStatsStmt(relid, stmt, queryString); - address = CreateStatistics(stmt, true); + address = CreateStatistics(list_make1_oid(relid), stmt, + true); } break; diff -Nru postgresql-17-17.10/src/backend/tsearch/dict_synonym.c postgresql-17-17.11/src/backend/tsearch/dict_synonym.c --- postgresql-17-17.10/src/backend/tsearch/dict_synonym.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/tsearch/dict_synonym.c 2026-08-10 20:54:09.000000000 +0000 @@ -22,7 +22,6 @@ { char *in; char *out; - int outlen; uint16 flags; } Syn; @@ -187,7 +186,6 @@ d->syn[cur].out = lowerstr(starto); } - d->syn[cur].outlen = strlen(starto); d->syn[cur].flags = flags; cur++; @@ -234,7 +232,7 @@ 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 -Nru postgresql-17-17.10/src/backend/tsearch/spell.c postgresql-17-17.11/src/backend/tsearch/spell.c --- postgresql-17-17.10/src/backend/tsearch/spell.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/tsearch/spell.c 2026-08-10 20:54:09.000000000 +0000 @@ -1181,12 +1181,18 @@ 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), @@ -1421,6 +1427,13 @@ 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))); } /* @@ -1448,6 +1461,8 @@ 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), @@ -1993,7 +2008,8 @@ /* 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 -Nru postgresql-17-17.10/src/backend/tsearch/to_tsany.c postgresql-17-17.11/src/backend/tsearch/to_tsany.c --- postgresql-17-17.10/src/backend/tsearch/to_tsany.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/tsearch/to_tsany.c 2026-08-10 20:54:09.000000000 +0000 @@ -165,8 +165,8 @@ make_tsvector(ParsedText *prs) { int i, - j, - lenstr = 0, + j; + size_t lenstr = 0, totallen; TSVector in; WordEntry *ptr; @@ -177,10 +177,22 @@ 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 @@ 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 -Nru postgresql-17-17.10/src/backend/tsearch/ts_parse.c postgresql-17-17.11/src/backend/tsearch/ts_parse.c --- postgresql-17-17.10/src/backend/tsearch/ts_parse.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/tsearch/ts_parse.c 2026-08-10 20:54:09.000000000 +0000 @@ -401,12 +401,30 @@ 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 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/activity/backend_progress.c postgresql-17-17.11/src/backend/utils/activity/backend_progress.c --- postgresql-17-17.10/src/backend/utils/activity/backend_progress.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/activity/backend_progress.c 2026-08-10 20:54:09.000000000 +0000 @@ -100,8 +100,6 @@ { static StringInfoData progress_message; - initStringInfo(&progress_message); - pq_beginmessage(&progress_message, PqMsg_Progress); pq_sendint32(&progress_message, index); pq_sendint64(&progress_message, incr); diff -Nru postgresql-17-17.10/src/backend/utils/activity/pgstat.c postgresql-17-17.11/src/backend/utils/activity/pgstat.c --- postgresql-17-17.10/src/backend/utils/activity/pgstat.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/activity/pgstat.c 2026-08-10 20:54:09.000000000 +0000 @@ -97,6 +97,7 @@ #include "lib/dshash.h" #include "pgstat.h" #include "port/atomics.h" +#include "replication/walsender.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/lwlock.h" @@ -516,8 +517,12 @@ pgstat_report_stat(true); - /* there shouldn't be any pending changes left */ - Assert(dlist_is_empty(&pgStatPending)); + /* + * There shouldn't be any pending changes left, unless this is a WAL + * sender that would shut down after the checkpointer has flushed the + * stats. + */ + Assert(dlist_is_empty(&pgStatPending) || am_walsender); dlist_init(&pgStatPending); pgstat_detach_shmem(); @@ -608,7 +613,13 @@ * assert that before the checks above, as there is an unconditional * pgstat_report_stat() call in pgstat_shutdown_hook() - which at least * the process that ran pgstat_before_server_shutdown() will still call. + * + * WAL senders would be shut down after the checkpointer and may still + * have stats. Skip them. */ + if (pgStatLocal.shmem->is_shutdown && am_walsender) + return 0; + Assert(!pgStatLocal.shmem->is_shutdown); if (force) diff -Nru postgresql-17-17.10/src/backend/utils/activity/pgstat_function.c postgresql-17-17.11/src/backend/utils/activity/pgstat_function.c --- postgresql-17-17.10/src/backend/utils/activity/pgstat_function.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/activity/pgstat_function.c 2026-08-10 20:54:09.000000000 +0000 @@ -112,8 +112,8 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/activity/pgstat_replslot.c postgresql-17-17.11/src/backend/utils/activity/pgstat_replslot.c --- postgresql-17-17.10/src/backend/utils/activity/pgstat_replslot.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/activity/pgstat_replslot.c 2026-08-10 20:54:09.000000000 +0000 @@ -157,8 +157,8 @@ { 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 -Nru postgresql-17-17.10/src/backend/utils/activity/pgstat_shmem.c postgresql-17-17.11/src/backend/utils/activity/pgstat_shmem.c --- postgresql-17-17.10/src/backend/utils/activity/pgstat_shmem.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/activity/pgstat_shmem.c 2026-08-10 20:54:09.000000000 +0000 @@ -498,9 +498,12 @@ 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, @@ -844,7 +847,7 @@ /* * 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. */ @@ -862,13 +865,7 @@ * 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 objoid=%u refcount=%u generation=%u", - pgstat_get_kind_info(shent->key.kind)->name, - shent->key.dboid, shent->key.objoid, - pg_atomic_read_u32(&shent->refcount), - pg_atomic_read_u32(&shent->generation)); + Assert(!shent->dropped); shent->dropped = true; /* release refcount marking entry as not dropped */ @@ -939,18 +936,32 @@ } /* + * 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, Oid objoid) +{ + return pgstat_drop_entry_ext(kind, dboid, objoid, 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, Oid objoid) +pgstat_drop_entry_ext(PgStat_Kind kind, Oid dboid, Oid objoid, + bool missing_ok) { PgStat_HashKey key; PgStatShared_HashEntry *shent; @@ -978,6 +989,20 @@ 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 objoid=%u refcount=%u generation=%u", + pgstat_get_kind_info(shent->key.kind)->name, + shent->key.dboid, + shent->key.objoid, + pg_atomic_read_u32(&shent->refcount), + pg_atomic_read_u32(&shent->generation)); + dshash_release_lock(pgStatLocal.shared_hash, shent); + return true; + } + freed = pgstat_drop_entry_internal(shent, NULL); /* diff -Nru postgresql-17-17.10/src/backend/utils/activity/pgstat_xact.c postgresql-17-17.11/src/backend/utils/activity/pgstat_xact.c --- postgresql-17-17.10/src/backend/utils/activity/pgstat_xact.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/activity/pgstat_xact.c 2026-08-10 20:54:09.000000000 +0000 @@ -84,7 +84,7 @@ * Transaction that dropped an object committed. Drop the stats * too. */ - if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid)) + if (!pgstat_drop_entry_ext(it->kind, it->dboid, it->objoid, true)) not_freed_count++; } else if (!isCommit && pending->is_create) @@ -93,7 +93,7 @@ * Transaction that created an object aborted. Drop the stats * associated with the object. */ - if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid)) + if (!pgstat_drop_entry_ext(it->kind, it->dboid, it->objoid, true)) not_freed_count++; } @@ -158,7 +158,7 @@ * Subtransaction creating a new stats object aborted. Drop the * stats object. */ - if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid)) + if (!pgstat_drop_entry_ext(it->kind, it->dboid, it->objoid, true)) not_freed_count++; pfree(pending); } @@ -320,7 +320,7 @@ { xl_xact_stats_item *it = &items[i]; - if (!pgstat_drop_entry(it->kind, it->dboid, it->objoid)) + if (!pgstat_drop_entry_ext(it->kind, it->dboid, it->objoid, true)) not_freed_count++; } diff -Nru postgresql-17-17.10/src/backend/utils/activity/wait_event_names.txt postgresql-17-17.11/src/backend/utils/activity/wait_event_names.txt --- postgresql-17-17.10/src/backend/utils/activity/wait_event_names.txt 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/activity/wait_event_names.txt 2026-08-10 20:54:09.000000000 +0000 @@ -160,6 +160,7 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/adt/acl.c postgresql-17-17.11/src/backend/utils/adt/acl.c --- postgresql-17-17.10/src/backend/utils/adt/acl.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/acl.c 2026-08-10 20:54:09.000000000 +0000 @@ -77,7 +77,7 @@ }; 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 -Nru postgresql-17-17.10/src/backend/utils/adt/cash.c postgresql-17-17.11/src/backend/utils/adt/cash.c --- postgresql-17-17.10/src/backend/utils/adt/cash.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/cash.c 2026-08-10 20:54:09.000000000 +0000 @@ -160,6 +160,22 @@ (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 -Nru postgresql-17-17.10/src/backend/utils/adt/formatting.c postgresql-17-17.11/src/backend/utils/adt/formatting.c --- postgresql-17-17.10/src/backend/utils/adt/formatting.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/formatting.c 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ -1062,8 +1063,8 @@ 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, @@ -1945,21 +1946,33 @@ 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, true); + 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, true); + + 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; @@ -2577,7 +2590,7 @@ * 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; @@ -2623,6 +2636,31 @@ } /* + * 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, + Oid collid) +{ + char *upper_substr; + char *lower_substr; + bool result; + + upper_substr = str_toupper(name, name_len, collid); + lower_substr = str_tolower(upper_substr, strlen(upper_substr), collid); + result = strcmp(lower_substr, element) == 0; + + pfree(lower_substr); + pfree(upper_substr); + return result; +} + +/* * Sequentially search an array of possibly non-English words for * a case-insensitive match to the initial character(s) of "name". * @@ -2634,9 +2672,10 @@ * 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; @@ -2650,9 +2689,9 @@ * 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) { @@ -2665,30 +2704,100 @@ * 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(unconstify(char *, 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; + size_t upper_element_len; char *lower_element; - int element_len; + 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); + upper_element_len = strlen(upper_element); + lower_element = str_tolower(upper_element, upper_element_len, collid); + lower_element_len = strlen(lower_element); pfree(upper_element); - element_len = strlen(lower_element); - /* Match? */ - if (strncmp(lower_name, lower_element, element_len) == 0) + /* 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_element); + 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, collid)) + { + *len = substr_len; + pfree(lower_element); + 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, + collid)) + { + *len = substr_len; + pfree(lower_element); + pfree(lower_name); + return a - array; + } + } } pfree(lower_element); } @@ -2722,7 +2831,7 @@ 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); @@ -2887,10 +2996,18 @@ 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); } @@ -2899,7 +3016,14 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/adt/int8.c postgresql-17-17.11/src/backend/utils/adt/int8.c --- postgresql-17-17.10/src/backend/utils/adt/int8.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/int8.c 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/adt/jsonpath_exec.c postgresql-17-17.11/src/backend/utils/adt/jsonpath_exec.c --- postgresql-17-17.10/src/backend/utils/adt/jsonpath_exec.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/jsonpath_exec.c 2026-08-10 20:54:09.000000000 +0000 @@ -1464,15 +1464,11 @@ 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); @@ -1502,18 +1498,11 @@ 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); @@ -1529,7 +1518,6 @@ numstr, jspOperationName(jsp->type))))); num = DatumGetNumeric(numdatum); - pfree(arrtypmod); } jb = &jbv; diff -Nru postgresql-17-17.10/src/backend/utils/adt/levenshtein.c postgresql-17-17.11/src/backend/utils/adt/levenshtein.c --- postgresql-17-17.10/src/backend/utils/adt/levenshtein.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/levenshtein.c 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ { 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 @@ * 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 @@ */ 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 @@ * 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 @@ ++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 @@ * 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 @@ */ if (stop_column < m) { - prev[stop_column] = max_d + 1; + prev[stop_column] = (int64) max_d + 1; ++stop_column; } @@ -251,13 +254,13 @@ */ 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 @@ { 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 @@ * 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 @@ { 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 @@ 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 @@ 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 @@ * 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 @@ /* 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 @@ * 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 -Nru postgresql-17-17.10/src/backend/utils/adt/numeric.c postgresql-17-17.11/src/backend/utils/adt/numeric.c --- postgresql-17-17.10/src/backend/utils/adt/numeric.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/numeric.c 2026-08-10 20:54:09.000000000 +0000 @@ -1318,6 +1318,29 @@ 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) { @@ -1329,28 +1352,11 @@ 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 { @@ -5067,7 +5073,15 @@ 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) @@ -5159,7 +5173,15 @@ 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) @@ -5643,7 +5665,15 @@ 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) @@ -5846,7 +5876,15 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/adt/oracle_compat.c postgresql-17-17.11/src/backend/utils/adt/oracle_compat.c --- postgresql-17-17.10/src/backend/utils/adt/oracle_compat.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/oracle_compat.c 2026-08-10 20:54:09.000000000 +0000 @@ -936,8 +936,10 @@ 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); @@ -960,18 +962,31 @@ result = *data & 0x0F; tbytes = 2; } - else + else if (*data > 0xC0) { - Assert(*data > 0xC0); result = *data & 0x1f; tbytes = 1; } - - Assert(tbytes > 0); + else + ereport(ERROR, + (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), + errmsg("invalid byte sequence for encoding \"%s\"", + GetDatabaseEncodingName()))); + + /* 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 -Nru postgresql-17-17.10/src/backend/utils/adt/pg_locale.c postgresql-17-17.11/src/backend/utils/adt/pg_locale.c --- postgresql-17-17.10/src/backend/utils/adt/pg_locale.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/pg_locale.c 2026-08-10 20:54:09.000000000 +0000 @@ -1361,6 +1361,10 @@ if (result >= 0) return (bool) result; + /* should not happen: CheckMyDatabase() not yet run */ + if (default_locale.provider == '\0') + elog(ERROR, "default locale not initialized"); + if (default_locale.provider == COLLPROVIDER_BUILTIN) { result = true; @@ -1428,6 +1432,10 @@ if (result >= 0) return (bool) result; + /* should not happen: CheckMyDatabase() not yet run */ + if (default_locale.provider == '\0') + elog(ERROR, "default locale not initialized"); + if (default_locale.provider == COLLPROVIDER_BUILTIN) { localeptr = default_locale.info.builtin.locale; @@ -1586,6 +1594,10 @@ if (collid == DEFAULT_COLLATION_OID) { + /* should not happen: CheckMyDatabase() not yet run */ + if (default_locale.provider == '\0') + elog(ERROR, "default locale not initialized"); + if (default_locale.provider == COLLPROVIDER_LIBC) return (pg_locale_t) 0; else diff -Nru postgresql-17-17.10/src/backend/utils/adt/regexp.c postgresql-17-17.11/src/backend/utils/adt/regexp.c --- postgresql-17-17.10/src/backend/utils/adt/regexp.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/regexp.c 2026-08-10 20:54:09.000000000 +0000 @@ -1512,7 +1512,7 @@ /* 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 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/adt/rowtypes.c postgresql-17-17.11/src/backend/utils/adt/rowtypes.c --- postgresql-17-17.10/src/backend/utils/adt/rowtypes.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/rowtypes.c 2026-08-10 20:54:09.000000000 +0000 @@ -2012,7 +2012,7 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/adt/ruleutils.c postgresql-17-17.11/src/backend/utils/adt/ruleutils.c --- postgresql-17-17.10/src/backend/utils/adt/ruleutils.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/ruleutils.c 2026-08-10 20:54:09.000000000 +0000 @@ -481,6 +481,8 @@ 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, @@ -10888,7 +10890,7 @@ 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); @@ -10908,6 +10910,7 @@ Assert(IsA(con, Const) && con->consttype == TEXTOID && !con->constisnull); + /* NB: safe because no allowed words need quoted/escaped */ appendStringInfo(buf, " %s", TextDatumGetCString(con->constvalue)); } @@ -11451,12 +11454,42 @@ 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 */ static void diff -Nru postgresql-17-17.10/src/backend/utils/adt/selfuncs.c postgresql-17-17.11/src/backend/utils/adt/selfuncs.c --- postgresql-17-17.10/src/backend/utils/adt/selfuncs.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/selfuncs.c 2026-08-10 20:54:09.000000000 +0000 @@ -597,7 +597,8 @@ * 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; diff -Nru postgresql-17-17.10/src/backend/utils/adt/timestamp.c postgresql-17-17.11/src/backend/utils/adt/timestamp.c --- postgresql-17-17.10/src/backend/utils/adt/timestamp.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/timestamp.c 2026-08-10 20:54:09.000000000 +0000 @@ -4035,7 +4035,15 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/adt/tsquery_util.c postgresql-17-17.11/src/backend/utils/adt/tsquery_util.c --- postgresql-17-17.10/src/backend/utils/adt/tsquery_util.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/tsquery_util.c 2026-08-10 20:54:09.000000000 +0000 @@ -289,7 +289,7 @@ * 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 @@ 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 @@ { TSQuery out; int len; - int sumlen = 0, + size_t sumlen = 0, nnode = 0; QTN2QTState state; diff -Nru postgresql-17-17.10/src/backend/utils/adt/tsvector.c postgresql-17-17.11/src/backend/utils/adt/tsvector.c --- postgresql-17-17.10/src/backend/utils/adt/tsvector.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/tsvector.c 2026-08-10 20:54:09.000000000 +0000 @@ -217,8 +217,8 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ /* 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 @@ } } + /* + * 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 -Nru postgresql-17-17.10/src/backend/utils/adt/tsvector_op.c postgresql-17-17.11/src/backend/utils/adt/tsvector_op.c --- postgresql-17-17.10/src/backend/utils/adt/tsvector_op.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/tsvector_op.c 2026-08-10 20:54:09.000000000 +0000 @@ -175,6 +175,7 @@ *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 @@ 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 @@ 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 @@ 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 @@ /* * 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 @@ 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 @@ 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 @@ /* 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 @@ 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 @@ * 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 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/adt/varlena.c postgresql-17-17.11/src/backend/utils/adt/varlena.c --- postgresql-17-17.10/src/backend/utils/adt/varlena.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/varlena.c 2026-08-10 20:54:09.000000000 +0000 @@ -3731,7 +3731,7 @@ * 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: @@ -6208,6 +6208,20 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/adt/xml.c postgresql-17-17.11/src/backend/utils/adt/xml.c --- postgresql-17-17.10/src/backend/utils/adt/xml.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/adt/xml.c 2026-08-10 20:54:09.000000000 +0000 @@ -4156,7 +4156,9 @@ { 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 -Nru postgresql-17-17.10/src/backend/utils/cache/catcache.c postgresql-17-17.11/src/backend/utils/cache/catcache.c --- postgresql-17-17.10/src/backend/utils/cache/catcache.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/cache/catcache.c 2026-08-10 20:54:09.000000000 +0000 @@ -1070,7 +1070,7 @@ * * Call CatalogCacheInitializeCache() if not yet done. */ -pg_attribute_always_inline +pg_always_inline static void ConditionalCatalogCacheInitializeCache(CatCache *cache) { diff -Nru postgresql-17-17.10/src/backend/utils/cache/lsyscache.c postgresql-17-17.11/src/backend/utils/cache/lsyscache.c --- postgresql-17-17.10/src/backend/utils/cache/lsyscache.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/cache/lsyscache.c 2026-08-10 20:54:09.000000000 +0000 @@ -405,6 +405,12 @@ * * 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, @@ -505,6 +511,12 @@ * * 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, @@ -588,6 +600,55 @@ } /* + * 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_btree_interpretation * Given an operator's OID, find out which btree opfamilies it belongs to, * and what properties it has within each one. The results are returned @@ -1431,7 +1492,8 @@ * 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) { @@ -1466,10 +1528,11 @@ * 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) @@ -1491,6 +1554,18 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/cache/plancache.c postgresql-17-17.11/src/backend/utils/cache/plancache.c --- postgresql-17-17.10/src/backend/utils/cache/plancache.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/cache/plancache.c 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ -66,6 +69,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" @@ -116,6 +120,7 @@ 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 */ @@ -162,6 +167,9 @@ 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); } /* @@ -2167,6 +2175,56 @@ } } } + +/* + * 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 diff -Nru postgresql-17-17.10/src/backend/utils/cache/relcache.c postgresql-17-17.11/src/backend/utils/cache/relcache.c --- postgresql-17-17.10/src/backend/utils/cache/relcache.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/cache/relcache.c 2026-08-10 20:54:09.000000000 +0000 @@ -963,6 +963,8 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/cache/ts_cache.c postgresql-17-17.11/src/backend/utils/cache/ts_cache.c --- postgresql-17-17.10/src/backend/utils/cache/ts_cache.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/cache/ts_cache.c 2026-08-10 20:54:09.000000000 +0000 @@ -279,37 +279,50 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/cache/typcache.c postgresql-17-17.11/src/backend/utils/cache/typcache.c --- postgresql-17-17.10/src/backend/utils/cache/typcache.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/cache/typcache.c 2026-08-10 20:54:09.000000000 +0000 @@ -694,8 +694,9 @@ 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)) @@ -706,12 +707,8 @@ 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 */ @@ -743,8 +740,8 @@ 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)) @@ -755,12 +752,8 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/fmgr/funcapi.c postgresql-17-17.11/src/backend/utils/fmgr/funcapi.c --- postgresql-17-17.10/src/backend/utils/fmgr/funcapi.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/fmgr/funcapi.c 2026-08-10 20:54:09.000000000 +0000 @@ -1410,7 +1410,7 @@ 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 @@ /* 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 @@ 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 -Nru postgresql-17-17.10/src/backend/utils/init/usercontext.c postgresql-17-17.11/src/backend/utils/init/usercontext.c --- postgresql-17-17.10/src/backend/utils/init/usercontext.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/init/usercontext.c 2026-08-10 20:54:09.000000000 +0000 @@ -70,6 +70,12 @@ * 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 -Nru postgresql-17-17.10/src/backend/utils/misc/guc_tables.c postgresql-17-17.11/src/backend/utils/misc/guc_tables.c --- postgresql-17-17.10/src/backend/utils/misc/guc_tables.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/misc/guc_tables.c 2026-08-10 20:54:09.000000000 +0000 @@ -66,6 +66,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" @@ -4731,6 +4732,18 @@ check_restrict_nonsystem_relation_kind, assign_restrict_nonsystem_relation_kind, 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 + }, + /* End-of-list marker */ { {NULL, 0, 0, NULL, NULL}, NULL, NULL, NULL, NULL, NULL diff -Nru postgresql-17-17.10/src/backend/utils/misc/postgresql.conf.sample postgresql-17-17.11/src/backend/utils/misc/postgresql.conf.sample --- postgresql-17-17.10/src/backend/utils/misc/postgresql.conf.sample 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/misc/postgresql.conf.sample 2026-08-10 20:54:09.000000000 +0000 @@ -241,7 +241,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 @@ -777,6 +777,7 @@ #dynamic_library_path = '$libdir' #gin_fuzzy_search_limit = 0 +#output_plugin_libraries = 'pgoutput, test_decoding' # approved plugins for logical decoding #------------------------------------------------------------------------------ diff -Nru postgresql-17-17.10/src/backend/utils/mmgr/mcxt.c postgresql-17-17.11/src/backend/utils/mmgr/mcxt.c --- postgresql-17-17.10/src/backend/utils/mmgr/mcxt.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/mmgr/mcxt.c 2026-08-10 20:54:09.000000000 +0000 @@ -1478,6 +1478,13 @@ /* 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 -Nru postgresql-17-17.10/src/backend/utils/resowner/resowner.c postgresql-17-17.11/src/backend/utils/resowner/resowner.c --- postgresql-17-17.10/src/backend/utils/resowner/resowner.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/backend/utils/resowner/resowner.c 2026-08-10 20:54:09.000000000 +0000 @@ -342,6 +342,7 @@ { ResourceElem *items; uint32 nitems; + bool using_arr; /* * ResourceOwnerSort must've been called already. All the resources are @@ -353,12 +354,14 @@ { items = owner->arr; nitems = owner->narr; + using_arr = true; } else { Assert(owner->narr == 0); items = owner->hash; nitems = owner->nhash; + using_arr = false; } /* @@ -387,13 +390,20 @@ 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 -Nru postgresql-17-17.10/src/bin/initdb/po/de.po postgresql-17-17.11/src/bin/initdb/po/de.po --- postgresql-17-17.10/src/bin/initdb/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/initdb/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-10-30 10:51+0000\n" +"POT-Creation-Date: 2026-08-04 09:02+0000\n" "PO-Revision-Date: 2024-10-30 16:07+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -82,17 +82,27 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format @@ -241,12 +251,12 @@ msgid "unrecognized sync method: %s" msgstr "unbekannte Sync-Methode: %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" diff -Nru postgresql-17-17.10/src/bin/initdb/po/ja.po postgresql-17-17.11/src/bin/initdb/po/ja.po --- postgresql-17-17.10/src/bin/initdb/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/initdb/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,8 +6,8 @@ msgstr "" "Project-Id-Version: initdb (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-01-10 14:11+0900\n" -"PO-Revision-Date: 2025-01-10 15:02+0900\n" +"POT-Creation-Date: 2026-05-12 14:46+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" @@ -17,22 +17,22 @@ "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:279 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:286 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:297 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:304 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "ヒント: " @@ -57,83 +57,93 @@ msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形式に変換できませんでした: %m" -#: ../../common/exec.c:363 initdb.c:752 +#: ../../common/exec.c:382 initdb.c:750 #, c-format msgid "could not execute command \"%s\": %m" msgstr "コマンド\"%s\"を実行できませんでした: %m" -#: ../../common/exec.c:375 +#: ../../common/exec.c:394 #, c-format msgid "could not read from command \"%s\": %m" msgstr "コマンド\"%s\"から読み取れませんでした: %m" -#: ../../common/exec.c:378 +#: ../../common/exec.c:397 #, c-format msgid "no data was returned by command \"%s\"" msgstr "コマンド\"%s\"がデータを返却しませんでした" -#: ../../common/exec.c:405 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() が失敗しました: %m" -#: ../../common/exec.c:543 ../../common/exec.c:588 ../../common/exec.c:680 -#: initdb.c:374 initdb.c:410 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:372 initdb.c:408 #, c-format 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/file_utils.c:71 ../../common/file_utils.c:348 -#: ../../common/file_utils.c:407 ../../common/file_utils.c:481 +#: ../../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:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンできませんでした: %m" -#: ../../common/file_utils.c:77 +#: ../../common/file_utils.c:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "ファイル\"%s\"に対してファイルシステムを同期できませんでした: %m" -#: ../../common/file_utils.c:121 ../../common/file_utils.c:567 +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" -#: ../../common/file_utils.c:131 ../../common/file_utils.c:228 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 #: ../../fe_utils/option_utils.c:99 #, c-format msgid "this build does not support sync method \"%s\"" msgstr "このビルドでは同期方式\"%s\"をサポートしていません" -#: ../../common/file_utils.c:152 ../../common/file_utils.c:282 +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 #: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: ../../common/file_utils.c:170 ../../common/file_utils.c:316 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 #: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: ../../common/file_utils.c:419 ../../common/file_utils.c:489 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" -#: ../../common/file_utils.c:499 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" @@ -242,12 +252,12 @@ msgid "unrecognized sync method: %s" msgstr "認識できない同期方式: %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 "シェルコマンドの引数に改行(LF)または復帰(CR)が含まれています: \"%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 "データベース名に改行(LF)または復帰(CR)が含まれています: \"%s\"\n" @@ -262,311 +272,306 @@ msgid "could not get junction for \"%s\": %s\n" msgstr "\"%s\"のjunctionを入手できませんでした: %s\n" -#: initdb.c:371 +#: initdb.c:369 #, c-format msgid "_wsetlocale() failed" msgstr "_wsetlocale()が失敗しました" -#: initdb.c:378 +#: initdb.c:376 #, c-format msgid "setlocale() failed" msgstr "setlocale()が失敗しました" -#: initdb.c:392 +#: initdb.c:390 #, c-format msgid "failed to restore old locale" msgstr "古いロケールの復元に失敗しました" -#: initdb.c:395 +#: initdb.c:393 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "古いロケール\"%s\"を復元できませんでした" -#: initdb.c:684 initdb.c:1702 +#: initdb.c:682 initdb.c:1674 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み取り用にオープンできませんでした: %m" -#: initdb.c:728 initdb.c:1032 initdb.c:1052 +#: initdb.c:726 initdb.c:1030 initdb.c:1050 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "ファイル\"%s\"を書き込み用にオープンできませんでした: %m" -#: initdb.c:732 initdb.c:1035 initdb.c:1054 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書き出せませんでした: %m" -#: initdb.c:736 +#: initdb.c:734 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズできませんでした: %m" -#: initdb.c:770 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "データディレクトリ\"%s\"を削除しています" -#: initdb.c:772 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "データディレクトリの削除に失敗しました" -#: initdb.c:776 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "データディレクトリ\"%s\"の内容を削除しています" -#: initdb.c:779 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "データディレクトリの内容の削除に失敗しました" -#: initdb.c:784 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"を削除しています" -#: initdb.c:786 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "WAL ディレクトリの削除に失敗しました" -#: initdb.c:790 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"の中身を削除しています" -#: initdb.c:792 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "WAL ディレクトリの中身の削除に失敗しました" -#: initdb.c:799 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "ユーザーの要求によりデータディレクトリ\"%s\"を削除しませんでした" -#: initdb.c:803 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "ユーザーの要求により WAL ディレクトリ\"%s\"を削除しませんでした" -#: initdb.c:821 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "root では実行できません" -#: initdb.c:822 +#: initdb.c:820 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "サーバープロセスの所有者となる(非特権)ユーザーとして(例えば\"su\"を使用して)ログインしてください。" -#: initdb.c:854 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\"は有効なサーバー符号化方式名ではありません" -#: initdb.c:998 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "ファイル\"%s\"は存在しません" -#: initdb.c:999 initdb.c:1004 initdb.c:1011 +#: initdb.c:997 initdb.c:1002 initdb.c:1009 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "インストール先が破損しているか実行時オプション-Lで間違ったディレクトリを指定した可能性があります。" -#: initdb.c:1003 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" msgstr "ファイル\"%s\"にアクセスできませんでした: %m" -#: initdb.c:1010 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "ファイル\"%s\"は通常のファイルではありません" -#: initdb.c:1155 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "動的共有メモリの実装を選択しています ... " -#: initdb.c:1165 +#: initdb.c:1150 #, c-format msgid "selecting default \"max_connections\" ... " msgstr "デフォルトの\"max_connections\"を選択しています ... " -#: initdb.c:1190 -#, c-format -msgid "selecting default \"autovacuum_worker_slots\" ... %d\n" -msgstr "デフォルトの\"autovacuum_worker_slots\"を選択しています ... %d\n" - -#: initdb.c:1193 +#: initdb.c:1170 #, c-format msgid "selecting default \"shared_buffers\" ... " msgstr "デフォルトの\"shared_buffers\"を選択しています ... " -#: initdb.c:1216 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " msgstr "デフォルトの時間帯を選択しています ... " -#: initdb.c:1296 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "設定ファイルを作成しています ... " -#: initdb.c:1453 initdb.c:1467 initdb.c:1534 initdb.c:1545 +#: initdb.c:1425 initdb.c:1439 initdb.c:1506 initdb.c:1517 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "\"%s\"の権限を変更できませんでした: %m" -#: initdb.c:1564 +#: initdb.c:1536 #, c-format msgid "running bootstrap script ... " msgstr "ブートストラップスクリプトを実行しています ... " -#: initdb.c:1576 +#: initdb.c:1548 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "入力ファイル\"%s\"は PostgreSQL %s のものではありません" -#: initdb.c:1578 +#: initdb.c:1550 #, c-format msgid "Specify the correct path using the option -L." msgstr "-Lオプションを使用して正しいパスを指定してください。" -#: initdb.c:1680 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "新しいスーパーユーザーのパスワードを入力してください:" -#: initdb.c:1681 +#: initdb.c:1653 msgid "Enter it again: " msgstr "再入力してください:" -#: initdb.c:1684 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" msgstr "パスワードが一致しません。\n" -#: initdb.c:1708 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "ファイル\"%s\"からパスワードを読み取ることができませんでした: %m" -#: initdb.c:1711 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "パスワードファイル\"%s\"が空です" -#: initdb.c:2123 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "シグナルが発生しました\n" -#: initdb.c:2129 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "子プロセスへの書き込みができませんでした: %s\n" -#: initdb.c:2137 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2219 initdb.c:2265 +#: initdb.c:2191 initdb.c:2237 #, c-format msgid "locale name \"%s\" contains non-ASCII characters" msgstr "ロケール名\"%s\"は不正な非ASCII文字を含んでいます" -#: initdb.c:2245 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "ロケール名\"%s\"は不正です" -#: initdb.c:2246 +#: initdb.c:2218 #, c-format msgid "If the locale name is specific to ICU, use --icu-locale." msgstr "ロケール名がICU特有のものである場合は、--icu-localeを使用してください。" -#: initdb.c:2259 +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "不正なロケール設定; 環境変数LANGおよびLC_* を確認してください" -#: initdb.c:2290 initdb.c:2314 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "符号化方式が合いません" -#: initdb.c:2291 +#: initdb.c:2263 #, 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:2296 initdb.c:2317 +#: initdb.c:2268 initdb.c:2289 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "%sを再度実行してください、その際にはエンコーディングを明示的に指定しないか、適合する組み合わせを選択してください。" -#: initdb.c:2315 +#: initdb.c:2287 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "指定された符号化方式(%s)はICUプロバイダではサポートされません。" -#: initdb.c:2366 +#: initdb.c:2338 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "ロケール名\"%s\"を、言語タグに変換できませんでした: %s" -#: initdb.c:2372 initdb.c:2424 initdb.c:2516 +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 #, c-format msgid "ICU is not supported in this build" msgstr "このビルドではICUはサポートされていません" -#: initdb.c:2395 +#: initdb.c:2367 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "ロケール\"%s\"から言語を取得できませんでした: %s" -#: initdb.c:2421 +#: initdb.c:2393 #, c-format msgid "locale \"%s\" has unknown language \"%s\"" msgstr "ロケール\"%s\"は未知の言語\"%s\"を含んでいます" -#: initdb.c:2482 +#: initdb.c:2454 #, c-format msgid "locale must be specified if provider is %s" msgstr "ロケールプロバイダが%sの場合はロケールの指定が必須です" -#: initdb.c:2493 +#: initdb.c:2465 #, c-format msgid "invalid locale name \"%s\" for builtin provider" msgstr "ロケール名\"%s\"は組み込みプロバイダでは不正です" -#: initdb.c:2504 +#: initdb.c:2476 #, c-format msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" msgstr "ICUロケール\"%s\"に対して言語タグ\"%s\"を使用します。\n" -#: initdb.c:2527 +#: initdb.c:2499 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" "\n" msgstr "%sはPostgreSQLデータベースクラスタを初期化します。\n" -#: initdb.c:2528 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: initdb.c:2529 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: initdb.c:2530 +#: initdb.c:2502 #, c-format msgid "" "\n" @@ -575,57 +580,57 @@ "\n" "オプション:\n" -#: initdb.c:2531 +#: initdb.c:2503 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHOD ローカル接続のデフォルト認証方式\n" -#: initdb.c:2532 +#: initdb.c:2504 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=METHOD ローカルTCP/IP接続のデフォルト認証方式\n" -#: initdb.c:2533 +#: initdb.c:2505 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METHOD ローカルソケット接続のデフォルト認証方式\n" -#: initdb.c:2534 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATADIR データベースクラスタの場所\n" -#: initdb.c:2535 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING 新規データベースのデフォルト符号化方式\n" -#: initdb.c:2536 +#: initdb.c:2508 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access データディレクトリのグループ読み取り/実行を許可\n" -#: initdb.c:2537 +#: initdb.c:2509 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=LOCALE 新しいデータベースのICUロケールIDを設定\n" -#: initdb.c:2538 +#: initdb.c:2510 #, c-format msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" msgstr " --icu-rules=RULES 新しいデータベースに追加するICU照合順序ルール(群)\n" -#: initdb.c:2539 +#: initdb.c:2511 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums データページのチェックサムを使用\n" -#: initdb.c:2540 +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE 新しいデータベースのデフォルトロケールをセット\n" -#: initdb.c:2541 +#: initdb.c:2513 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -639,12 +644,12 @@ " デフォルトロケールを設定(デフォルト値は環境変数から\n" " 取得)\n" -#: initdb.c:2545 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale --locale=C と同じ\n" -#: initdb.c:2546 +#: initdb.c:2518 #, c-format msgid "" " --builtin-locale=LOCALE\n" @@ -653,7 +658,7 @@ " --builtin-locale=LOCALE\n" " 新しいデータベースの組み込みロケールを指定\n" -#: initdb.c:2548 +#: initdb.c:2520 #, c-format msgid "" " --locale-provider={builtin|libc|icu}\n" @@ -663,19 +668,14 @@ " 新しいデータベースにおけるデフォルトのロケール\n" " プロバイダを設定\n" -#: initdb.c:2550 -#, c-format -msgid " --no-data-checksums do not use data page checksums\n" -msgstr " --no-data-checksums データページのチェックサムを使用しない\n" - -#: initdb.c:2551 +#: initdb.c:2522 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr "" " --pwfile=ファイル名 新しいスーパーユーザーのパスワードをファイルから\n" " 読み込む\n" -#: initdb.c:2552 +#: initdb.c:2523 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -684,27 +684,27 @@ " -T, --text-search-config=CFG\\\n" " デフォルトのテキスト検索設定\n" -#: initdb.c:2554 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME データベースのスーパーユーザーの名前\n" -#: initdb.c:2555 +#: initdb.c:2526 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt 新規スーパーユーザーに対してパスワード入力を促す\n" -#: initdb.c:2556 +#: initdb.c:2527 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR 先行書き込みログ用ディレクトリの位置\n" -#: initdb.c:2557 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE WALセグメントのサイズ、メガバイト単位\n" -#: initdb.c:2558 +#: initdb.c:2529 #, c-format msgid "" "\n" @@ -713,57 +713,57 @@ "\n" "使用頻度の低いオプション:\n" -#: initdb.c:2559 +#: initdb.c:2530 #, c-format msgid " -c, --set NAME=VALUE override default setting for server parameter\n" msgstr " -c, --set NAME=VALUE サーバーパラメータのデフォルト値を上書き設定\n" -#: initdb.c:2560 +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug 多くのデバッグ用の出力を生成\n" -#: initdb.c:2561 +#: initdb.c:2532 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches debug_discard_cachesを1に設定する\n" -#: initdb.c:2562 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY 入力ファイルの場所を指定\n" -#: initdb.c:2563 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean エラー発生後のクリーンアップを行わない\n" -#: initdb.c:2564 +#: initdb.c:2535 #, 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:2565 +#: initdb.c:2536 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions 次の手順の指示を表示しない\n" -#: initdb.c:2566 +#: initdb.c:2537 #, c-format msgid " -s, --show show internal settings, then exit\n" msgstr " -s, --show 内部設定を表示して終了\n" -#: initdb.c:2567 +#: initdb.c:2538 #, c-format msgid " --sync-method=METHOD set method for syncing files to disk\n" msgstr " --sync-method=METHOD ファイルをディスクに同期させる方法を指定\n" -#: initdb.c:2568 +#: initdb.c:2539 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only データベースファイルのsyncのみを実行して終了\n" -#: initdb.c:2569 +#: initdb.c:2540 #, c-format msgid "" "\n" @@ -772,17 +772,17 @@ "\n" "その他のオプション:\n" -#: initdb.c:2570 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: initdb.c:2571 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: initdb.c:2572 +#: initdb.c:2543 #, c-format msgid "" "\n" @@ -792,7 +792,7 @@ "\n" "データディレクトリが指定されない場合、PGDATA環境変数が使用されます。\n" -#: initdb.c:2574 +#: initdb.c:2545 #, c-format msgid "" "\n" @@ -801,72 +801,72 @@ "\n" "バグは<%s>に報告してください。\n" -#: initdb.c:2575 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: initdb.c:2599 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "\"%2$s\"接続では認証方式\"%1$s\"は無効です" -#: initdb.c:2613 +#: initdb.c:2584 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "パスワード認証を有効にするにはスーパーユーザーのパスワードを指定する必要があります" -#: initdb.c:2632 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "データディレクトリが指定されていません" -#: initdb.c:2633 +#: initdb.c:2604 #, 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:2650 +#: initdb.c:2621 #, c-format msgid "could not set environment" msgstr "環境を設定できません" -#: initdb.c:2668 +#: initdb.c:2639 #, 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:2671 +#: initdb.c:2642 #, 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:2686 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "入力ファイルの場所は絶対パスでなければなりません" -#: initdb.c:2703 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "データベースクラスタはロケール\"%s\"で初期化されます。\n" -#: initdb.c:2706 +#: initdb.c:2677 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "データベースクラスタは以下のロケール構成で初期化されます。\n" -#: initdb.c:2707 +#: initdb.c:2678 #, c-format msgid " locale provider: %s\n" msgstr " ロケールプロバイダ:%s\n" -#: initdb.c:2709 +#: initdb.c:2680 #, c-format msgid " default collation: %s\n" msgstr " デフォルト照合順序:%s\n" -#: initdb.c:2710 +#: initdb.c:2681 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -883,22 +883,22 @@ " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2740 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "ロケール\"%s\"に対して適切な符号化方式がありませんでした" -#: initdb.c:2742 +#: initdb.c:2713 #, c-format msgid "Rerun %s with the -E option." msgstr "-Eオプションを付けて%sを再実行してください。" -#: initdb.c:2743 initdb.c:3287 initdb.c:3410 initdb.c:3430 +#: initdb.c:2714 initdb.c:3257 initdb.c:3377 initdb.c:3397 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細は\"%s --help\"を実行してください。" -#: initdb.c:2755 +#: initdb.c:2726 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -908,112 +908,112 @@ "符号化方式として使用できません。\n" "デフォルトのデータベース符号化方式は代わりに\"%s\"に設定されます。\n" -#: initdb.c:2760 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "ロケール\"%s\"は非サポートの符号化方式\"%s\"を必要とします" -#: initdb.c:2762 +#: initdb.c:2733 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "符号化方式\"%s\"はサーバー側の符号化方式として使用できません。" -#: initdb.c:2764 +#: initdb.c:2735 #, c-format msgid "Rerun %s with a different locale selection." msgstr "別のローケルを選択して%sを再実行してください。" -#: initdb.c:2772 +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "デフォルトのデータベース符号化方式はそれに対応して%sに設定されました。\n" -#: initdb.c:2786 +#: initdb.c:2757 #, c-format msgid "builtin provider locale \"%s\" requires encoding \"%s\"" msgstr "組み込みプロバイダロケール\"%s\"は符号化方式\"%s\"を必要とします" -#: initdb.c:2848 +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "ロケール\"%s\"用の適切なテキスト検索設定が見つかりませんでした" -#: initdb.c:2859 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "ロケール\"%s\"に適したテキスト検索設定が不明です" -#: initdb.c:2864 +#: initdb.c:2835 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "指定したテキスト検索設定\"%s\"がロケール\"%s\"に合わない可能性があります" -#: initdb.c:2869 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "デフォルトのテキスト検索構成は %s に設定されます。\n" -#: initdb.c:2912 initdb.c:2983 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "ディレクトリ%sを作成しています ... " -#: initdb.c:2917 initdb.c:2988 initdb.c:3036 initdb.c:3093 +#: initdb.c:2888 initdb.c:2959 initdb.c:3007 initdb.c:3064 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" -#: initdb.c:2926 initdb.c:2998 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "ディレクトリ%sの権限を設定しています ... " -#: initdb.c:2931 initdb.c:3003 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を変更できませんでした: %m" -#: initdb.c:2943 initdb.c:3015 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "ディレクトリ\"%s\"は存在しますが、空ではありません" -#: initdb.c:2947 +#: initdb.c:2918 #, 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:2955 initdb.c:3025 initdb.c:3455 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m" -#: initdb.c:2976 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL ディレクトリの位置は、絶対パスでなければなりません" -#: initdb.c:3019 +#: initdb.c:2990 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "そこにWALを格納したい場合は、ディレクトリ\"%s\"を削除するか空にしてください。" -#: initdb.c:3029 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を作成できませんでした: %m" -#: initdb.c:3048 +#: initdb.c:3019 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "おそらくマウントポイントであることに起因した先頭がドットであるファイル、または不可視なファイルが含まれています。" -#: initdb.c:3050 +#: initdb.c:3021 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "おそらくマウントポイントであることに起因したlost+foundディレクトリが含まれています。" -#: initdb.c:3052 +#: initdb.c:3023 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -1022,65 +1022,65 @@ "マウントポイントであるディレクトリをデータディレクトリとして使用することはお勧めしません。\n" "この下にサブディレクトリを作成してください。" -#: initdb.c:3079 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "サブディレクトリを作成しています ... " -#: initdb.c:3122 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "ブートストラップ後の初期化を実行しています ... " -#: initdb.c:3286 +#: initdb.c:3256 #, c-format msgid "-c %s requires a value" msgstr "-c %sは値が必要です" -#: initdb.c:3311 +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "デバッグモードで実行しています。\n" -#: initdb.c:3315 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "no-clean モードで実行しています。失敗した状況は削除されません。\n" -#: initdb.c:3388 +#: initdb.c:3358 #, c-format msgid "unrecognized locale provider: %s" msgstr "認識できない照合順序プロバイダ: %s" -#: initdb.c:3428 +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" -#: initdb.c:3435 initdb.c:3439 initdb.c:3443 +#: initdb.c:3402 initdb.c:3406 initdb.c:3410 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "ロケールプロバイダ\"%2$s\"が選択されていなければ%1$sは指定できません" -#: initdb.c:3457 initdb.c:3520 +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "データをディスクに同期しています ... " -#: initdb.c:3465 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "パスワードプロンプトとパスワードファイルは同時に指定できません" -#: initdb.c:3476 +#: initdb.c:3443 #, c-format msgid "argument of %s must be a power of two between 1 and 1024" msgstr "%sの引数は1から1024までの間の2の累乗でなければなりません" -#: initdb.c:3489 +#: initdb.c:3456 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "スーパーユーザー名\"%s\"は許可されません; ロール名は\"pg_\"で始めることはできません" -#: initdb.c:3491 +#: initdb.c:3458 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -1091,17 +1091,17 @@ "このユーザーをサーバープロセスの所有者とする必要があります。\n" "\n" -#: initdb.c:3507 +#: initdb.c:3474 #, c-format msgid "Data page checksums are enabled.\n" msgstr "データページのチェックサムは有効です。\n" -#: initdb.c:3509 +#: initdb.c:3476 #, c-format msgid "Data page checksums are disabled.\n" msgstr "データベージのチェックサムは無効です。\n" -#: initdb.c:3526 +#: initdb.c:3493 #, c-format msgid "" "\n" @@ -1112,22 +1112,22 @@ "ディスクへの同期がスキップされました。\n" "オペレーティングシステムがクラッシュした場合データディレクトリは破損されるかもしれません。\n" -#: initdb.c:3531 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "ローカル接続に対して\"trust\"認証を有効にします " -#: initdb.c:3532 +#: initdb.c:3499 #, 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:3562 +#: initdb.c:3529 msgid "logfile" msgstr "ログファイル" -#: initdb.c:3564 +#: initdb.c:3531 #, c-format msgid "" "\n" @@ -1141,3 +1141,9 @@ "\n" " %s\n" "\n" + +#~ msgid " --no-data-checksums do not use data page checksums\n" +#~ msgstr " --no-data-checksums データページのチェックサムを使用しない\n" + +#~ msgid "selecting default \"autovacuum_worker_slots\" ... %d\n" +#~ msgstr "デフォルトの\"autovacuum_worker_slots\"を選択しています ... %d\n" diff -Nru postgresql-17-17.10/src/bin/initdb/po/ru.po postgresql-17-17.11/src/bin/initdb/po/ru.po --- postgresql-17-17.10/src/bin/initdb/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/initdb/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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-05-03 16:06+0300\n" -"PO-Revision-Date: 2024-11-02 08:27+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format diff -Nru postgresql-17-17.10/src/bin/pg_amcheck/po/de.po postgresql-17-17.11/src/bin/pg_amcheck/po/de.po --- postgresql-17-17.10/src/bin/pg_amcheck/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_amcheck/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,7 +6,7 @@ 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-07 09:32+0000\n" "PO-Revision-Date: 2024-08-28 07:51+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -35,17 +35,27 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format @@ -167,12 +177,12 @@ 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" diff -Nru postgresql-17-17.10/src/bin/pg_amcheck/po/ru.po postgresql-17-17.11/src/bin/pg_amcheck/po/ru.po --- postgresql-17-17.10/src/bin/pg_amcheck/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_amcheck/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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-05-03 16:06+0300\n" -"PO-Revision-Date: 2024-09-05 08:23+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format diff -Nru postgresql-17-17.10/src/bin/pg_archivecleanup/po/de.po postgresql-17-17.11/src/bin/pg_archivecleanup/po/de.po --- postgresql-17-17.10/src/bin/pg_archivecleanup/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_archivecleanup/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: pg_archivecleanup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-06-16 07:53+0000\n" +"POT-Creation-Date: 2026-08-07 09:33+0000\n" "PO-Revision-Date: 2024-04-04 11:48+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -36,17 +36,27 @@ 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:68 #, c-format msgid "archive location \"%s\" does not exist" diff -Nru postgresql-17-17.10/src/bin/pg_archivecleanup/po/ru.po postgresql-17-17.11/src/bin/pg_archivecleanup/po/ru.po --- postgresql-17-17.10/src/bin/pg_archivecleanup/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_archivecleanup/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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: 2024-09-02 09:29+0300\n" -"PO-Revision-Date: 2024-09-07 06:17+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:68 #, c-format msgid "archive location \"%s\" does not exist" diff -Nru postgresql-17-17.10/src/bin/pg_basebackup/pg_createsubscriber.c postgresql-17-17.11/src/bin/pg_basebackup/pg_createsubscriber.c --- postgresql-17-17.10/src/bin/pg_basebackup/pg_createsubscriber.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_basebackup/pg_createsubscriber.c 2026-08-10 20:54:09.000000000 +0000 @@ -1402,7 +1402,6 @@ { 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); @@ -1665,7 +1664,6 @@ { pg_log_error("could not drop publication \"%s\" in database \"%s\": %s", dbinfo->pubname, dbinfo->dbname, PQresultErrorMessage(res)); - dbinfo->made_publication = false; /* don't try again. */ /* * Don't disconnect and exit here. This routine is used by primary diff -Nru postgresql-17-17.10/src/bin/pg_basebackup/pg_recvlogical.c postgresql-17-17.11/src/bin/pg_basebackup/pg_recvlogical.c --- postgresql-17-17.10/src/bin/pg_basebackup/pg_recvlogical.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_basebackup/pg_recvlogical.c 2026-08-10 20:54:09.000000000 +0000 @@ -242,8 +242,9 @@ /* 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) @@ -256,11 +257,14 @@ 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) @@ -340,7 +344,7 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_basebackup/po/de.po postgresql-17-17.11/src/bin/pg_basebackup/po/de.po --- postgresql-17-17.10/src/bin/pg_basebackup/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_basebackup/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-11-07 06:37+0000\n" +"POT-Creation-Date: 2026-08-07 09:30+0000\n" "PO-Revision-Date: 2024-08-25 16:44+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -40,8 +40,8 @@ #: ../../common/compression.c:132 ../../common/compression.c:141 #: ../../common/compression.c:150 bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 -#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 bbstreamer_zstd.c:129 -#: bbstreamer_zstd.c:284 +#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 bbstreamer_zstd.c:126 +#: bbstreamer_zstd.c:281 #, c-format msgid "this build does not support compression with %s" msgstr "diese Installation unterstützt keine Komprimierung mit %s" @@ -107,7 +107,7 @@ msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 -#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#: bbstreamer_file.c:138 bbstreamer_file.c:279 pg_recvlogical.c:654 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" @@ -149,24 +149,34 @@ 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:76 #, 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 -#: pg_receivewal.c:319 pg_recvlogical.c:352 +#: pg_receivewal.c:319 pg_recvlogical.c:356 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" @@ -247,12 +257,12 @@ msgstr "Speicher aufgebraucht" #: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 -#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 +#: bbstreamer_file.c:270 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "konnte nicht in Datei »%s« schreiben: %m" -#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:375 #: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" @@ -268,28 +278,38 @@ msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" -#: bbstreamer_file.c:275 +#: bbstreamer_file.c:219 bbstreamer_tar.c:295 +#, c-format +msgid "tar member has unsafe path name: \"%s\"" +msgstr "Tar-Mitglied hat unsicheren Pfadnamen: »%s«" + +#: bbstreamer_file.c:244 +#, c-format +msgid "link target has unsafe path name: \"%s\"" +msgstr "Verknüpfungsziel hat unsicheren Pfadnamen: »%s«" + +#: bbstreamer_file.c:289 #, c-format msgid "unexpected state while extracting archive" msgstr "unerwarteter Zustand beim Extrahieren des Archivs" -#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: bbstreamer_file.c:335 pg_basebackup.c:698 pg_basebackup.c:712 #: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: bbstreamer_file.c:326 +#: bbstreamer_file.c:340 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m" -#: bbstreamer_file.c:345 +#: bbstreamer_file.c:359 #, 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" -#: bbstreamer_file.c:365 +#: bbstreamer_file.c:379 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "konnte Zugriffsrechte von Datei »%s« nicht setzen: %m" @@ -329,7 +349,7 @@ msgid "could not initialize compression library" msgstr "konnte Komprimierungsbibliothek nicht initialisieren" -#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329 +#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:326 #, c-format msgid "could not decompress data: %s" msgstr "konnte Daten nicht dekomprimieren: %s" @@ -349,7 +369,7 @@ msgid "could not write lz4 header: %s" msgstr "konnte lz4-Header nicht schreiben: %s" -#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223 +#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:178 bbstreamer_zstd.c:220 #, c-format msgid "could not compress data: %s" msgstr "konnte Daten nicht komprimieren: %s" @@ -364,22 +384,22 @@ msgid "could not initialize compression library: %s" msgstr "konnte Komprimierungsbibliothek nicht initialisieren: %s" -#: bbstreamer_tar.c:244 +#: bbstreamer_tar.c:245 #, c-format msgid "tar file trailer exceeds 2 blocks" msgstr "Tar-Datei-Trailer überschreitet 2 Blöcke" -#: bbstreamer_tar.c:249 +#: bbstreamer_tar.c:250 #, c-format msgid "unexpected state while parsing tar archive" msgstr "unerwarteter Zustand beim Parsen des Tar-Archivs" -#: bbstreamer_tar.c:292 +#: bbstreamer_tar.c:293 #, c-format msgid "tar member has empty name" msgstr "Tar-Mitglied hat leeren Namen" -#: bbstreamer_tar.c:326 +#: bbstreamer_tar.c:330 #, c-format msgid "COPY stream ended before last file was finished" msgstr "COPY-Strom endete vor dem Ende der letzten Datei" @@ -399,12 +419,12 @@ msgid "could not set compression worker count to %d: %s" msgstr "konnte Komprimierungs-Worker-Anzahl nicht auf %d setzen: %s" -#: bbstreamer_zstd.c:116 +#: bbstreamer_zstd.c:115 #, c-format msgid "could not enable long-distance mode: %s" msgstr "konnte Long-Distance-Modus nicht einschalten: %s" -#: bbstreamer_zstd.c:275 +#: bbstreamer_zstd.c:272 #, c-format msgid "could not create zstd decompression context" msgstr "konnte zstd-Dekomprimierungskontext nicht erzeugen" @@ -896,8 +916,8 @@ msgid "could not get COPY data stream: %s" msgstr "konnte COPY-Datenstrom nicht empfangen: %s" -#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 -#: receivelog.c:973 +#: pg_basebackup.c:1039 pg_recvlogical.c:453 pg_recvlogical.c:629 +#: receivelog.c:979 #, c-format msgid "could not read COPY data: %s" msgstr "konnte COPY-Daten nicht lesen: %s" @@ -982,9 +1002,9 @@ msgid "server does not support incremental backup" msgstr "Server unterstützt kein inkrementelles Backup" -#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 -#: receivelog.c:543 receivelog.c:582 streamutil.c:367 streamutil.c:441 -#: streamutil.c:493 streamutil.c:581 streamutil.c:733 streamutil.c:778 +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:276 +#: receivelog.c:542 receivelog.c:588 streamutil.c:367 streamutil.c:441 +#: streamutil.c:493 streamutil.c:582 streamutil.c:738 streamutil.c:783 #, c-format msgid "could not send replication command \"%s\": %s" msgstr "konnte Replikationsbefehl »%s« nicht senden: %s" @@ -1180,20 +1200,20 @@ #: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 #: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 #: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 -#: pg_basebackup.c:2803 pg_createsubscriber.c:2047 pg_createsubscriber.c:2057 -#: pg_createsubscriber.c:2065 pg_createsubscriber.c:2093 -#: pg_createsubscriber.c:2125 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2050 pg_createsubscriber.c:2060 +#: pg_createsubscriber.c:2068 pg_createsubscriber.c:2096 +#: pg_createsubscriber.c:2128 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:853 pg_recvlogical.c:865 -#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 -#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 -#: pg_recvlogical.c:917 pg_recvlogical.c:924 +#: pg_receivewal.c:793 pg_recvlogical.c:857 pg_recvlogical.c:869 +#: pg_recvlogical.c:879 pg_recvlogical.c:886 pg_recvlogical.c:893 +#: pg_recvlogical.c:900 pg_recvlogical.c:907 pg_recvlogical.c:914 +#: pg_recvlogical.c:921 pg_recvlogical.c:928 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_basebackup.c:2584 pg_createsubscriber.c:2055 pg_receivewal.c:758 -#: pg_recvlogical.c:863 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2058 pg_receivewal.c:758 +#: pg_recvlogical.c:867 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" @@ -1310,7 +1330,7 @@ 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:206 pg_createsubscriber.c:1270 +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1275 #, 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." @@ -1609,332 +1629,332 @@ msgid "subscriber requires %d worker processes, but only %d remain" msgstr "Subskriptionsserver benötigt %d Arbeitsprozesse, aber nur %d verbleiben" -#: pg_createsubscriber.c:1079 +#: pg_createsubscriber.c:1084 #, c-format msgid "dropping subscription \"%s\" in database \"%s\"" msgstr "lösche Subskription »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1088 +#: pg_createsubscriber.c:1093 #, c-format msgid "could not drop subscription \"%s\": %s" msgstr "konnte Subskription »%s« nicht löschen: %s" -#: pg_createsubscriber.c:1123 +#: pg_createsubscriber.c:1128 #, c-format msgid "could not obtain pre-existing subscriptions: %s" msgstr "konnte bereits existierende Subskriptionen nicht ermitteln: %s" -#: pg_createsubscriber.c:1268 +#: pg_createsubscriber.c:1273 #, 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:1302 +#: pg_createsubscriber.c:1307 #, c-format msgid "could not obtain failover replication slot information: %s" msgstr "konnte Failover-Replikations-Slot-Informationen nicht ermitteln: %s" -#: pg_createsubscriber.c:1304 pg_createsubscriber.c:1313 +#: pg_createsubscriber.c:1309 pg_createsubscriber.c:1318 #, 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:1312 +#: pg_createsubscriber.c:1317 #, c-format msgid "could not drop failover replication slot" msgstr "konnte Failover-Replikations-Slot nicht löschen" -#: pg_createsubscriber.c:1334 +#: pg_createsubscriber.c:1339 #, c-format msgid "creating the replication slot \"%s\" in database \"%s\"" msgstr "erzeuge Replikations-Slot »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1352 +#: pg_createsubscriber.c:1357 #, 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:1382 +#: pg_createsubscriber.c:1387 #, c-format msgid "dropping the replication slot \"%s\" in database \"%s\"" msgstr "lösche Replikations-Slot »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1398 +#: pg_createsubscriber.c:1403 #, 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:1419 +#: pg_createsubscriber.c:1423 #, c-format msgid "pg_ctl failed with exit code %d" msgstr "pg_ctl ist fehlgeschlagen mit Statuscode %d" -#: pg_createsubscriber.c:1424 +#: pg_createsubscriber.c:1428 #, c-format msgid "pg_ctl was terminated by exception 0x%X" msgstr "pg_ctl wurde durch Ausnahme 0x%X beendet" -#: pg_createsubscriber.c:1426 +#: pg_createsubscriber.c:1430 #, 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:1428 +#: pg_createsubscriber.c:1432 #, c-format msgid "pg_ctl was terminated by signal %d: %s" msgstr "pg_ctl wurde durch Signal %d beendet: %s" -#: pg_createsubscriber.c:1434 +#: pg_createsubscriber.c:1438 #, c-format msgid "pg_ctl exited with unrecognized status %d" msgstr "pg_ctl hat mit unbekanntem Status %d beendet" -#: pg_createsubscriber.c:1437 +#: pg_createsubscriber.c:1441 #, c-format msgid "The failed command was: %s" msgstr "Der fehlgeschlagene Befehl war: %s" -#: pg_createsubscriber.c:1483 +#: pg_createsubscriber.c:1487 #, c-format msgid "server was started" msgstr "Server wurde gestartet" -#: pg_createsubscriber.c:1498 +#: pg_createsubscriber.c:1502 #, c-format msgid "server was stopped" msgstr "Server wurde angehalten" -#: pg_createsubscriber.c:1517 +#: pg_createsubscriber.c:1521 #, 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:1540 +#: pg_createsubscriber.c:1544 #, c-format msgid "recovery timed out" msgstr "Zeitüberschreitung bei der Wiederherstellung" -#: pg_createsubscriber.c:1553 +#: pg_createsubscriber.c:1557 #, c-format msgid "server did not end recovery" msgstr "Server hat Recovery-Zustand nicht beendet" -#: pg_createsubscriber.c:1555 +#: pg_createsubscriber.c:1559 #, c-format msgid "target server reached the consistent state" msgstr "Zielserver hat einen konsistenten Zustand erreicht" -#: pg_createsubscriber.c:1556 +#: pg_createsubscriber.c:1560 #, 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:1583 +#: pg_createsubscriber.c:1587 #, c-format msgid "could not obtain publication information: %s" msgstr "konnte Publikationsinformationen nicht ermitteln: %s" -#: pg_createsubscriber.c:1597 +#: pg_createsubscriber.c:1601 #, c-format msgid "publication \"%s\" already exists" msgstr "Publikation »%s« existiert bereits" -#: pg_createsubscriber.c:1598 +#: pg_createsubscriber.c:1602 #, c-format msgid "Consider renaming this publication before continuing." msgstr "Nennen Sie diese Publikation eventuell um bevor Sie fortsetzen." -#: pg_createsubscriber.c:1605 +#: pg_createsubscriber.c:1609 #, c-format msgid "creating publication \"%s\" in database \"%s\"" msgstr "erzeuge Publikation »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1618 +#: pg_createsubscriber.c:1622 #, 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:1647 +#: pg_createsubscriber.c:1651 #, c-format msgid "dropping publication \"%s\" in database \"%s\"" msgstr "lösche Publikation »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1661 +#: pg_createsubscriber.c:1665 #, 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:1707 +#: pg_createsubscriber.c:1710 #, c-format msgid "creating subscription \"%s\" in database \"%s\"" msgstr "erzeuge Subskription »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1728 +#: pg_createsubscriber.c:1731 #, 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:1773 +#: pg_createsubscriber.c:1776 #, c-format msgid "could not obtain subscription OID: %s" msgstr "konnte Subskriptions-OID nicht ermitteln: %s" -#: pg_createsubscriber.c:1780 +#: pg_createsubscriber.c:1783 #, 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:1804 +#: pg_createsubscriber.c:1807 #, 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:1819 +#: pg_createsubscriber.c:1822 #, 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:1850 +#: pg_createsubscriber.c:1853 #, c-format msgid "enabling subscription \"%s\" in database \"%s\"" msgstr "aktiviere Subskription »%s« in Datenbank »%s«" -#: pg_createsubscriber.c:1862 +#: pg_createsubscriber.c:1865 #, c-format msgid "could not enable subscription \"%s\": %s" msgstr "konnte Subskription »%s« nicht aktivieren: %s" -#: pg_createsubscriber.c:1954 +#: pg_createsubscriber.c:1957 #, c-format msgid "cannot be executed by \"root\"" msgstr "kann nicht von »root« ausgeführt werden" -#: pg_createsubscriber.c:1955 +#: pg_createsubscriber.c:1958 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen." -#: pg_createsubscriber.c:1976 +#: pg_createsubscriber.c:1979 #, c-format msgid "database \"%s\" specified more than once" msgstr "Datenbank »%s« mehrmals angegeben" -#: pg_createsubscriber.c:2017 +#: pg_createsubscriber.c:2020 #, c-format msgid "publication \"%s\" specified more than once" msgstr "Publikation »%s« mehrmals angegeben" -#: pg_createsubscriber.c:2029 +#: pg_createsubscriber.c:2032 #, c-format msgid "replication slot \"%s\" specified more than once" msgstr "Replikations-Slot »%s« mehrmals angegeben" -#: pg_createsubscriber.c:2041 +#: pg_createsubscriber.c:2044 #, c-format msgid "subscription \"%s\" specified more than once" msgstr "Subskription »%s« mehrmals angegeben" -#: pg_createsubscriber.c:2064 +#: pg_createsubscriber.c:2067 #, c-format msgid "no subscriber data directory specified" msgstr "kein Datenverzeichnis für Subskriptionsserver angegeben" -#: pg_createsubscriber.c:2075 +#: pg_createsubscriber.c:2078 #, c-format msgid "could not determine current directory" msgstr "konnte aktuelles Verzeichnis nicht ermitteln" -#: pg_createsubscriber.c:2092 +#: pg_createsubscriber.c:2095 #, c-format msgid "no publisher connection string specified" msgstr "keine Verbindungsparameter für Publikationsserver angegeben" -#: pg_createsubscriber.c:2096 +#: pg_createsubscriber.c:2099 #, c-format msgid "validating publisher connection string" msgstr "validiere Verbindungsparameter für Publikationsserver" -#: pg_createsubscriber.c:2102 +#: pg_createsubscriber.c:2105 #, c-format msgid "validating subscriber connection string" msgstr "validiere Verbindungsparameter für Subskriptionsserver" -#: pg_createsubscriber.c:2107 +#: pg_createsubscriber.c:2110 #, c-format msgid "no database was specified" msgstr "keine Datenbank wurde angegeben" -#: pg_createsubscriber.c:2119 +#: pg_createsubscriber.c:2122 #, 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:2124 +#: pg_createsubscriber.c:2127 #, c-format msgid "no database name specified" msgstr "kein Datenbankname angegeben" -#: pg_createsubscriber.c:2134 +#: pg_createsubscriber.c:2137 #, c-format msgid "wrong number of publication names specified" msgstr "falsche Anzahl Publikationsnamen angegeben" -#: pg_createsubscriber.c:2135 +#: pg_createsubscriber.c:2138 #, 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:2141 +#: pg_createsubscriber.c:2144 #, c-format msgid "wrong number of subscription names specified" msgstr "falsche Anzahl Subskriptionsnamen angegeben" -#: pg_createsubscriber.c:2142 +#: pg_createsubscriber.c:2145 #, 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:2148 +#: pg_createsubscriber.c:2151 #, c-format msgid "wrong number of replication slot names specified" msgstr "falsche Anzahl Replikations-Slot-Namen angegeben" -#: pg_createsubscriber.c:2149 +#: pg_createsubscriber.c:2152 #, 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:2178 +#: pg_createsubscriber.c:2181 #, 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:2191 +#: pg_createsubscriber.c:2194 #, c-format msgid "standby server is running" msgstr "Standby-Server läuft" -#: pg_createsubscriber.c:2192 +#: pg_createsubscriber.c:2195 #, c-format msgid "Stop the standby server and try again." msgstr "Halten Sie den Standby-Server an und versuchen Sie erneut." -#: pg_createsubscriber.c:2201 +#: pg_createsubscriber.c:2204 #, c-format msgid "starting the standby server with command-line options" msgstr "starte den Standby-Server mit Kommandozeilenoptionen" -#: pg_createsubscriber.c:2217 pg_createsubscriber.c:2252 +#: pg_createsubscriber.c:2220 pg_createsubscriber.c:2255 #, c-format msgid "stopping the subscriber" msgstr "stoppe den Subskriptionsserver" -#: pg_createsubscriber.c:2231 +#: pg_createsubscriber.c:2234 #, c-format msgid "starting the subscriber" msgstr "starte den Subskriptionsserver" -#: pg_createsubscriber.c:2260 +#: pg_createsubscriber.c:2263 #, c-format msgid "Done!" msgstr "Fertig!" @@ -2032,7 +2052,7 @@ msgid "switched to timeline %u at %X/%X" msgstr "auf Zeitleiste %u umgeschaltet bei %X/%X" -#: pg_receivewal.c:224 pg_recvlogical.c:1053 +#: pg_receivewal.c:224 pg_recvlogical.c:1057 #, c-format msgid "received interrupt signal, exiting" msgstr "Interrupt-Signal erhalten, beende" @@ -2102,7 +2122,7 @@ 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:801 +#: pg_receivewal.c:693 pg_recvlogical.c:805 #, c-format msgid "could not parse end position \"%s\"" msgstr "konnte Endposition »%s« nicht parsen" @@ -2132,23 +2152,23 @@ 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:972 +#: pg_receivewal.c:878 pg_recvlogical.c:976 #, c-format msgid "dropping replication slot \"%s\"" msgstr "lösche Replikations-Slot »%s«" -#: pg_receivewal.c:889 pg_recvlogical.c:982 +#: pg_receivewal.c:889 pg_recvlogical.c:986 #, c-format msgid "creating replication slot \"%s\"" msgstr "erzeuge Replikations-Slot »%s«" -#: pg_receivewal.c:918 pg_recvlogical.c:1006 +#: pg_receivewal.c:918 pg_recvlogical.c:1010 #, c-format msgid "disconnected" msgstr "Verbindung beendet" #. translator: check source for value for %d -#: pg_receivewal.c:922 pg_recvlogical.c:1010 +#: pg_receivewal.c:922 pg_recvlogical.c:1014 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "Verbindung beendet; erneuter Versuch in %d Sekunden" @@ -2243,108 +2263,108 @@ msgid "starting log streaming at %X/%X (slot %s)" msgstr "starte Log-Streaming bei %X/%X (Slot %s)" -#: pg_recvlogical.c:281 +#: pg_recvlogical.c:285 #, c-format msgid "streaming initiated" msgstr "Streaming eingeleitet" -#: pg_recvlogical.c:346 +#: pg_recvlogical.c:350 #, c-format msgid "could not open log file \"%s\": %m" msgstr "konnte Logdatei »%s« nicht öffnen: %m" -#: pg_recvlogical.c:375 receivelog.c:882 +#: pg_recvlogical.c:379 receivelog.c:888 #, c-format msgid "invalid socket: %s" msgstr "ungültiges Socket: %s" -#: pg_recvlogical.c:428 receivelog.c:910 +#: pg_recvlogical.c:432 receivelog.c:916 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: pg_recvlogical.c:435 receivelog.c:959 +#: pg_recvlogical.c:439 receivelog.c:965 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "konnte keine Daten vom WAL-Stream empfangen: %s" -#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 -#: receivelog.c:1066 +#: pg_recvlogical.c:481 pg_recvlogical.c:532 receivelog.c:1009 +#: receivelog.c:1072 #, c-format msgid "streaming header too small: %d" msgstr "Streaming-Header zu klein: %d" -#: pg_recvlogical.c:512 receivelog.c:843 +#: pg_recvlogical.c:516 receivelog.c:849 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "unbekannter Streaming-Header: »%c«" -#: pg_recvlogical.c:566 pg_recvlogical.c:578 +#: pg_recvlogical.c:570 pg_recvlogical.c:582 #, 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:636 receivelog.c:642 receivelog.c:679 +#: pg_recvlogical.c:640 receivelog.c:648 receivelog.c:685 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "unerwarteter Abbruch des Replikations-Streams: %s" -#: pg_recvlogical.c:796 +#: pg_recvlogical.c:800 #, c-format msgid "could not parse start position \"%s\"" msgstr "konnte Startposition »%s« nicht parsen" -#: pg_recvlogical.c:874 +#: pg_recvlogical.c:878 #, c-format msgid "no slot specified" msgstr "kein Slot angegeben" -#: pg_recvlogical.c:881 +#: pg_recvlogical.c:885 #, c-format msgid "no target file specified" msgstr "keine Zieldatei angegeben" -#: pg_recvlogical.c:888 +#: pg_recvlogical.c:892 #, c-format msgid "no database specified" msgstr "keine Datenbank angegeben" -#: pg_recvlogical.c:895 +#: pg_recvlogical.c:899 #, c-format msgid "at least one action needs to be specified" msgstr "mindestens eine Aktion muss angegeben werden" -#: pg_recvlogical.c:902 +#: pg_recvlogical.c:906 #, 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:909 +#: pg_recvlogical.c:913 #, 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:916 +#: pg_recvlogical.c:920 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos kann nur zusammen mit --start angegeben werden" -#: pg_recvlogical.c:923 +#: pg_recvlogical.c:927 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phase kann nur zusammen mit --create-slot angegeben werden" -#: pg_recvlogical.c:956 +#: pg_recvlogical.c:960 #, c-format msgid "could not establish database-specific replication connection" msgstr "konnte keine datenbankspezifische Replikationsverbindung herstellen" -#: pg_recvlogical.c:1056 +#: pg_recvlogical.c:1060 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "Endposition %X/%X durch Keepalive erreicht" -#: pg_recvlogical.c:1061 +#: pg_recvlogical.c:1065 #, 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" @@ -2391,7 +2411,7 @@ msgid "not renaming \"%s\", segment is not complete" msgstr "»%s« wird nicht umbenannt, Segment ist noch nicht vollständig" -#: receivelog.c:227 receivelog.c:317 receivelog.c:688 +#: receivelog.c:227 receivelog.c:317 receivelog.c:694 #, c-format msgid "could not close file \"%s\": %s" msgstr "konnte Datei »%s« nicht schließen: %s" @@ -2421,67 +2441,67 @@ 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:508 +#: receivelog.c:505 #, 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:516 +#: receivelog.c:513 #, c-format msgid "starting timeline %u is not present in the server" msgstr "Startzeitleiste %u ist auf dem Server nicht vorhanden" -#: receivelog.c:555 +#: receivelog.c:554 #, 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:626 +#: receivelog.c:632 #, 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:632 +#: receivelog.c:638 #, 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:672 +#: receivelog.c:678 #, c-format msgid "replication stream was terminated before stop point" msgstr "Replikationsstrom wurde vor Stopppunkt abgebrochen" -#: receivelog.c:718 +#: receivelog.c:724 #, 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:727 +#: receivelog.c:733 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "konnte Startpunkt der nächsten Zeitleiste (»%s«) nicht interpretieren" -#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 +#: receivelog.c:781 receivelog.c:1028 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "konnte Datei »%s« nicht fsyncen: %s" -#: receivelog.c:1083 +#: receivelog.c:1089 #, 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:1093 +#: receivelog.c:1099 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "WAL-Daten-Offset %08x erhalten, %08x erwartet" -#: receivelog.c:1128 +#: receivelog.c:1134 #, 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:1153 receivelog.c:1193 receivelog.c:1222 +#: receivelog.c:1159 receivelog.c:1199 receivelog.c:1228 #, c-format msgid "could not send copy-end packet: %s" msgstr "konnte COPY-Ende-Paket nicht senden: %s" @@ -2547,32 +2567,32 @@ 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:590 +#: streamutil.c:591 #, 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:602 +#: streamutil.c:603 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "Replikations-Slot »%s« existiert nicht" -#: streamutil.c:613 +#: streamutil.c:614 #, 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:627 +#: streamutil.c:628 #, 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:744 +#: streamutil.c:749 #, 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:788 +#: streamutil.c:793 #, 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 -Nru postgresql-17-17.10/src/bin/pg_basebackup/po/ja.po postgresql-17-17.11/src/bin/pg_basebackup/po/ja.po --- postgresql-17-17.10/src/bin/pg_basebackup/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_basebackup/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: pg_basebackup (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-11-07 10:21+0900\n" -"PO-Revision-Date: 2025-11-07 10:56+0900\n" +"POT-Creation-Date: 2026-05-12 14:47+0900\n" +"PO-Revision-Date: 2026-05-14 16:27+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -44,8 +44,8 @@ #: ../../common/compression.c:132 ../../common/compression.c:141 #: ../../common/compression.c:150 bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 -#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 bbstreamer_zstd.c:129 -#: bbstreamer_zstd.c:284 +#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 bbstreamer_zstd.c:126 +#: bbstreamer_zstd.c:281 #, c-format msgid "this build does not support compression with %s" msgstr "このビルドでは%sによる圧縮をサポートしていません" @@ -111,7 +111,7 @@ msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 -#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#: bbstreamer_file.c:138 bbstreamer_file.c:279 pg_recvlogical.c:650 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズできませんでした: %m" @@ -152,17 +152,27 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -250,12 +260,12 @@ msgstr "メモリ不足です" #: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 -#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 +#: bbstreamer_file.c:270 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ファイル\"%s\"を書き込めませんでした: %m" -#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:375 #: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" @@ -271,28 +281,38 @@ msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "データベース名に改行(LF)または復帰(CR)が含まれています: \"%s\"\n" -#: bbstreamer_file.c:275 +#: bbstreamer_file.c:219 bbstreamer_tar.c:295 +#, c-format +msgid "tar member has unsafe path name: \"%s\"" +msgstr "tarメンバーのパス名が安全ではありません: \"%s\"" + +#: bbstreamer_file.c:244 +#, c-format +msgid "link target has unsafe path name: \"%s\"" +msgstr "リンク先のパス名が安全ではありません: \"%s\"" + +#: bbstreamer_file.c:289 #, c-format msgid "unexpected state while extracting archive" msgstr "アーカイブの抽出中に想定外の状態" -#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: bbstreamer_file.c:335 pg_basebackup.c:698 pg_basebackup.c:712 #: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" -#: bbstreamer_file.c:326 +#: bbstreamer_file.c:340 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "ディレクトリ\"%s\"に権限を設定できませんでした: %m" -#: bbstreamer_file.c:345 +#: bbstreamer_file.c:359 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "\"%s\"から\"%s\"へのシンボリックリンクを作成できませんでした: %m" -#: bbstreamer_file.c:365 +#: bbstreamer_file.c:379 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "ファイル\"%s\"の権限を設定できませんでした: %m" @@ -332,7 +352,7 @@ msgid "could not initialize compression library" msgstr "圧縮ライブラリを初期化できませんでした" -#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329 +#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:326 #, c-format msgid "could not decompress data: %s" msgstr "データを伸張できませんでした: %s" @@ -352,7 +372,7 @@ msgid "could not write lz4 header: %s" msgstr "lz4ヘッダを出力できませんでした: %s" -#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223 +#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:178 bbstreamer_zstd.c:220 #, c-format msgid "could not compress data: %s" msgstr "データを圧縮できませんでした: %s" @@ -367,22 +387,22 @@ msgid "could not initialize compression library: %s" msgstr "圧縮ライブラリを初期化できませんでした: %s" -#: bbstreamer_tar.c:244 +#: bbstreamer_tar.c:245 #, c-format msgid "tar file trailer exceeds 2 blocks" msgstr "tarファイル後続ブロックが2ブロックを超えています" -#: bbstreamer_tar.c:249 +#: bbstreamer_tar.c:250 #, c-format msgid "unexpected state while parsing tar archive" msgstr "tarアーカイブのパース中に想定外の状態" -#: bbstreamer_tar.c:292 +#: bbstreamer_tar.c:293 #, c-format msgid "tar member has empty name" msgstr "tarメンバーの名前が空です" -#: bbstreamer_tar.c:326 +#: bbstreamer_tar.c:330 #, c-format msgid "COPY stream ended before last file was finished" msgstr "最後のファイルが終わる前にCOPYストリームが終了しました" @@ -402,12 +422,12 @@ msgid "could not set compression worker count to %d: %s" msgstr "圧縮ワーカー数を%dに設定できませんでした: %s" -#: bbstreamer_zstd.c:116 +#: bbstreamer_zstd.c:115 #, c-format msgid "could not enable long-distance mode: %s" msgstr "長距離モードを有効化できませんでした: %s" -#: bbstreamer_zstd.c:275 +#: bbstreamer_zstd.c:272 #, c-format msgid "could not create zstd decompression context" msgstr "zstd伸張コンテクストを生成できませんでした" @@ -1177,9 +1197,9 @@ #: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 #: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 #: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 -#: pg_basebackup.c:2803 pg_createsubscriber.c:2047 pg_createsubscriber.c:2057 -#: pg_createsubscriber.c:2065 pg_createsubscriber.c:2093 -#: pg_createsubscriber.c:2125 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2052 pg_createsubscriber.c:2062 +#: pg_createsubscriber.c:2070 pg_createsubscriber.c:2098 +#: pg_createsubscriber.c:2130 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:853 pg_recvlogical.c:865 #: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 @@ -1189,7 +1209,7 @@ msgid "Try \"%s --help\" for more information." msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_basebackup.c:2584 pg_createsubscriber.c:2055 pg_receivewal.c:758 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2060 pg_receivewal.c:758 #: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" @@ -1307,7 +1327,7 @@ msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" msgstr "プライマリ上のデータベース\"%2$s\"で作成されたレプリケーションスロット\"%1$s\"が残されています" -#: pg_createsubscriber.c:206 pg_createsubscriber.c:1270 +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1275 #, c-format msgid "Drop this replication slot soon to avoid retention of WAL files." msgstr "WALファイルの増加を避けるためにこのレプリケーションスロットを直ちに削除してください。" @@ -1608,332 +1628,332 @@ msgid "subscriber requires %d worker processes, but only %d remain" msgstr "サブスクライバは%d個のワーカープロセスを必要としますが、%d個しか残っていません" -#: pg_createsubscriber.c:1079 +#: pg_createsubscriber.c:1084 #, c-format msgid "dropping subscription \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のサブスクリプション\"%1$s\"の削除中" -#: pg_createsubscriber.c:1088 +#: pg_createsubscriber.c:1093 #, c-format msgid "could not drop subscription \"%s\": %s" msgstr "サブスクリプション\"%s\"を削除できませんでした: %s" -#: pg_createsubscriber.c:1123 +#: pg_createsubscriber.c:1128 #, c-format msgid "could not obtain pre-existing subscriptions: %s" msgstr "既存のサブスクリプションを取得できませんでした: %s" -#: pg_createsubscriber.c:1268 +#: pg_createsubscriber.c:1273 #, c-format msgid "could not drop replication slot \"%s\" on primary" msgstr "プライマリ上のレプリケーションスロット\"%s\"を削除できませんでした" -#: pg_createsubscriber.c:1302 +#: pg_createsubscriber.c:1307 #, c-format msgid "could not obtain failover replication slot information: %s" msgstr "フェイルオーバーレプリケーションスロットの情報を取得できませんでした: %s" -#: pg_createsubscriber.c:1304 pg_createsubscriber.c:1313 +#: pg_createsubscriber.c:1309 pg_createsubscriber.c:1318 #, c-format msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." msgstr "WALファイルの増加を避けるためにこのフェイルオーバーレプリケーションスロットを直ちに削除してください。" -#: pg_createsubscriber.c:1312 +#: pg_createsubscriber.c:1317 #, c-format msgid "could not drop failover replication slot" msgstr "フェイルオーバーレプリケーションスロットを削除できませんでした" -#: pg_createsubscriber.c:1334 +#: pg_createsubscriber.c:1339 #, c-format msgid "creating the replication slot \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"でレプリケーションスロット\"%1$s:を作成します" -#: pg_createsubscriber.c:1352 +#: pg_createsubscriber.c:1357 #, c-format msgid "could not create replication slot \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"でレプリケーションスロット\"%1$s\"を作成できませんでした: %3$s" -#: pg_createsubscriber.c:1382 +#: pg_createsubscriber.c:1387 #, c-format msgid "dropping the replication slot \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のレプリケーションスロット\"%1$s:を削除します" -#: pg_createsubscriber.c:1398 +#: pg_createsubscriber.c:1403 #, c-format msgid "could not drop replication slot \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"のレプリケーションスロット\"%1$s\"を削除できませんでした: %3$s" -#: pg_createsubscriber.c:1419 +#: pg_createsubscriber.c:1424 #, c-format msgid "pg_ctl failed with exit code %d" msgstr "pg_ctlが終了コード%dで失敗しました" -#: pg_createsubscriber.c:1424 +#: pg_createsubscriber.c:1429 #, c-format msgid "pg_ctl was terminated by exception 0x%X" msgstr "pg_ctlが例外0x%Xによって終了させられました" -#: pg_createsubscriber.c:1426 +#: pg_createsubscriber.c:1431 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "16進値の説明についてはC インクルードファイル\"ntstatus.h\"を参照してください。" -#: pg_createsubscriber.c:1428 +#: pg_createsubscriber.c:1433 #, c-format msgid "pg_ctl was terminated by signal %d: %s" msgstr "pg_ctlがシグナル%dによって終了させられました %s" -#: pg_createsubscriber.c:1434 +#: pg_createsubscriber.c:1439 #, c-format msgid "pg_ctl exited with unrecognized status %d" msgstr "pg_ctlが認識できない状態%dで終了しました" -#: pg_createsubscriber.c:1437 +#: pg_createsubscriber.c:1442 #, c-format msgid "The failed command was: %s" msgstr "失敗したコマンドは以下のとおりです: %s" -#: pg_createsubscriber.c:1483 +#: pg_createsubscriber.c:1488 #, c-format msgid "server was started" msgstr "サーバー起動完了" -#: pg_createsubscriber.c:1498 +#: pg_createsubscriber.c:1503 #, c-format msgid "server was stopped" msgstr "サーバーは停止しました" -#: pg_createsubscriber.c:1517 +#: pg_createsubscriber.c:1522 #, c-format msgid "waiting for the target server to reach the consistent state" msgstr "対象サーバーが一貫性のある状態に到達するのを待っています" -#: pg_createsubscriber.c:1540 +#: pg_createsubscriber.c:1545 #, c-format msgid "recovery timed out" msgstr "リカバリーがタイムアウトしました" -#: pg_createsubscriber.c:1553 +#: pg_createsubscriber.c:1558 #, c-format msgid "server did not end recovery" msgstr "サーバーはリカバリを完了しませんでした" -#: pg_createsubscriber.c:1555 +#: pg_createsubscriber.c:1560 #, c-format msgid "target server reached the consistent state" msgstr "対象サーバーが一貫性のある状態に到達しました" -#: pg_createsubscriber.c:1556 +#: pg_createsubscriber.c:1561 #, c-format msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." msgstr "もしpg_createsubscriberが今時点より後で失敗した場合は、作業を継続する前に物理レプリカを再作成する必要があります。" -#: pg_createsubscriber.c:1583 +#: pg_createsubscriber.c:1588 #, c-format msgid "could not obtain publication information: %s" msgstr "パブリケーション情報を取得できませんでした: %s" -#: pg_createsubscriber.c:1597 +#: pg_createsubscriber.c:1602 #, c-format msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"はすでに存在します" -#: pg_createsubscriber.c:1598 +#: pg_createsubscriber.c:1603 #, c-format msgid "Consider renaming this publication before continuing." msgstr "作業を継続する前にこのパブリケーションの名前を変更することを検討してください。" -#: pg_createsubscriber.c:1605 +#: pg_createsubscriber.c:1610 #, c-format msgid "creating publication \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"でパブリケーション\"%1$s\"を作成します" -#: pg_createsubscriber.c:1618 +#: pg_createsubscriber.c:1623 #, c-format msgid "could not create publication \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"でパブリケーション\"%1$s\"を作成できませんでした: %3$s" -#: pg_createsubscriber.c:1647 +#: pg_createsubscriber.c:1652 #, c-format msgid "dropping publication \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のパブリケーション\"%1$s\"を削除します" -#: pg_createsubscriber.c:1661 +#: pg_createsubscriber.c:1666 #, c-format msgid "could not drop publication \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"のパブリケーション\"%1$s\"が削除できませんでした: %3$s" -#: pg_createsubscriber.c:1707 +#: pg_createsubscriber.c:1712 #, c-format msgid "creating subscription \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"でサブスクリプション\"%1$s\"を作成します" -#: pg_createsubscriber.c:1728 +#: pg_createsubscriber.c:1733 #, c-format msgid "could not create subscription \"%s\" in database \"%s\": %s" msgstr "データベース\"%2$s\"でサブスクリプション\"%1$s\"を作成できませんでした: %3$s" -#: pg_createsubscriber.c:1773 +#: pg_createsubscriber.c:1778 #, c-format msgid "could not obtain subscription OID: %s" msgstr "サブスクリプションOIDが取得できませんでした: %s" -#: pg_createsubscriber.c:1780 +#: pg_createsubscriber.c:1785 #, c-format msgid "could not obtain subscription OID: got %d rows, expected %d row" msgstr "サブスクリプションOIDが取得できませんでした: 受信したのは%d行、想定は%d行" -#: pg_createsubscriber.c:1804 +#: pg_createsubscriber.c:1809 #, 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:1819 +#: pg_createsubscriber.c:1824 #, c-format msgid "could not set replication progress for subscription \"%s\": %s" msgstr "サブスクリプション\"%s\"にレプリケーション進捗を設定できませんでした: %s" -#: pg_createsubscriber.c:1850 +#: pg_createsubscriber.c:1855 #, c-format msgid "enabling subscription \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のサブスクリプション\"%1$s\"を有効にします" -#: pg_createsubscriber.c:1862 +#: pg_createsubscriber.c:1867 #, c-format msgid "could not enable subscription \"%s\": %s" msgstr "サブスクリプション\"%s\"を有効化できませんでした: %s" -#: pg_createsubscriber.c:1954 +#: pg_createsubscriber.c:1959 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\"では実行できません" -#: pg_createsubscriber.c:1955 +#: pg_createsubscriber.c:1960 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "PostgreSQLのスーパーユーザーで%sを実行しなければなりません" -#: pg_createsubscriber.c:1976 +#: pg_createsubscriber.c:1981 #, c-format msgid "database \"%s\" specified more than once" msgstr "データベース\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2017 +#: pg_createsubscriber.c:2022 #, c-format msgid "publication \"%s\" specified more than once" msgstr "パブリケーション\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2029 +#: pg_createsubscriber.c:2034 #, c-format msgid "replication slot \"%s\" specified more than once" msgstr "レプリケーションスロット\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2041 +#: pg_createsubscriber.c:2046 #, c-format msgid "subscription \"%s\" specified more than once" msgstr "サブスクリプション\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2064 +#: pg_createsubscriber.c:2069 #, c-format msgid "no subscriber data directory specified" msgstr "サブスクライバのデータディレクトリが指定されていません" -#: pg_createsubscriber.c:2075 +#: pg_createsubscriber.c:2080 #, c-format msgid "could not determine current directory" msgstr "カレントディレクトリを特定できませんでした" -#: pg_createsubscriber.c:2092 +#: pg_createsubscriber.c:2097 #, c-format msgid "no publisher connection string specified" msgstr "パブリッシャの接続文字列が指定されていません" -#: pg_createsubscriber.c:2096 +#: pg_createsubscriber.c:2101 #, c-format msgid "validating publisher connection string" msgstr "パブリッシャの接続文字列の検証中" -#: pg_createsubscriber.c:2102 +#: pg_createsubscriber.c:2107 #, c-format msgid "validating subscriber connection string" msgstr "サブスクライバの接続文字列の検証中" -#: pg_createsubscriber.c:2107 +#: pg_createsubscriber.c:2112 #, c-format msgid "no database was specified" msgstr "データベースが指定されていません" -#: pg_createsubscriber.c:2119 +#: pg_createsubscriber.c:2124 #, c-format msgid "database name \"%s\" was extracted from the publisher connection string" msgstr "データベース名\"%s\"がパブリッシャの接続文字列から抽出されました" -#: pg_createsubscriber.c:2124 +#: pg_createsubscriber.c:2129 #, c-format msgid "no database name specified" msgstr "データベース名が指定されていません" -#: pg_createsubscriber.c:2134 +#: pg_createsubscriber.c:2139 #, c-format msgid "wrong number of publication names specified" msgstr "指定されたパブリケーション名の数が間違っています" -#: pg_createsubscriber.c:2135 +#: pg_createsubscriber.c:2140 #, 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:2141 +#: pg_createsubscriber.c:2146 #, c-format msgid "wrong number of subscription names specified" msgstr "指定されたサブスクリプション名の数が間違っています" -#: pg_createsubscriber.c:2142 +#: pg_createsubscriber.c:2147 #, 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:2148 +#: pg_createsubscriber.c:2153 #, c-format msgid "wrong number of replication slot names specified" msgstr "指定されたレプリケーションスロット名の数が間違っています" -#: pg_createsubscriber.c:2149 +#: pg_createsubscriber.c:2154 #, 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:2178 +#: pg_createsubscriber.c:2183 #, c-format msgid "subscriber data directory is not a copy of the source database cluster" msgstr "サブスクライバのデータディレクトリは元データベースクラスタのコピーではありません" -#: pg_createsubscriber.c:2191 +#: pg_createsubscriber.c:2196 #, c-format msgid "standby server is running" msgstr "スタンバイサーバーが稼働中です" -#: pg_createsubscriber.c:2192 +#: pg_createsubscriber.c:2197 #, c-format msgid "Stop the standby server and try again." msgstr "このスタンバイサーバーを停止してから再試行してください。" -#: pg_createsubscriber.c:2201 +#: pg_createsubscriber.c:2206 #, c-format msgid "starting the standby server with command-line options" msgstr "コマンドラインオプションを指定してスタンバイサーバーを起動しています" -#: pg_createsubscriber.c:2217 pg_createsubscriber.c:2252 +#: pg_createsubscriber.c:2222 pg_createsubscriber.c:2257 #, c-format msgid "stopping the subscriber" msgstr "サブスクライバを起動しています" -#: pg_createsubscriber.c:2231 +#: pg_createsubscriber.c:2236 #, c-format msgid "starting the subscriber" msgstr "サブスクライバを起動しています" -#: pg_createsubscriber.c:2260 +#: pg_createsubscriber.c:2265 #, c-format msgid "Done!" msgstr "完了!" diff -Nru postgresql-17-17.10/src/bin/pg_basebackup/po/ru.po postgresql-17-17.11/src/bin/pg_basebackup/po/ru.po --- postgresql-17-17.10/src/bin/pg_basebackup/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_basebackup/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,8 +6,8 @@ msgstr "" "Project-Id-Version: pg_basebackup (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-10 08:01+0300\n" -"PO-Revision-Date: 2025-11-09 08:45+0200\n" +"POT-Creation-Date: 2026-08-05 06:37+0300\n" +"PO-Revision-Date: 2026-08-05 07:48+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -110,7 +110,7 @@ msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d из %zu)" #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 -#: bbstreamer_file.c:138 bbstreamer_file.c:267 pg_recvlogical.c:650 +#: bbstreamer_file.c:138 bbstreamer_file.c:279 pg_recvlogical.c:654 #, c-format msgid "could not close file \"%s\": %m" msgstr "не удалось закрыть файл \"%s\": %m" @@ -152,24 +152,34 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" #: ../../common/file_utils.c:120 ../../common/file_utils.c:566 -#: pg_receivewal.c:319 pg_recvlogical.c:352 +#: pg_receivewal.c:319 pg_recvlogical.c:356 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалось получить информацию о файле \"%s\": %m" @@ -250,12 +260,12 @@ msgstr "нехватка памяти" #: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 -#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 +#: bbstreamer_file.c:270 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "не удалось записать в файл \"%s\": %m" -#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:363 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:375 #: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" @@ -274,28 +284,38 @@ msgstr "" "имя базы данных содержит символ новой строки или перевода каретки: \"%s\"\n" -#: bbstreamer_file.c:277 +#: bbstreamer_file.c:219 bbstreamer_tar.c:295 +#, c-format +msgid "tar member has unsafe path name: \"%s\"" +msgstr "компонент tar имеет небезопасный путь: \"%s\"" + +#: bbstreamer_file.c:244 +#, c-format +msgid "link target has unsafe path name: \"%s\"" +msgstr "цель ссылки имеет небезопасный путь: \"%s\"" + +#: bbstreamer_file.c:289 #, c-format msgid "unexpected state while extracting archive" msgstr "неожиданное состояние при извлечении архива" -#: bbstreamer_file.c:323 pg_basebackup.c:698 pg_basebackup.c:712 +#: bbstreamer_file.c:335 pg_basebackup.c:698 pg_basebackup.c:712 #: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не удалось создать каталог \"%s\": %m" -#: bbstreamer_file.c:328 +#: bbstreamer_file.c:340 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "не удалось установить права для каталога \"%s\": %m" -#: bbstreamer_file.c:347 +#: bbstreamer_file.c:359 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "не удалось создать символическую ссылку \"%s\" в \"%s\": %m" -#: bbstreamer_file.c:367 +#: bbstreamer_file.c:379 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "не удалось установить права доступа для файла \"%s\": %m" @@ -385,7 +405,7 @@ msgid "tar member has empty name" msgstr "пустое имя у компонента tar" -#: bbstreamer_tar.c:327 +#: bbstreamer_tar.c:330 #, c-format msgid "COPY stream ended before last file was finished" msgstr "поток COPY закончился до завершения последнего файла" @@ -937,8 +957,8 @@ msgid "could not get COPY data stream: %s" msgstr "не удалось получить поток данных COPY: %s" -#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 -#: receivelog.c:973 +#: pg_basebackup.c:1039 pg_recvlogical.c:453 pg_recvlogical.c:629 +#: receivelog.c:979 #, c-format msgid "could not read COPY data: %s" msgstr "не удалось прочитать данные COPY: %s" @@ -1033,9 +1053,9 @@ msgid "server does not support incremental backup" msgstr "сервер не поддерживает инкрементальное копирование" -#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 -#: receivelog.c:543 receivelog.c:582 streamutil.c:367 streamutil.c:441 -#: streamutil.c:493 streamutil.c:581 streamutil.c:733 streamutil.c:778 +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:276 +#: receivelog.c:542 receivelog.c:588 streamutil.c:367 streamutil.c:441 +#: streamutil.c:493 streamutil.c:582 streamutil.c:738 streamutil.c:783 #, c-format msgid "could not send replication command \"%s\": %s" msgstr "не удалось передать команду репликации \"%s\": %s" @@ -1245,20 +1265,20 @@ #: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 #: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 #: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 -#: pg_basebackup.c:2803 pg_createsubscriber.c:2047 pg_createsubscriber.c:2057 -#: pg_createsubscriber.c:2065 pg_createsubscriber.c:2093 -#: pg_createsubscriber.c:2125 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2050 pg_createsubscriber.c:2060 +#: pg_createsubscriber.c:2068 pg_createsubscriber.c:2096 +#: pg_createsubscriber.c:2128 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:853 pg_recvlogical.c:865 -#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 -#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 -#: pg_recvlogical.c:917 pg_recvlogical.c:924 +#: pg_receivewal.c:793 pg_recvlogical.c:857 pg_recvlogical.c:869 +#: pg_recvlogical.c:879 pg_recvlogical.c:886 pg_recvlogical.c:893 +#: pg_recvlogical.c:900 pg_recvlogical.c:907 pg_recvlogical.c:914 +#: pg_recvlogical.c:921 pg_recvlogical.c:928 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Для дополнительной информации попробуйте \"%s --help\"." -#: pg_basebackup.c:2584 pg_createsubscriber.c:2055 pg_receivewal.c:758 -#: pg_recvlogical.c:863 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2058 pg_receivewal.c:758 +#: pg_recvlogical.c:867 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" @@ -1383,7 +1403,7 @@ msgstr "" "на главном сервере остался слот репликации \"%s\", созданный в базе \"%s\"" -#: pg_createsubscriber.c:206 pg_createsubscriber.c:1270 +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1275 #, c-format msgid "Drop this replication slot soon to avoid retention of WAL files." msgstr "" @@ -1717,32 +1737,32 @@ msgid "subscriber requires %d worker processes, but only %d remain" msgstr "подписчику требуется рабочих процессов: %d, но доступно всего %d" -#: pg_createsubscriber.c:1079 +#: pg_createsubscriber.c:1084 #, c-format msgid "dropping subscription \"%s\" in database \"%s\"" msgstr "удаление подписки \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1088 +#: pg_createsubscriber.c:1093 #, c-format msgid "could not drop subscription \"%s\": %s" msgstr "удалить подписку \"%s\" не получилось: %s" -#: pg_createsubscriber.c:1123 +#: pg_createsubscriber.c:1128 #, c-format msgid "could not obtain pre-existing subscriptions: %s" msgstr "получить уже существующие подписки не удалось: %s" -#: pg_createsubscriber.c:1268 +#: pg_createsubscriber.c:1273 #, c-format msgid "could not drop replication slot \"%s\" on primary" msgstr "удалить слот репликации \"%s\" на главном сервере не получилось" -#: pg_createsubscriber.c:1302 +#: pg_createsubscriber.c:1307 #, c-format msgid "could not obtain failover replication slot information: %s" msgstr "получить информацию о переносимом слоте репликации не удалось: %s" -#: pg_createsubscriber.c:1304 pg_createsubscriber.c:1313 +#: pg_createsubscriber.c:1309 pg_createsubscriber.c:1318 #, c-format msgid "" "Drop the failover replication slots on subscriber soon to avoid retention of " @@ -1751,42 +1771,42 @@ "Удалите переносимые слоты репликации на подписчике незамедлительно во " "избежание накопления файлов WAL." -#: pg_createsubscriber.c:1312 +#: pg_createsubscriber.c:1317 #, c-format msgid "could not drop failover replication slot" msgstr "удалить переносимый слот репликации не получилось" -#: pg_createsubscriber.c:1334 +#: pg_createsubscriber.c:1339 #, c-format msgid "creating the replication slot \"%s\" in database \"%s\"" msgstr "создание слота репликации \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1352 +#: pg_createsubscriber.c:1357 #, c-format msgid "could not create replication slot \"%s\" in database \"%s\": %s" msgstr "создать слот репликации \"%s\" в базе \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1382 +#: pg_createsubscriber.c:1387 #, c-format msgid "dropping the replication slot \"%s\" in database \"%s\"" msgstr "удаление слота репликации \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1398 +#: pg_createsubscriber.c:1403 #, c-format msgid "could not drop replication slot \"%s\" in database \"%s\": %s" msgstr "удалить слот репликации \"%s\" в базе \"%s\" не получилось: %s" -#: pg_createsubscriber.c:1419 +#: pg_createsubscriber.c:1423 #, c-format msgid "pg_ctl failed with exit code %d" msgstr "команда pg_ctl завершилась с кодом ошибки %d" -#: pg_createsubscriber.c:1424 +#: pg_createsubscriber.c:1428 #, c-format msgid "pg_ctl was terminated by exception 0x%X" msgstr "команда pg_ctl была прервана исключением 0x%X" -#: pg_createsubscriber.c:1426 +#: pg_createsubscriber.c:1430 #, c-format msgid "" "See C include file \"ntstatus.h\" for a description of the hexadecimal value." @@ -1794,52 +1814,52 @@ "Описание этого шестнадцатеричного значения ищите во включаемом C-файле " "\"ntstatus.h\"" -#: pg_createsubscriber.c:1428 +#: pg_createsubscriber.c:1432 #, c-format msgid "pg_ctl was terminated by signal %d: %s" msgstr "команда pg_ctl была завершена сигналом %d: %s" -#: pg_createsubscriber.c:1434 +#: pg_createsubscriber.c:1438 #, c-format msgid "pg_ctl exited with unrecognized status %d" msgstr "команда pg_ctl завершилась с нераспознанным кодом состояния %d" -#: pg_createsubscriber.c:1437 +#: pg_createsubscriber.c:1441 #, c-format msgid "The failed command was: %s" msgstr "Ошибку вызвала команда: %s" -#: pg_createsubscriber.c:1483 +#: pg_createsubscriber.c:1487 #, c-format msgid "server was started" msgstr "сервер был запущен" -#: pg_createsubscriber.c:1498 +#: pg_createsubscriber.c:1502 #, c-format msgid "server was stopped" msgstr "сервер был остановлен" -#: pg_createsubscriber.c:1517 +#: pg_createsubscriber.c:1521 #, c-format msgid "waiting for the target server to reach the consistent state" msgstr "ожидание достижения целевым сервером согласованного состояния" -#: pg_createsubscriber.c:1540 +#: pg_createsubscriber.c:1544 #, c-format msgid "recovery timed out" msgstr "тайм-аут при восстановлении" -#: pg_createsubscriber.c:1553 +#: pg_createsubscriber.c:1557 #, c-format msgid "server did not end recovery" msgstr "сервер не завершил восстановление" -#: pg_createsubscriber.c:1555 +#: pg_createsubscriber.c:1559 #, c-format msgid "target server reached the consistent state" msgstr "целевой сервер достиг согласованного состояния" -#: pg_createsubscriber.c:1556 +#: pg_createsubscriber.c:1560 #, c-format msgid "" "If pg_createsubscriber fails after this point, you must recreate the " @@ -1848,159 +1868,159 @@ "Если в работе pg_createsubscriber произойдёт сбой после этого момента, " "продолжение возможно только после пересоздания физической реплики." -#: pg_createsubscriber.c:1583 +#: pg_createsubscriber.c:1587 #, c-format msgid "could not obtain publication information: %s" msgstr "получить информацию о публикации не удалось: %s" -#: pg_createsubscriber.c:1597 +#: pg_createsubscriber.c:1601 #, c-format msgid "publication \"%s\" already exists" msgstr "публикация \"%s\" уже существует" -#: pg_createsubscriber.c:1598 +#: pg_createsubscriber.c:1602 #, c-format msgid "Consider renaming this publication before continuing." msgstr "Чтобы продолжить, её можно переименовать." -#: pg_createsubscriber.c:1605 +#: pg_createsubscriber.c:1609 #, c-format msgid "creating publication \"%s\" in database \"%s\"" msgstr "создаётся публикация \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1618 +#: pg_createsubscriber.c:1622 #, c-format msgid "could not create publication \"%s\" in database \"%s\": %s" msgstr "создать публикацию \"%s\" в базе \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1647 +#: pg_createsubscriber.c:1651 #, c-format msgid "dropping publication \"%s\" in database \"%s\"" msgstr "удаляется публикация \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1661 +#: pg_createsubscriber.c:1665 #, c-format msgid "could not drop publication \"%s\" in database \"%s\": %s" msgstr "удалить публикацию \"%s\" в базе \"%s\" не получилось: %s" -#: pg_createsubscriber.c:1707 +#: pg_createsubscriber.c:1710 #, c-format msgid "creating subscription \"%s\" in database \"%s\"" msgstr "создаётся подписка \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1728 +#: pg_createsubscriber.c:1731 #, c-format msgid "could not create subscription \"%s\" in database \"%s\": %s" msgstr "создать подписку \"%s\" в базе \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1773 +#: pg_createsubscriber.c:1776 #, c-format msgid "could not obtain subscription OID: %s" msgstr "получить OID подписки не удалось: %s" -#: pg_createsubscriber.c:1780 +#: pg_createsubscriber.c:1783 #, c-format msgid "could not obtain subscription OID: got %d rows, expected %d row" msgstr "получить OID подписки не удалось; получено строк: %d, ожидалось: %d" -#: pg_createsubscriber.c:1804 +#: pg_createsubscriber.c:1807 #, c-format msgid "" "setting the replication progress (node name \"%s\", LSN %s) in database " "\"%s\"" msgstr "отражение состояния репликации (имя узла \"%s\", LSN %s) в базе \"%s\"" -#: pg_createsubscriber.c:1819 +#: pg_createsubscriber.c:1822 #, c-format msgid "could not set replication progress for subscription \"%s\": %s" msgstr "не удалось передать состояние репликации для подписки \"%s\": %s" -#: pg_createsubscriber.c:1850 +#: pg_createsubscriber.c:1853 #, c-format msgid "enabling subscription \"%s\" in database \"%s\"" msgstr "включение подписки \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1862 +#: pg_createsubscriber.c:1865 #, c-format msgid "could not enable subscription \"%s\": %s" msgstr "включить подписку \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1954 +#: pg_createsubscriber.c:1957 #, c-format msgid "cannot be executed by \"root\"" msgstr "программу не должен запускать root" -#: pg_createsubscriber.c:1955 +#: pg_createsubscriber.c:1958 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Запускать %s нужно от имени суперпользователя PostgreSQL." -#: pg_createsubscriber.c:1976 +#: pg_createsubscriber.c:1979 #, c-format msgid "database \"%s\" specified more than once" msgstr "база \"%s\" указана неоднократно" -#: pg_createsubscriber.c:2017 +#: pg_createsubscriber.c:2020 #, c-format msgid "publication \"%s\" specified more than once" msgstr "публикация \"%s\" указана неоднократно" -#: pg_createsubscriber.c:2029 +#: pg_createsubscriber.c:2032 #, c-format msgid "replication slot \"%s\" specified more than once" msgstr "слот репликации \"%s\" указан неоднократно" -#: pg_createsubscriber.c:2041 +#: pg_createsubscriber.c:2044 #, c-format msgid "subscription \"%s\" specified more than once" msgstr "подписка \"%s\" указана неоднократно" -#: pg_createsubscriber.c:2064 +#: pg_createsubscriber.c:2067 #, c-format msgid "no subscriber data directory specified" msgstr "каталог данных подписчика не указан" -#: pg_createsubscriber.c:2075 +#: pg_createsubscriber.c:2078 #, c-format msgid "could not determine current directory" msgstr "не удалось определить текущий каталог" -#: pg_createsubscriber.c:2092 +#: pg_createsubscriber.c:2095 #, c-format msgid "no publisher connection string specified" msgstr "строка подключения к серверу публикации не указана" -#: pg_createsubscriber.c:2096 +#: pg_createsubscriber.c:2099 #, c-format msgid "validating publisher connection string" msgstr "проверяется строка подключения к серверу публикации" -#: pg_createsubscriber.c:2102 +#: pg_createsubscriber.c:2105 #, c-format msgid "validating subscriber connection string" msgstr "проверяется строка подключения к подписчику" -#: pg_createsubscriber.c:2107 +#: pg_createsubscriber.c:2110 #, c-format msgid "no database was specified" msgstr "база данных не указана" -#: pg_createsubscriber.c:2119 +#: pg_createsubscriber.c:2122 #, c-format msgid "database name \"%s\" was extracted from the publisher connection string" msgstr "имя базы \"%s\" извлечено из строки подключения к серверу публикации" -#: pg_createsubscriber.c:2124 +#: pg_createsubscriber.c:2127 #, c-format msgid "no database name specified" msgstr "имя базы данных не указано" -#: pg_createsubscriber.c:2134 +#: pg_createsubscriber.c:2137 #, c-format msgid "wrong number of publication names specified" msgstr "указано неверное количество имён публикаций" -#: pg_createsubscriber.c:2135 +#: pg_createsubscriber.c:2138 #, c-format msgid "" "The number of specified publication names (%d) must match the number of " @@ -2009,12 +2029,12 @@ "Количество указанных имён публикаций (%d) должно совпадать с количеством " "указанных имён баз (%d)." -#: pg_createsubscriber.c:2141 +#: pg_createsubscriber.c:2144 #, c-format msgid "wrong number of subscription names specified" msgstr "указано неверное количество имён подписок" -#: pg_createsubscriber.c:2142 +#: pg_createsubscriber.c:2145 #, c-format msgid "" "The number of specified subscription names (%d) must match the number of " @@ -2023,12 +2043,12 @@ "Количество указанных имён подписок (%d) должно совпадать с количеством " "указанных имён баз (%d)." -#: pg_createsubscriber.c:2148 +#: pg_createsubscriber.c:2151 #, c-format msgid "wrong number of replication slot names specified" msgstr "указано неверное количество имён слотов репликации" -#: pg_createsubscriber.c:2149 +#: pg_createsubscriber.c:2152 #, c-format msgid "" "The number of specified replication slot names (%d) must match the number of " @@ -2037,38 +2057,38 @@ "Количество указанных имён слотов репликации (%d) должно совпадать с " "количеством указанных имён баз (%d)." -#: pg_createsubscriber.c:2178 +#: pg_createsubscriber.c:2181 #, c-format msgid "subscriber data directory is not a copy of the source database cluster" msgstr "" "каталог данных подписчика не является копией исходного кластера баз данных" -#: pg_createsubscriber.c:2191 +#: pg_createsubscriber.c:2194 #, c-format msgid "standby server is running" msgstr "резервный сервер запущен" -#: pg_createsubscriber.c:2192 +#: pg_createsubscriber.c:2195 #, c-format msgid "Stop the standby server and try again." msgstr "Остановите резервный сервер и повторите попытку." -#: pg_createsubscriber.c:2201 +#: pg_createsubscriber.c:2204 #, c-format msgid "starting the standby server with command-line options" msgstr "резервный сервер запускается с параметрами командной строки" -#: pg_createsubscriber.c:2217 pg_createsubscriber.c:2252 +#: pg_createsubscriber.c:2220 pg_createsubscriber.c:2255 #, c-format msgid "stopping the subscriber" msgstr "подписчик останавливается" -#: pg_createsubscriber.c:2231 +#: pg_createsubscriber.c:2234 #, c-format msgid "starting the subscriber" msgstr "подписчик запускается" -#: pg_createsubscriber.c:2260 +#: pg_createsubscriber.c:2263 #, c-format msgid "Done!" msgstr "Готово!" @@ -2189,7 +2209,7 @@ msgid "switched to timeline %u at %X/%X" msgstr "переключение на линию времени %u (позиция %X/%X)" -#: pg_receivewal.c:224 pg_recvlogical.c:1053 +#: pg_receivewal.c:224 pg_recvlogical.c:1057 #, c-format msgid "received interrupt signal, exiting" msgstr "получен сигнал прерывания, работа завершается" @@ -2268,7 +2288,7 @@ msgid "starting log streaming at %X/%X (timeline %u)" msgstr "начало передачи журнала с позиции %X/%X (линия времени %u)" -#: pg_receivewal.c:693 pg_recvlogical.c:801 +#: pg_receivewal.c:693 pg_recvlogical.c:805 #, c-format msgid "could not parse end position \"%s\"" msgstr "не удалось разобрать конечную позицию \"%s\"" @@ -2301,23 +2321,23 @@ "подключение для репликации через слот \"%s\" оказалось привязано к базе " "данных" -#: pg_receivewal.c:878 pg_recvlogical.c:972 +#: pg_receivewal.c:878 pg_recvlogical.c:976 #, c-format msgid "dropping replication slot \"%s\"" msgstr "удаление слота репликации \"%s\"" -#: pg_receivewal.c:889 pg_recvlogical.c:982 +#: pg_receivewal.c:889 pg_recvlogical.c:986 #, c-format msgid "creating replication slot \"%s\"" msgstr "создание слота репликации \"%s\"" -#: pg_receivewal.c:918 pg_recvlogical.c:1006 +#: pg_receivewal.c:918 pg_recvlogical.c:1010 #, c-format msgid "disconnected" msgstr "отключение" #. translator: check source for value for %d -#: pg_receivewal.c:922 pg_recvlogical.c:1010 +#: pg_receivewal.c:922 pg_recvlogical.c:1014 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "отключение; через %d сек. последует повторное подключение" @@ -2428,109 +2448,109 @@ msgid "starting log streaming at %X/%X (slot %s)" msgstr "начало передачи журнала с позиции %X/%X (слот %s)" -#: pg_recvlogical.c:281 +#: pg_recvlogical.c:285 #, c-format msgid "streaming initiated" msgstr "передача запущена" -#: pg_recvlogical.c:346 +#: pg_recvlogical.c:350 #, c-format msgid "could not open log file \"%s\": %m" msgstr "не удалось открыть файл протокола \"%s\": %m" -#: pg_recvlogical.c:375 receivelog.c:882 +#: pg_recvlogical.c:379 receivelog.c:888 #, c-format msgid "invalid socket: %s" msgstr "неверный сокет: %s" -#: pg_recvlogical.c:428 receivelog.c:910 +#: pg_recvlogical.c:432 receivelog.c:916 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" -#: pg_recvlogical.c:435 receivelog.c:959 +#: pg_recvlogical.c:439 receivelog.c:965 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не удалось получить данные из потока WAL: %s" -#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 -#: receivelog.c:1066 +#: pg_recvlogical.c:481 pg_recvlogical.c:532 receivelog.c:1009 +#: receivelog.c:1072 #, c-format msgid "streaming header too small: %d" msgstr "заголовок потока слишком мал: %d" -#: pg_recvlogical.c:512 receivelog.c:843 +#: pg_recvlogical.c:516 receivelog.c:849 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "нераспознанный заголовок потока: \"%c\"" -#: pg_recvlogical.c:566 pg_recvlogical.c:578 +#: pg_recvlogical.c:570 pg_recvlogical.c:582 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "не удалось записать %d Б в файл журнала \"%s\": %m" -#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 +#: pg_recvlogical.c:640 receivelog.c:648 receivelog.c:685 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "неожиданный конец потока репликации: %s" -#: pg_recvlogical.c:796 +#: pg_recvlogical.c:800 #, c-format msgid "could not parse start position \"%s\"" msgstr "не удалось разобрать начальную позицию \"%s\"" -#: pg_recvlogical.c:874 +#: pg_recvlogical.c:878 #, c-format msgid "no slot specified" msgstr "слот не указан" -#: pg_recvlogical.c:881 +#: pg_recvlogical.c:885 #, c-format msgid "no target file specified" msgstr "целевой файл не задан" -#: pg_recvlogical.c:888 +#: pg_recvlogical.c:892 #, c-format msgid "no database specified" msgstr "база данных не задана" -#: pg_recvlogical.c:895 +#: pg_recvlogical.c:899 #, c-format msgid "at least one action needs to be specified" msgstr "необходимо задать минимум одно действие" -#: pg_recvlogical.c:902 +#: pg_recvlogical.c:906 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "--create-slot или --start нельзя применять вместе с --drop-slot" -#: pg_recvlogical.c:909 +#: pg_recvlogical.c:913 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "--create-slot или --drop-slot нельзя применять вместе с --startpos" -#: pg_recvlogical.c:916 +#: pg_recvlogical.c:920 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos можно задать только вместе с --start" -#: pg_recvlogical.c:923 +#: pg_recvlogical.c:927 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phase можно задать только вместе с --create-slot" -#: pg_recvlogical.c:956 +#: pg_recvlogical.c:960 #, c-format msgid "could not establish database-specific replication connection" msgstr "" "не удалось установить подключение для репликации к определённой базе данных" -#: pg_recvlogical.c:1056 +#: pg_recvlogical.c:1060 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "конечная позиция %X/%X достигнута при обработке keepalive" -#: pg_recvlogical.c:1061 +#: pg_recvlogical.c:1065 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "конечная позиция %X/%X достигнута при обработке записи WAL %X/%X" @@ -2582,7 +2602,7 @@ msgid "not renaming \"%s\", segment is not complete" msgstr "файл сегмента \"%s\" не переименовывается, так как он неполный" -#: receivelog.c:227 receivelog.c:317 receivelog.c:688 +#: receivelog.c:227 receivelog.c:317 receivelog.c:694 #, c-format msgid "could not close file \"%s\": %s" msgstr "не удалось закрыть файл \"%s\": %s" @@ -2620,7 +2640,7 @@ "несовместимая версия сервера %s; клиент не поддерживает репликацию с " "серверов версии выше %s" -#: receivelog.c:508 +#: receivelog.c:505 #, c-format msgid "" "system identifier does not match between base backup and streaming connection" @@ -2628,12 +2648,12 @@ "системный идентификатор базовой резервной копии отличается от идентификатора " "потоковой передачи" -#: receivelog.c:516 +#: receivelog.c:513 #, c-format msgid "starting timeline %u is not present in the server" msgstr "на сервере нет начальной линии времени %u" -#: receivelog.c:555 +#: receivelog.c:554 #, c-format msgid "" "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, " @@ -2642,12 +2662,12 @@ "сервер вернул неожиданный ответ на команду TIMELINE_HISTORY; получено строк: " "%d, полей: %d, а ожидалось строк: %d, полей: %d" -#: receivelog.c:626 +#: receivelog.c:632 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "сервер неожиданно сообщил линию времени %u после линии времени %u" -#: receivelog.c:632 +#: receivelog.c:638 #, c-format msgid "" "server stopped streaming timeline %u at %X/%X, but reported next timeline %u " @@ -2656,12 +2676,12 @@ "сервер прекратил передачу линии времени %u в %X/%X, но сообщил, что " "следующая линии времени %u начнётся в %X/%X" -#: receivelog.c:672 +#: receivelog.c:678 #, c-format msgid "replication stream was terminated before stop point" msgstr "поток репликации закончился до точки остановки" -#: receivelog.c:718 +#: receivelog.c:724 #, c-format msgid "" "unexpected result set after end-of-timeline: got %d rows and %d fields, " @@ -2670,32 +2690,32 @@ "сервер вернул неожиданный набор данных после конца линии времени; получено " "строк: %d, полей: %d, а ожидалось строк: %d, полей: %d" -#: receivelog.c:727 +#: receivelog.c:733 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "не удалось разобрать начальную точку следующей линии времени \"%s\"" -#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 +#: receivelog.c:781 receivelog.c:1028 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "не удалось синхронизировать с ФС файл \"%s\": %s" -#: receivelog.c:1083 +#: receivelog.c:1089 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "получена запись журнала предзаписи по смещению %u, но файл не открыт" -#: receivelog.c:1093 +#: receivelog.c:1099 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "получено смещение данных WAL %08x, но ожидалось %08x" -#: receivelog.c:1128 +#: receivelog.c:1134 #, c-format msgid "could not write %d bytes to WAL file \"%s\": %s" msgstr "не удалось записать %d Б в файл WAL \"%s\": %s" -#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222 +#: receivelog.c:1159 receivelog.c:1199 receivelog.c:1228 #, c-format msgid "could not send copy-end packet: %s" msgstr "не удалось отправить пакет \"конец COPY\": %s" @@ -2776,7 +2796,7 @@ "не удалось идентифицировать систему; получено строк: %d, полей: %d " "(ожидалось: %d и %d (или более))" -#: streamutil.c:590 +#: streamutil.c:591 #, c-format msgid "" "could not read replication slot \"%s\": got %d rows and %d fields, expected " @@ -2785,23 +2805,23 @@ "прочитать из слота репликации \"%s\" не удалось; получено строк: %d, полей: " "%d (ожидалось: %d и %d)" -#: streamutil.c:602 +#: streamutil.c:603 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "слот репликации \"%s\" не существует" -#: streamutil.c:613 +#: streamutil.c:614 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "ожидался слот физической репликации, вместо этого получен тип \"%s\"" -#: streamutil.c:627 +#: streamutil.c:628 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "" "не удалось разобрать позицию restart_lsn \"%s\" для слота репликации \"%s\"" -#: streamutil.c:744 +#: streamutil.c:749 #, c-format msgid "" "could not create replication slot \"%s\": got %d rows and %d fields, " @@ -2810,7 +2830,7 @@ "создать слот репликации \"%s\" не удалось; получено строк: %d, полей: %d " "(ожидалось: %d и %d)" -#: streamutil.c:788 +#: streamutil.c:793 #, c-format msgid "" "could not drop replication slot \"%s\": got %d rows and %d fields, expected " @@ -2899,9 +2919,6 @@ #~ msgstr "" #~ " -Z, --compress=0-9 установить уровень сжатия выходного архива\n" -#~ msgid "invalid tar block header size: %zu" -#~ msgstr "неверный размер заголовка блока tar: %zu" - #~ msgid "unrecognized link indicator \"%c\"" #~ msgstr "нераспознанный индикатор связи \"%c\"" diff -Nru postgresql-17-17.10/src/bin/pg_basebackup/receivelog.c postgresql-17-17.11/src/bin/pg_basebackup/receivelog.c --- postgresql-17-17.10/src/bin/pg_basebackup/receivelog.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_basebackup/receivelog.c 2026-08-10 20:54:09.000000000 +0000 @@ -452,8 +452,7 @@ bool ReceiveXlogStream(PGconn *conn, StreamCtl *stream) { - char query[128]; - char slotcmd[128]; + PQExpBuffer query; PGresult *res; XLogRecPtr stoppos; @@ -478,7 +477,6 @@ if (stream->replication_slot != NULL) { reportFlushPosition = true; - sprintf(slotcmd, "SLOT \"%s\" ", stream->replication_slot); } else { @@ -486,7 +484,6 @@ reportFlushPosition = true; else reportFlushPosition = false; - slotcmd[0] = 0; } if (stream->sysidentifier != NULL) @@ -535,8 +532,10 @@ */ 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 */ @@ -572,11 +571,18 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_basebackup/streamutil.c postgresql-17-17.11/src/bin/pg_basebackup/streamutil.c --- postgresql-17-17.10/src/bin/pg_basebackup/streamutil.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_basebackup/streamutil.c 2026-08-10 20:54:09.000000000 +0000 @@ -572,7 +572,8 @@ *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); @@ -668,13 +669,17 @@ 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) @@ -770,8 +775,8 @@ 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) { @@ -800,6 +805,29 @@ } /* + * 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. * @@ -807,10 +835,13 @@ * 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] != '(') { @@ -831,30 +862,26 @@ */ 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 -Nru postgresql-17-17.10/src/bin/pg_basebackup/streamutil.h postgresql-17-17.11/src/bin/pg_basebackup/streamutil.h --- postgresql-17-17.10/src/bin/pg_basebackup/streamutil.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_basebackup/streamutil.h 2026-08-10 20:54:09.000000000 +0000 @@ -44,15 +44,20 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_checksums/po/de.po postgresql-17-17.11/src/bin/pg_checksums/po/de.po --- postgresql-17-17.10/src/bin/pg_checksums/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_checksums/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\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-07 09:34+0000\n" "PO-Revision-Date: 2024-03-19 21:17+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -92,17 +92,27 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" diff -Nru postgresql-17-17.10/src/bin/pg_checksums/po/ru.po postgresql-17-17.11/src/bin/pg_checksums/po/ru.po --- postgresql-17-17.10/src/bin/pg_checksums/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_checksums/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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: 2024-09-02 09:29+0300\n" -"PO-Revision-Date: 2024-09-04 13:35+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" diff -Nru postgresql-17-17.10/src/bin/pg_combinebackup/Makefile postgresql-17-17.11/src/bin/pg_combinebackup/Makefile --- postgresql-17-17.10/src/bin/pg_combinebackup/Makefile 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_combinebackup/Makefile 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/bin/pg_combinebackup/meson.build postgresql-17-17.11/src/bin/pg_combinebackup/meson.build --- postgresql-17-17.10/src/bin/pg_combinebackup/meson.build 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_combinebackup/meson.build 2026-08-10 20:54:09.000000000 +0000 @@ -38,6 +38,7 @@ 't/008_promote.pl', 't/009_no_full_file.pl', 't/011_ib_truncation.pl', + 't/012_vm_consistency.pl', ], } } diff -Nru postgresql-17-17.10/src/bin/pg_combinebackup/po/de.po postgresql-17-17.11/src/bin/pg_combinebackup/po/de.po --- postgresql-17-17.10/src/bin/pg_combinebackup/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_combinebackup/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,7 +6,7 @@ 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:39+0000\n" +"POT-Creation-Date: 2026-08-07 09:32+0000\n" "PO-Revision-Date: 2024-11-07 15:31+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -53,7 +53,7 @@ #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 -#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:742 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:745 #: write_manifest.c:187 #, c-format msgid "could not close file \"%s\": %m" @@ -88,7 +88,7 @@ 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" @@ -119,17 +119,27 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -165,99 +175,99 @@ msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" -#: ../../common/jsonapi.c:2124 +#: ../../common/jsonapi.c:2175 msgid "Recursive descent parser cannot use incremental lexer." msgstr "Parser mit rekursivem Abstieg kann inkrementellen Lexer nicht benutzen." -#: ../../common/jsonapi.c:2126 +#: ../../common/jsonapi.c:2177 msgid "Incremental parser requires incremental lexer." msgstr "Inkrementeller Parser benötigt inkrementellen Lexer." -#: ../../common/jsonapi.c:2128 +#: ../../common/jsonapi.c:2179 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSON zu tief geschachtelt, maximale erlaubte Tiefe ist 6400." -#: ../../common/jsonapi.c:2130 +#: ../../common/jsonapi.c:2181 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Escape-Sequenz »\\%.*s« ist nicht gültig." -#: ../../common/jsonapi.c:2134 +#: ../../common/jsonapi.c:2185 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../../common/jsonapi.c:2138 +#: ../../common/jsonapi.c:2189 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ende der Eingabe erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2141 +#: ../../common/jsonapi.c:2192 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Array-Element oder »]« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2144 +#: ../../common/jsonapi.c:2195 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "»,« oder »]« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2147 +#: ../../common/jsonapi.c:2198 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "»:« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2150 +#: ../../common/jsonapi.c:2201 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON-Wert erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2153 +#: ../../common/jsonapi.c:2204 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../../common/jsonapi.c:2155 +#: ../../common/jsonapi.c:2206 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Zeichenkette oder »}« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2158 +#: ../../common/jsonapi.c:2209 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "»,« oder »}« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2161 +#: ../../common/jsonapi.c:2212 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Zeichenkette erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2164 +#: ../../common/jsonapi.c:2215 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Token »%.*s« ist ungültig." -#: ../../common/jsonapi.c:2167 +#: ../../common/jsonapi.c:2218 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../../common/jsonapi.c:2169 +#: ../../common/jsonapi.c:2220 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../../common/jsonapi.c:2172 +#: ../../common/jsonapi.c:2223 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:2181 +#: ../../common/jsonapi.c:2232 #, 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:2188 +#: ../../common/jsonapi.c:2239 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen." -#: ../../common/jsonapi.c:2190 +#: ../../common/jsonapi.c:2241 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen." @@ -463,13 +473,13 @@ 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:146 copy_file.c:193 reconstruct.c:723 -#: reconstruct.c:769 write_manifest.c:270 +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 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" @@ -484,7 +494,7 @@ 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:199 reconstruct.c:786 +#: copy_file.c:199 reconstruct.c:789 #, c-format msgid "could not read from file \"%s\": %m" msgstr "konnte nicht aus Datei »%s« lesen: %m" @@ -514,7 +524,7 @@ 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:285 pg_combinebackup.c:264 reconstruct.c:726 +#: copy_file.c:285 pg_combinebackup.c:264 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" @@ -898,7 +908,12 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_combinebackup/po/ja.po postgresql-17-17.11/src/bin/pg_combinebackup/po/ja.po --- postgresql-17-17.10/src/bin/pg_combinebackup/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_combinebackup/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: pg_combinebackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-05 09:21+0900\n" -"PO-Revision-Date: 2024-11-05 09:28+0900\n" +"POT-Creation-Date: 2026-06-30 09:57+0900\n" +"PO-Revision-Date: 2026-06-30 12:00+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: \n" "Language: ja\n" @@ -17,22 +17,22 @@ "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:279 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:286 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:297 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:304 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "ヒント: " @@ -43,7 +43,7 @@ msgstr "ファイル\"%s\"を読み込み用にオープンできませんでした: %m" #: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 -#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:542 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"の読み込みに失敗しました: %m" @@ -55,8 +55,8 @@ #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 -#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 -#: write_manifest.c:188 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:745 +#: write_manifest.c:187 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズできませんでした: %m" @@ -78,32 +78,31 @@ "されるものと一致しないようです。この場合以下の結果は不正確になります。また、\n" "PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。" -#: ../../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 backup_label.c:143 copy_file.c:66 +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 backup_label.c:143 copy_file.c:66 #: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 #: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 -#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 -#: write_manifest.c:251 +#: pg_combinebackup.c:1167 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 -#: write_manifest.c:261 +#: ../../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" msgstr "ファイル\"%s\"を書き出せませんでした: %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:418 +#: ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"をfsyncできませんでした: %m" #: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 -#: ../../common/jsonapi.c:2317 ../../common/parse_manifest.c:157 -#: ../../common/parse_manifest.c:853 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 #, c-format msgid "out of memory" msgstr "メモリ不足です" @@ -121,305 +120,311 @@ 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/file_utils.c:77 +#: ../../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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "ファイル\"%s\"に対してファイルシステムを同期できませんでした: %m" -#: ../../common/file_utils.c:121 ../../common/file_utils.c:567 +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 #: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 -#: reconstruct.c:421 +#: reconstruct.c:422 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" -#: ../../common/file_utils.c:131 ../../common/file_utils.c:228 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 #: ../../fe_utils/option_utils.c:99 #, c-format msgid "this build does not support sync method \"%s\"" msgstr "このビルドでは同期方式\"%s\"をサポートしていません" -#: ../../common/file_utils.c:152 ../../common/file_utils.c:282 +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 #: pg_combinebackup.c:933 pg_combinebackup.c:1256 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: ../../common/file_utils.c:170 ../../common/file_utils.c:316 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" -#: ../../common/file_utils.c:499 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" -#: ../../common/jsonapi.c:2342 +#: ../../common/jsonapi.c:2175 msgid "Recursive descent parser cannot use incremental lexer." msgstr "再帰降下パーサーは差分字句解析器を使用できません。" -#: ../../common/jsonapi.c:2344 +#: ../../common/jsonapi.c:2177 msgid "Incremental parser requires incremental lexer." msgstr "差分パーサーは差分字句解析器を必要とします。" -#: ../../common/jsonapi.c:2346 +#: ../../common/jsonapi.c:2179 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSONのネストが深すぎます、可能な最大の深さは6400です。" -#: ../../common/jsonapi.c:2348 +#: ../../common/jsonapi.c:2181 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "エスケープシーケンス\"\\%.*s\"は不正です。" -#: ../../common/jsonapi.c:2352 +#: ../../common/jsonapi.c:2185 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../../common/jsonapi.c:2356 +#: ../../common/jsonapi.c:2189 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "入力の終端を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2359 +#: ../../common/jsonapi.c:2192 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "配列要素または\"]\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2362 +#: ../../common/jsonapi.c:2195 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "\",\"または\"]\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2365 +#: ../../common/jsonapi.c:2198 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "\":\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2368 +#: ../../common/jsonapi.c:2201 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON値を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2371 +#: ../../common/jsonapi.c:2204 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../../common/jsonapi.c:2373 +#: ../../common/jsonapi.c:2206 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "文字列または\"}\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2376 +#: ../../common/jsonapi.c:2209 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "\",\"または\"}\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2379 +#: ../../common/jsonapi.c:2212 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "文字列を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2382 +#: ../../common/jsonapi.c:2215 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "トークン\"\\%.*s\"は不正です。" -#: ../../common/jsonapi.c:2388 +#: ../../common/jsonapi.c:2218 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../../common/jsonapi.c:2390 +#: ../../common/jsonapi.c:2220 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../../common/jsonapi.c:2393 +#: ../../common/jsonapi.c:2223 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:2402 +#: ../../common/jsonapi.c:2232 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicodeエスケープの値がサーバーエンコーディング%sに変換できませんでした。" -#: ../../common/jsonapi.c:2409 +#: ../../common/jsonapi.c:2239 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../../common/jsonapi.c:2411 +#: ../../common/jsonapi.c:2241 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodeのローサロゲートはハイサロゲートに続かなければなりません。" -#: ../../common/jsonapi.c:2433 -msgid "out of memory while constructing error description" -msgstr "エラー記述の構築中にメモリ不足" - -#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 #, c-format msgid "could not initialize checksum of manifest" msgstr "目録のチェックサムの初期化ができませんでした" -#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 msgid "manifest ended unexpectedly" msgstr "目録が予期せず終了しました。" -#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 #, c-format msgid "could not update checksum of manifest" msgstr "目録のチェックサムの更新ができませんでした" -#: ../../common/parse_manifest.c:302 +#: ../../common/parse_manifest.c:301 msgid "unexpected object start" msgstr "予期しないオブジェクトの開始" -#: ../../common/parse_manifest.c:337 +#: ../../common/parse_manifest.c:336 msgid "unexpected object end" msgstr "予期しないオブジェクトの終わり" -#: ../../common/parse_manifest.c:366 +#: ../../common/parse_manifest.c:365 msgid "unexpected array start" msgstr "予期しない配列の開始" -#: ../../common/parse_manifest.c:391 +#: ../../common/parse_manifest.c:390 msgid "unexpected array end" msgstr "予期しない配列の終わり" -#: ../../common/parse_manifest.c:418 +#: ../../common/parse_manifest.c:417 msgid "expected version indicator" msgstr "バージョン指示子を想定していました" -#: ../../common/parse_manifest.c:454 +#: ../../common/parse_manifest.c:453 msgid "unrecognized top-level field" msgstr "認識できないトップレベルフィールド" -#: ../../common/parse_manifest.c:473 +#: ../../common/parse_manifest.c:472 msgid "unexpected file field" msgstr "予期しないファイルフィールド" -#: ../../common/parse_manifest.c:487 +#: ../../common/parse_manifest.c:486 msgid "unexpected WAL range field" msgstr "予期しないWAL範囲フィールド" -#: ../../common/parse_manifest.c:493 +#: ../../common/parse_manifest.c:492 msgid "unexpected object field" msgstr "予期しないオブジェクトフィールド" -#: ../../common/parse_manifest.c:583 +#: ../../common/parse_manifest.c:582 msgid "unexpected scalar" msgstr "予期しないスカラー" -#: ../../common/parse_manifest.c:609 +#: ../../common/parse_manifest.c:608 msgid "manifest version not an integer" msgstr "目録バージョンが整数ではありません" -#: ../../common/parse_manifest.c:613 +#: ../../common/parse_manifest.c:612 msgid "unexpected manifest version" msgstr "予期しない目録バージョン" -#: ../../common/parse_manifest.c:637 +#: ../../common/parse_manifest.c:636 msgid "system identifier in manifest not an integer" msgstr "目録中のシステム識別子が整数ではありません" -#: ../../common/parse_manifest.c:662 +#: ../../common/parse_manifest.c:661 msgid "missing path name" msgstr "パス名がありません" -#: ../../common/parse_manifest.c:665 +#: ../../common/parse_manifest.c:664 msgid "both path name and encoded path name" msgstr "パス名とエンコードされたパス名の両方" -#: ../../common/parse_manifest.c:667 +#: ../../common/parse_manifest.c:666 msgid "missing size" msgstr "サイズがありません" -#: ../../common/parse_manifest.c:670 +#: ../../common/parse_manifest.c:669 msgid "checksum without algorithm" msgstr "アルゴリズムなしのチェックサム" -#: ../../common/parse_manifest.c:684 +#: ../../common/parse_manifest.c:683 msgid "could not decode file name" msgstr "ファイル名をデコードできませんでした" -#: ../../common/parse_manifest.c:694 +#: ../../common/parse_manifest.c:693 msgid "file size is not an integer" msgstr "ファイルサイズが整数ではありません" -#: ../../common/parse_manifest.c:700 pg_combinebackup.c:199 +#: ../../common/parse_manifest.c:699 pg_combinebackup.c:199 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "認識できないチェックサムアルゴリズム: \"%s\"" -#: ../../common/parse_manifest.c:719 +#: ../../common/parse_manifest.c:718 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "\"%s\" ファイルのチェックサムが無効: \"%s\"" -#: ../../common/parse_manifest.c:762 +#: ../../common/parse_manifest.c:761 msgid "missing timeline" msgstr "タイムラインがありません" -#: ../../common/parse_manifest.c:764 +#: ../../common/parse_manifest.c:763 msgid "missing start LSN" msgstr "開始LSNがありません" -#: ../../common/parse_manifest.c:766 +#: ../../common/parse_manifest.c:765 msgid "missing end LSN" msgstr "終了LSNがありません" -#: ../../common/parse_manifest.c:772 +#: ../../common/parse_manifest.c:771 msgid "timeline is not an integer" msgstr "タイムラインが整数ではありません" -#: ../../common/parse_manifest.c:775 +#: ../../common/parse_manifest.c:774 msgid "could not parse start LSN" msgstr "開始LSNをパースできませんでした" -#: ../../common/parse_manifest.c:778 +#: ../../common/parse_manifest.c:777 msgid "could not parse end LSN" msgstr "終了LSNをパースできませんでした" -#: ../../common/parse_manifest.c:843 +#: ../../common/parse_manifest.c:842 msgid "expected at least 2 lines" msgstr "少なくとも2行が必要です" -#: ../../common/parse_manifest.c:846 +#: ../../common/parse_manifest.c:845 msgid "last line not newline-terminated" msgstr "最後の行が改行で終わっていません" -#: ../../common/parse_manifest.c:865 +#: ../../common/parse_manifest.c:864 #, c-format msgid "could not finalize checksum of manifest" msgstr "目録のチェックサムの完了ができませんでした" -#: ../../common/parse_manifest.c:869 +#: ../../common/parse_manifest.c:868 #, c-format msgid "manifest has no checksum" msgstr "目録にチェックサムがありません" -#: ../../common/parse_manifest.c:873 +#: ../../common/parse_manifest.c:872 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "無効な目録チェックサム: \"%s\"" -#: ../../common/parse_manifest.c:877 +#: ../../common/parse_manifest.c:876 #, c-format msgid "manifest checksum mismatch" msgstr "目録チェックサムの不一致" -#: ../../common/parse_manifest.c:892 +#: ../../common/parse_manifest.c:891 #, c-format msgid "could not parse backup manifest: %s" msgstr "バックアップ目録をパースできませんでした: %s" @@ -469,13 +474,13 @@ msgid "%s: %s requires %s" msgstr "%s: %sは%sを必要とします" -#: backup_label.c:162 reconstruct.c:761 write_manifest.c:263 +#: 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:146 copy_file.c:193 reconstruct.c:721 -#: reconstruct.c:767 write_manifest.c:271 +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:726 +#: reconstruct.c:772 write_manifest.c:270 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "ファイル\"%s\"のチェックサムの更新ができませんでした" @@ -490,7 +495,7 @@ 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:199 reconstruct.c:784 +#: copy_file.c:199 reconstruct.c:789 #, c-format msgid "could not read from file \"%s\": %m" msgstr "ファイル\"%s\"から読み取れませんでした: %m" @@ -515,12 +520,12 @@ msgid "file cloning not supported on this platform" msgstr "このプラットフォームではファイルのクローンはサポートされません" -#: copy_file.c:278 reconstruct.c:704 +#: copy_file.c:278 reconstruct.c:706 #, c-format msgid "error while copying file range from \"%s\" to \"%s\": %m" msgstr "\"%s\"の\"%s\"へのファイル範囲のコピー中のエラー: %m" -#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:729 #, c-format msgid "copy_file_range not supported on this platform" msgstr "このプラットフォームではcopy_file_rangeはサポートされません" @@ -545,12 +550,12 @@ msgid "could not read file \"%s\": read %lld of %lld" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$lldバイトのうち%2$lldバイトを読み込みました" -#: load_manifest.c:249 +#: load_manifest.c:248 #, c-format msgid "backup manifest version 1 does not support incremental backup" msgstr "バックアップ目録のバージョン1は差分バックアップをサポートしていません" -#: load_manifest.c:281 +#: load_manifest.c:280 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "バックアップ目録内の重複パス名: \"%s\"" @@ -605,11 +610,16 @@ msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "テーブル空間のマッピング形式\"%s\"が不正です。\"旧DIR=新DIR\"でなければなりません" -#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#: pg_combinebackup.c:480 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "テーブル空間のマッピングにおいて、旧ディレクトリが絶対パスではありません: %s" +#: pg_combinebackup.c:484 +#, c-format +msgid "new directory is not an absolute path in tablespace mapping: %s" +msgstr "テーブル空間のマッピングにおいて、新ディレクトリが絶対パスではありません: %s" + #: pg_combinebackup.c:553 #, c-format msgid "backup at \"%s\" is a full backup, but only the first backup should be a full backup" @@ -872,32 +882,40 @@ 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" + +#~ msgid "out of memory while constructing error description" +#~ msgstr "エラー記述の構築中にメモリ不足" diff -Nru postgresql-17-17.10/src/bin/pg_combinebackup/po/ru.po postgresql-17-17.11/src/bin/pg_combinebackup/po/ru.po --- postgresql-17-17.10/src/bin/pg_combinebackup/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_combinebackup/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: pg_combinebackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-10 08:01+0300\n" -"PO-Revision-Date: 2026-02-07 09:22+0200\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ #: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 -#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:742 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:745 #: write_manifest.c:187 #, c-format msgid "could not close file \"%s\": %m" @@ -88,7 +88,7 @@ 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" @@ -119,17 +119,27 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" @@ -474,13 +484,13 @@ 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:146 copy_file.c:193 reconstruct.c:723 -#: reconstruct.c:769 write_manifest.c:270 +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:726 +#: reconstruct.c:772 write_manifest.c:270 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "не удалось изменить контекст контрольной суммы файла \"%s\"" @@ -496,7 +506,7 @@ msgstr "" "не удалось записать в файл \"%s\" (смещение %u, записано байт: %d из %d)" -#: copy_file.c:199 reconstruct.c:786 +#: copy_file.c:199 reconstruct.c:789 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" @@ -526,7 +536,7 @@ msgid "error while copying file range from \"%s\" to \"%s\": %m" msgstr "ошибка при копировании фрагмента файла \"%s\" в \"%s\": %m" -#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:726 +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:729 #, c-format msgid "copy_file_range not supported on this platform" msgstr "copy_file_range не поддерживается в этой ОС" @@ -944,7 +954,13 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_combinebackup/reconstruct.c postgresql-17-17.11/src/bin/pg_combinebackup/reconstruct.c --- postgresql-17-17.10/src/bin/pg_combinebackup/reconstruct.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_combinebackup/reconstruct.c 2026-08-10 20:54:09.000000000 +0000 @@ -705,6 +705,9 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_combinebackup/t/012_vm_consistency.pl postgresql-17-17.11/src/bin/pg_combinebackup/t/012_vm_consistency.pl --- postgresql-17-17.10/src/bin/pg_combinebackup/t/012_vm_consistency.pl 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_combinebackup/t/012_vm_consistency.pl 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/bin/pg_config/po/de.po postgresql-17-17.11/src/bin/pg_config/po/de.po --- postgresql-17-17.10/src/bin/pg_config/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_config/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ 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-07 09:29+0000\n" "PO-Revision-Date: 2024-03-26 10:37+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -67,17 +67,27 @@ 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" + #: pg_config.c:74 #, c-format msgid "" diff -Nru postgresql-17-17.10/src/bin/pg_config/po/ru.po postgresql-17-17.11/src/bin/pg_config/po/ru.po --- postgresql-17-17.10/src/bin/pg_config/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_config/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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: 2024-09-02 09:29+0300\n" -"PO-Revision-Date: 2024-09-04 13:45+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:74 #, c-format msgid "" diff -Nru postgresql-17-17.10/src/bin/pg_controldata/po/de.po postgresql-17-17.11/src/bin/pg_controldata/po/de.po --- postgresql-17-17.10/src/bin/pg_controldata/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_controldata/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-06-16 07:53+0000\n" +"POT-Creation-Date: 2026-08-07 09:33+0000\n" "PO-Revision-Date: 2024-05-17 13:06+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -70,17 +70,27 @@ 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 "" @@ -183,326 +193,327 @@ msgid "unrecognized \"wal_level\"" msgstr "unbekanntes »wal_level«" -#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 +#: pg_controldata.c:139 pg_controldata.c:157 pg_controldata.c:164 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_controldata.c:154 +#: pg_controldata.c:155 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_controldata.c:162 +#: pg_controldata.c:163 #, c-format msgid "no data directory specified" msgstr "kein Datenverzeichnis angegeben" -#: pg_controldata.c:171 +#: pg_controldata.c:172 #, c-format msgid "calculated CRC checksum does not match value stored in control file" msgstr "berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in der Kontrolldatei überein" -#: pg_controldata.c:172 +#: pg_controldata.c:173 #, c-format msgid "Either the control file is corrupt, or it has a different layout than this program is expecting. The results below are untrustworthy." msgstr "Entweder ist die Kontrolldatei kaputt oder sie hat ein anderes Layout als von diesem Programm erwartet. Die Ergebnisse unten sind nicht verlässlich." -#: pg_controldata.c:181 +#: pg_controldata.c:182 #, c-format msgid "invalid WAL segment size in control file (%d byte)" msgid_plural "invalid WAL segment size in control file (%d bytes)" msgstr[0] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Byte)" msgstr[1] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Bytes)" -#: pg_controldata.c:185 +#: pg_controldata.c:186 #, c-format 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." -#: pg_controldata.c:186 +#: pg_controldata.c:187 #, c-format msgid "The file is corrupt and the results below are untrustworthy." msgstr "Die Datei ist kaputt und die Ergebnisse unten sind nicht verlässlich." -#: pg_controldata.c:221 +#: pg_controldata.c:205 pg_controldata.c:213 pg_controldata.c:232 +#, c-format msgid "???" msgstr "???" -#: pg_controldata.c:227 +#: pg_controldata.c:238 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control-Versionsnummer: %u\n" -#: pg_controldata.c:229 +#: pg_controldata.c:240 #, c-format msgid "Catalog version number: %u\n" msgstr "Katalogversionsnummer: %u\n" -#: pg_controldata.c:231 +#: pg_controldata.c:242 #, c-format msgid "Database system identifier: %llu\n" msgstr "Datenbanksystemidentifikation: %llu\n" -#: pg_controldata.c:233 +#: pg_controldata.c:244 #, c-format msgid "Database cluster state: %s\n" msgstr "Datenbank-Cluster-Status: %s\n" -#: pg_controldata.c:235 +#: pg_controldata.c:246 #, c-format msgid "pg_control last modified: %s\n" msgstr "pg_control zuletzt geändert: %s\n" -#: pg_controldata.c:237 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "Position des letzten Checkpoints: %X/%X\n" -#: pg_controldata.c:239 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "REDO-Position des letzten Checkpoints: %X/%X\n" -#: pg_controldata.c:241 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "REDO-WAL-Datei des letzten Checkpoints: %s\n" -#: pg_controldata.c:243 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID des letzten Checkpoints: %u\n" -#: pg_controldata.c:245 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "PrevTimeLineID des letzten Checkpoints: %u\n" -#: pg_controldata.c:247 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "full_page_writes des letzten Checkpoints: %s\n" -#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 +#: pg_controldata.c:259 pg_controldata.c:300 pg_controldata.c:312 msgid "off" msgstr "aus" -#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 +#: pg_controldata.c:259 pg_controldata.c:300 pg_controldata.c:312 msgid "on" msgstr "an" -#: pg_controldata.c:249 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID des letzten Checkpoints: %u:%u\n" -#: pg_controldata.c:252 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID des letzten Checkpoints: %u\n" -#: pg_controldata.c:254 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId des letzten Checkpoints: %u\n" -#: pg_controldata.c:256 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset des letzten Checkpoints: %u\n" -#: pg_controldata.c:258 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID des letzten Checkpoints: %u\n" -#: pg_controldata.c:260 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "DB der oldestXID des letzten Checkpoints: %u\n" -#: pg_controldata.c:262 +#: pg_controldata.c:273 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID des letzten Checkpoints: %u\n" -#: pg_controldata.c:264 +#: pg_controldata.c:275 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid des letzten Checkpoints: %u\n" -#: pg_controldata.c:266 +#: pg_controldata.c:277 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "DB des oldestMulti des letzten Checkpoints: %u\n" -#: pg_controldata.c:268 +#: pg_controldata.c:279 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_controldata.c:270 +#: pg_controldata.c:281 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_controldata.c:272 +#: pg_controldata.c:283 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Zeit des letzten Checkpoints: %s\n" -#: pg_controldata.c:274 +#: pg_controldata.c:285 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Fake-LSN-Zähler für ungeloggte Relationen: %X/%X\n" -#: pg_controldata.c:276 +#: pg_controldata.c:287 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Minimaler Wiederherstellungsendpunkt: %X/%X\n" -#: pg_controldata.c:278 +#: pg_controldata.c:289 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Zeitleiste des minimalen Wiederherstellungsendpunkts: %u\n" -#: pg_controldata.c:280 +#: pg_controldata.c:291 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Backup-Startpunkt: %X/%X\n" -#: pg_controldata.c:282 +#: pg_controldata.c:293 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Backup-Endpunkt: %X/%X\n" -#: pg_controldata.c:284 +#: pg_controldata.c:295 #, c-format msgid "End-of-backup record required: %s\n" msgstr "End-of-Backup-Eintrag erforderlich: %s\n" -#: pg_controldata.c:285 +#: pg_controldata.c:296 msgid "no" msgstr "nein" -#: pg_controldata.c:285 +#: pg_controldata.c:296 msgid "yes" msgstr "ja" -#: pg_controldata.c:286 +#: pg_controldata.c:297 #, c-format msgid "wal_level setting: %s\n" msgstr "wal_level-Einstellung: %s\n" -#: pg_controldata.c:288 +#: pg_controldata.c:299 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "wal_log_hints-Einstellung: %s\n" -#: pg_controldata.c:290 +#: pg_controldata.c:301 #, c-format msgid "max_connections setting: %d\n" msgstr "max_connections-Einstellung: %d\n" -#: pg_controldata.c:292 +#: pg_controldata.c:303 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "max_worker_processes-Einstellung: %d\n" -#: pg_controldata.c:294 +#: pg_controldata.c:305 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "max_wal_senders-Einstellung: %d\n" -#: pg_controldata.c:296 +#: pg_controldata.c:307 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "max_prepared_xacts-Einstellung: %d\n" -#: pg_controldata.c:298 +#: pg_controldata.c:309 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "max_locks_per_xact-Einstellung: %d\n" -#: pg_controldata.c:300 +#: pg_controldata.c:311 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "track_commit_timestamp-Einstellung: %s\n" -#: pg_controldata.c:302 +#: pg_controldata.c:313 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Maximale Datenausrichtung (Alignment): %u\n" -#: pg_controldata.c:305 +#: pg_controldata.c:316 #, c-format msgid "Database block size: %u\n" msgstr "Datenbankblockgröße: %u\n" -#: pg_controldata.c:307 +#: pg_controldata.c:318 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Blöcke pro Segment: %u\n" -#: pg_controldata.c:309 +#: pg_controldata.c:320 #, c-format msgid "WAL block size: %u\n" msgstr "WAL-Blockgröße: %u\n" -#: pg_controldata.c:311 +#: pg_controldata.c:322 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Bytes pro WAL-Segment: %u\n" -#: pg_controldata.c:313 +#: pg_controldata.c:324 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Maximale Bezeichnerlänge: %u\n" -#: pg_controldata.c:315 +#: pg_controldata.c:326 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Maximale Spalten in einem Index: %u\n" -#: pg_controldata.c:317 +#: pg_controldata.c:328 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Maximale Größe eines Stücks TOAST: %u\n" -#: pg_controldata.c:319 +#: pg_controldata.c:330 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Größe eines Large-Object-Chunks: %u\n" -#: pg_controldata.c:322 +#: pg_controldata.c:333 #, c-format msgid "Date/time type storage: %s\n" msgstr "Speicherung von Datum/Zeit-Typen: %s\n" -#: pg_controldata.c:323 +#: pg_controldata.c:334 msgid "64-bit integers" msgstr "64-Bit-Ganzzahlen" -#: pg_controldata.c:324 +#: pg_controldata.c:335 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Übergabe von Float8-Argumenten: %s\n" -#: pg_controldata.c:325 +#: pg_controldata.c:336 msgid "by reference" msgstr "Referenz" -#: pg_controldata.c:325 +#: pg_controldata.c:336 msgid "by value" msgstr "Wert" -#: pg_controldata.c:326 +#: pg_controldata.c:337 #, c-format msgid "Data page checksum version: %u\n" msgstr "Datenseitenprüfsummenversion: %u\n" -#: pg_controldata.c:328 +#: pg_controldata.c:339 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Mock-Authentifizierungs-Nonce: %s\n" diff -Nru postgresql-17-17.10/src/bin/pg_controldata/po/ru.po postgresql-17-17.11/src/bin/pg_controldata/po/ru.po --- postgresql-17-17.10/src/bin/pg_controldata/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_controldata/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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-02-08 07:44+0200\n" -"PO-Revision-Date: 2024-09-04 17:08+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_ctl/po/de.po postgresql-17-17.11/src/bin/pg_ctl/po/de.po --- postgresql-17-17.10/src/bin/pg_ctl/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_ctl/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ 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-07 09:29+0000\n" "PO-Revision-Date: 2024-03-26 10:59+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -64,18 +64,28 @@ 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: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:847 ../../port/path.c:884 ../../port/path.c:901 #, 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 @@ msgid "child process exited with unrecognized status %d" msgstr "Kindprozess hat mit unbekanntem Status %d beendet" -#: ../../port/path.c:775 +#: ../../port/path.c:869 #, c-format msgid "could not get current working directory: %m\n" msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %m\n" diff -Nru postgresql-17-17.10/src/bin/pg_ctl/po/ja.po postgresql-17-17.11/src/bin/pg_ctl/po/ja.po --- postgresql-17-17.10/src/bin/pg_ctl/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_ctl/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -11,8 +11,8 @@ 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:47+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" @@ -70,18 +70,28 @@ 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:847 ../../port/path.c:884 ../../port/path.c:901 #, 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,127 +122,123 @@ msgid "child process exited with unrecognized status %d" msgstr "子プロセスが未知のステータス%dで終了しました" -#: ../../port/path.c:775 +#: ../../port/path.c:869 #, c-format msgid "could not get current working directory: %m\n" msgstr "現在の作業ディレクトリを取得できませんでした: %m\n" -#: pg_ctl.c:255 +#: pg_ctl.c:254 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: ディレクトリ \"%s\" は存在しません\n" -#: pg_ctl.c:258 +#: pg_ctl.c:257 #, c-format msgid "%s: could not access directory \"%s\": %m\n" msgstr "%s: ディレクトリ\"%s\"にアクセスできませんでした: %m\n" -#: pg_ctl.c:271 +#: pg_ctl.c:270 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: ディレクトリ\"%s\"はデータベースクラスタディレクトリではありません\n" -#: pg_ctl.c:284 +#: pg_ctl.c:283 #, c-format msgid "%s: could not open PID file \"%s\": %m\n" msgstr "%s: PIDファイル\"%s\"をオープンできませんでした: %m\n" -#: pg_ctl.c:293 +#: pg_ctl.c:292 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: PIDファイル\"%s\"が空です\n" -#: pg_ctl.c:296 +#: pg_ctl.c:295 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: PIDファイル\"%s\"内に無効なデータがあります\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:457 pg_ctl.c:499 #, c-format msgid "%s: could not start server: %m\n" msgstr "%s: サーバーを起動できませんでした: %m\n" -#: pg_ctl.c:478 +#: pg_ctl.c:477 #, c-format msgid "%s: could not start server due to setsid() failure: %m\n" msgstr "%s: setsid()に失敗したためサーバーを起動できませんでした: %m\n" -#: pg_ctl.c:548 +#: pg_ctl.c:547 #, c-format msgid "%s: could not open log file \"%s\": %m\n" msgstr "%s: ログファイル \"%s\" をオープンできませんでした: %m\n" -#: pg_ctl.c:565 +#: pg_ctl.c:564 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: サーバーの起動に失敗しました: エラーコード %lu\n" -#: pg_ctl.c:789 +#: pg_ctl.c:781 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s: コアファイルのサイズ制限を設定できません:固定の制限により許されていません\n" -#: pg_ctl.c:815 +#: pg_ctl.c:807 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: ファイル\"%s\"を読み取ることに失敗しました\n" -#: pg_ctl.c:820 +#: pg_ctl.c:812 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: オプションファイル\"%s\"は1行のみでなければなりません\n" -#: pg_ctl.c:862 pg_ctl.c:1050 pg_ctl.c:1117 +#: pg_ctl.c:854 pg_ctl.c:1038 pg_ctl.c:1105 #, c-format msgid "%s: could not send stop signal (PID: %d): %m\n" msgstr "%s: 停止シグナルを送信できませんでした。(PID: %d): %m\n" -#: pg_ctl.c:890 +#: pg_ctl.c:882 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" msgstr "%2$sにはプログラム\"%1$s\"が必要ですが、\"%3$s\"と同じディレクトリにありませんでした\n" -#: pg_ctl.c:893 +#: pg_ctl.c:885 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" msgstr "\"%2$s\"がプログラム\"%1$s\"を見つけましたが、これは%3$sと同じバージョンではありませんでした\n" -#: pg_ctl.c:925 +#: pg_ctl.c:917 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: データベースシステムが初期化に失敗しました\n" -#: pg_ctl.c:940 +#: pg_ctl.c:932 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: 他のサーバーが動作中の可能性がありますが、とにかくpostmasterの起動を試みます。\n" -#: pg_ctl.c:988 +#: pg_ctl.c:980 msgid "waiting for server to start..." msgstr "サーバーの起動完了を待っています..." -#: pg_ctl.c:993 pg_ctl.c:1003 pg_ctl.c:1073 pg_ctl.c:1135 pg_ctl.c:1247 +#: pg_ctl.c:985 pg_ctl.c:1061 pg_ctl.c:1123 pg_ctl.c:1235 msgid " done\n" msgstr "完了\n" -#: pg_ctl.c:994 +#: pg_ctl.c:986 msgid "server started\n" msgstr "サーバー起動完了\n" -#: pg_ctl.c:997 pg_ctl.c:1007 pg_ctl.c:1252 +#: pg_ctl.c:989 pg_ctl.c:995 pg_ctl.c:1240 msgid " stopped waiting\n" msgstr " 待機処理が停止されました\n" -#: pg_ctl.c:998 +#: pg_ctl.c:990 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: サーバーは時間内に起動しませんでした\n" -#: pg_ctl.c:1004 -msgid "server shut down because of recovery target settings\n" -msgstr "リカバリ目標設定によりシャットダウンしました\n" - -#: pg_ctl.c:1008 +#: pg_ctl.c:996 #, c-format msgid "" "%s: could not start server\n" @@ -241,42 +247,42 @@ "%s: サーバーを起動できませんでした。\n" "ログ出力を確認してください。\n" -#: pg_ctl.c:1016 +#: pg_ctl.c:1004 msgid "server starting\n" msgstr "サーバーは起動中です。\n" -#: pg_ctl.c:1035 pg_ctl.c:1093 pg_ctl.c:1156 pg_ctl.c:1195 pg_ctl.c:1276 +#: pg_ctl.c:1023 pg_ctl.c:1081 pg_ctl.c:1144 pg_ctl.c:1183 pg_ctl.c:1264 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: PIDファイル\"%s\"がありません\n" -#: pg_ctl.c:1036 pg_ctl.c:1095 pg_ctl.c:1157 pg_ctl.c:1196 pg_ctl.c:1277 +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1145 pg_ctl.c:1184 pg_ctl.c:1265 msgid "Is server running?\n" msgstr "サーバーが動作していますか?\n" -#: pg_ctl.c:1042 +#: pg_ctl.c:1030 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" msgstr "%s: サーバーを停止できません。シングルユーザーサーバー(PID: %d)が動作しています。\n" -#: pg_ctl.c:1056 +#: pg_ctl.c:1044 msgid "server shutting down\n" msgstr "サーバーの停止中です\n" -#: pg_ctl.c:1061 pg_ctl.c:1121 +#: pg_ctl.c:1049 pg_ctl.c:1109 msgid "waiting for server to shut down..." msgstr "サーバー停止処理の完了を待っています..." -#: pg_ctl.c:1065 pg_ctl.c:1126 +#: pg_ctl.c:1053 pg_ctl.c:1114 msgid " failed\n" msgstr "失敗しました\n" -#: pg_ctl.c:1067 pg_ctl.c:1128 +#: pg_ctl.c:1055 pg_ctl.c:1116 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: サーバーは停止していません\n" -#: pg_ctl.c:1069 pg_ctl.c:1130 +#: pg_ctl.c:1057 pg_ctl.c:1118 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -284,252 +290,252 @@ "ヒント: \"-m fast\"オプションは、セッション切断が始まるまで待機するのではなく\n" "即座にセッションを切断します。\n" -#: pg_ctl.c:1075 pg_ctl.c:1136 +#: pg_ctl.c:1063 pg_ctl.c:1124 msgid "server stopped\n" msgstr "サーバーは停止しました\n" -#: pg_ctl.c:1096 +#: pg_ctl.c:1084 msgid "trying to start server anyway\n" msgstr "とにかくサーバーの起動を試みます\n" -#: pg_ctl.c:1105 +#: pg_ctl.c:1093 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" msgstr "%s: サーバーを再起動できません。シングルユーザーサーバー(PID: %d)が動作中です。\n" -#: pg_ctl.c:1108 pg_ctl.c:1166 +#: pg_ctl.c:1096 pg_ctl.c:1154 msgid "Please terminate the single-user server and try again.\n" msgstr "シングルユーザーサーバーを終了させてから、再度実行してください\n" -#: pg_ctl.c:1140 +#: pg_ctl.c:1128 #, c-format msgid "%s: old server process (PID: %d) seems to be gone\n" msgstr "%s: 古いサーバープロセス(PID: %d)が動作していないようです\n" -#: pg_ctl.c:1142 +#: pg_ctl.c:1130 msgid "starting server anyway\n" msgstr "とにかくサーバーを起動しています\n" -#: pg_ctl.c:1163 +#: pg_ctl.c:1151 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" msgstr "%s: サーバーをリロードできません。シングルユーザーサーバー(PID: %d)が動作中です\n" -#: pg_ctl.c:1172 +#: pg_ctl.c:1160 #, c-format msgid "%s: could not send reload signal (PID: %d): %m\n" msgstr "%s: リロードシグナルを送信できませんでした。(PID: %d): %m\n" -#: pg_ctl.c:1177 +#: pg_ctl.c:1165 msgid "server signaled\n" msgstr "サーバーにシグナルを送信しました\n" -#: pg_ctl.c:1202 +#: pg_ctl.c:1190 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" msgstr "%s: サーバーを昇格できません; シングルユーザーサーバー(PID: %d)が動作中です\n" -#: pg_ctl.c:1210 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: サーバーを昇格できません; サーバーはスタンバイモードではありません\n" -#: pg_ctl.c:1220 +#: pg_ctl.c:1208 #, c-format msgid "%s: could not create promote signal file \"%s\": %m\n" msgstr "%s: 昇格指示ファイル\"%s\"を作成できませんでした: %m\n" -#: pg_ctl.c:1226 +#: pg_ctl.c:1214 #, c-format msgid "%s: could not write promote signal file \"%s\": %m\n" msgstr "%s: 昇格指示ファイル\"%s\"に書き込めませんでした: %m\n" -#: pg_ctl.c:1234 +#: pg_ctl.c:1222 #, c-format msgid "%s: could not send promote signal (PID: %d): %m\n" msgstr "%s: 昇格シグナルを送信できませんでした (PID: %d): %m\n" -#: pg_ctl.c:1237 +#: pg_ctl.c:1225 #, c-format msgid "%s: could not remove promote signal file \"%s\": %m\n" msgstr "%s: 昇格指示ファイル\"%s\"の削除に失敗しました: %m\n" -#: pg_ctl.c:1244 +#: pg_ctl.c:1232 msgid "waiting for server to promote..." msgstr "サーバーの昇格を待っています..." -#: pg_ctl.c:1248 +#: pg_ctl.c:1236 msgid "server promoted\n" msgstr "サーバーは昇格しました\n" -#: pg_ctl.c:1253 +#: pg_ctl.c:1241 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: サーバーは時間内に昇格しませんでした\n" -#: pg_ctl.c:1259 +#: pg_ctl.c:1247 msgid "server promoting\n" msgstr "サーバーを昇格中です\n" -#: pg_ctl.c:1283 +#: pg_ctl.c:1271 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" msgstr "%s: ログをローテートできません; シングルユーザーサーバーが動作中です (PID: %d)\n" -#: pg_ctl.c:1293 +#: pg_ctl.c:1281 #, c-format msgid "%s: could not create log rotation signal file \"%s\": %m\n" msgstr "%s: ログローテート指示ファイル\"%s\"を作成できませんでした: %m\n" -#: pg_ctl.c:1299 +#: pg_ctl.c:1287 #, c-format msgid "%s: could not write log rotation signal file \"%s\": %m\n" msgstr "%s: ログローテート指示ファイル\"%s\"に書き込めきませんでした: %m\n" -#: pg_ctl.c:1307 +#: pg_ctl.c:1295 #, c-format msgid "%s: could not send log rotation signal (PID: %d): %m\n" msgstr "%s: ログローテートシグナルを送信できませんでした (PID: %d): %m\n" -#: pg_ctl.c:1310 +#: pg_ctl.c:1298 #, c-format msgid "%s: could not remove log rotation signal file \"%s\": %m\n" msgstr "%s: ログローテート指示ファイル\"%s\"の削除に失敗しました: %m\n" -#: pg_ctl.c:1315 +#: pg_ctl.c:1303 msgid "server signaled to rotate log file\n" msgstr "サーバーがログローテートをシグナルされました\n" -#: pg_ctl.c:1362 +#: pg_ctl.c:1350 #, c-format msgid "%s: single-user server is running (PID: %d)\n" msgstr "%s: シングルユーザーサーバーが動作中です(PID: %d)\n" -#: pg_ctl.c:1376 +#: pg_ctl.c:1364 #, c-format msgid "%s: server is running (PID: %d)\n" msgstr "%s: サーバーが動作中です(PID: %d)\n" -#: pg_ctl.c:1392 +#: pg_ctl.c:1380 #, c-format msgid "%s: no server running\n" msgstr "%s: サーバーが動作していません\n" -#: pg_ctl.c:1409 +#: pg_ctl.c:1397 #, c-format msgid "%s: could not send signal %d (PID: %d): %m\n" msgstr "%s: シグナル%dを送信できませんでした(PID: %d): %m\n" -#: pg_ctl.c:1440 +#: pg_ctl.c:1428 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: 本プログラムの実行ファイルの検索に失敗しました\n" -#: pg_ctl.c:1450 +#: pg_ctl.c:1438 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: postgres の実行ファイルが見つかりません\n" -#: pg_ctl.c:1520 pg_ctl.c:1554 +#: pg_ctl.c:1508 pg_ctl.c:1542 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: サービスマネージャのオープンに失敗しました\n" -#: pg_ctl.c:1526 +#: pg_ctl.c:1514 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: サービス\\\"%s\\\"は登録済みです\n" -#: pg_ctl.c:1537 +#: pg_ctl.c:1525 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"の登録に失敗しました: エラーコード %lu\n" -#: pg_ctl.c:1560 +#: pg_ctl.c:1548 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: サービス\"%s\"は登録されていません\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1555 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"のオープンに失敗しました: エラーコード %lu\n" -#: pg_ctl.c:1576 +#: pg_ctl.c:1564 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"の登録削除に失敗しました: エラーコード %lu\n" -#: pg_ctl.c:1663 +#: pg_ctl.c:1651 msgid "Waiting for server startup...\n" msgstr "サーバーの起動完了を待っています...\n" -#: pg_ctl.c:1666 +#: pg_ctl.c:1654 msgid "Timed out waiting for server startup\n" msgstr "サーバーの起動待機がタイムアウトしました\n" -#: pg_ctl.c:1670 +#: pg_ctl.c:1658 msgid "Server started and accepting connections\n" msgstr "サーバーは起動し、接続を受け付けています\n" -#: pg_ctl.c:1725 +#: pg_ctl.c:1713 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"の起動に失敗しました: エラーコード %lu\n" -#: pg_ctl.c:1798 +#: pg_ctl.c:1786 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: プロセストークンをオープンできませんでした: エラーコード %lu\n" -#: pg_ctl.c:1812 +#: pg_ctl.c:1800 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: SIDを割り当てられませんでした: エラーコード %lu\n" -#: pg_ctl.c:1838 +#: pg_ctl.c:1826 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: 制限付きトークンを作成できませんでした: エラーコード %lu\n" -#: pg_ctl.c:1920 +#: pg_ctl.c:1908 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: 権限の LUID を取得できません: エラーコード %lu\n" -#: pg_ctl.c:1928 pg_ctl.c:1943 +#: pg_ctl.c:1916 pg_ctl.c:1931 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: トークン情報を取得できませんでした: エラーコード %lu\n" -#: pg_ctl.c:1937 +#: pg_ctl.c:1925 #, c-format msgid "%s: out of memory\n" msgstr "%s: メモリ不足です\n" -#: pg_ctl.c:1967 +#: pg_ctl.c:1955 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細は\"%s --help\"を実行してください。\n" -#: pg_ctl.c:1975 +#: pg_ctl.c:1963 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" "\n" msgstr "%sはPostgreSQLサーバーの初期化、起動、停止、制御を行うユーティリティです。\n" -#: pg_ctl.c:1976 +#: pg_ctl.c:1964 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1965 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:1966 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -538,12 +544,12 @@ " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-p PATH] [-c]\n" -#: pg_ctl.c:1980 +#: pg_ctl.c:1968 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:1981 +#: pg_ctl.c:1969 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -552,32 +558,32 @@ " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-c]\n" -#: pg_ctl.c:1983 +#: pg_ctl.c:1971 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D DATADIR] [-s]\n" -#: pg_ctl.c:1984 +#: pg_ctl.c:1972 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATADIR]\n" -#: pg_ctl.c:1985 +#: pg_ctl.c:1973 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1974 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATADIR] [-s]\n" -#: pg_ctl.c:1987 +#: pg_ctl.c:1975 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill SIGNALNAME PID\n" -#: pg_ctl.c:1989 +#: pg_ctl.c:1977 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -586,12 +592,12 @@ " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:1991 +#: pg_ctl.c:1979 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N SERVICENAME]\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1982 #, c-format msgid "" "\n" @@ -600,52 +606,52 @@ "\n" "共通のオプション:\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:1983 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=DATADIR データベース格納領域の場所\n" -#: pg_ctl.c:1997 +#: pg_ctl.c:1985 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e SOURCE サービスとして起動させたときのログのイベントソース\n" -#: pg_ctl.c:1999 +#: pg_ctl.c:1987 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent エラーメッセージのみを表示、情報メッセージは表示しない\n" -#: pg_ctl.c:2000 +#: pg_ctl.c:1988 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=SECS -wオプションを使用する時に待機する秒数\n" -#: pg_ctl.c:2001 +#: pg_ctl.c:1989 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_ctl.c:2002 +#: pg_ctl.c:1990 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait 操作が完了するまで待機 (デフォルト)\n" -#: pg_ctl.c:2003 +#: pg_ctl.c:1991 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait 作業の完了を待たない\n" -#: pg_ctl.c:2004 +#: pg_ctl.c:1992 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_ctl.c:2005 +#: pg_ctl.c:1993 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "-Dオプションの省略時はPGDATA環境変数が使用されます。\n" -#: pg_ctl.c:2007 +#: pg_ctl.c:1995 #, c-format msgid "" "\n" @@ -654,22 +660,22 @@ "\n" "起動、再起動のオプション\n" -#: pg_ctl.c:2009 +#: pg_ctl.c:1997 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files postgresのコアファイル生成を許可\n" -#: pg_ctl.c:2011 +#: pg_ctl.c:1999 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files このプラットフォームでは適用されない\n" -#: pg_ctl.c:2013 +#: pg_ctl.c:2001 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log FILENAME サーバーログをFILENAMEへ書き込む(または追加する)\n" -#: pg_ctl.c:2014 +#: pg_ctl.c:2002 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -678,12 +684,12 @@ " -o, --options=OPTIONS postgres(PostgreSQLサーバー実行ファイル)または\n" " initdb に渡すコマンドラインオプション\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2004 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p PATH-TO-POSTGRES 通常は不要\n" -#: pg_ctl.c:2017 +#: pg_ctl.c:2005 #, c-format msgid "" "\n" @@ -692,12 +698,12 @@ "\n" "停止、再起動のオプション\n" -#: pg_ctl.c:2018 +#: pg_ctl.c:2006 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=MODE MODEは\"smart\"、\"fast\"、\"immediate\"のいずれか\n" -#: pg_ctl.c:2020 +#: pg_ctl.c:2008 #, c-format msgid "" "\n" @@ -706,22 +712,22 @@ "\n" "シャットダウンモードは以下の通り:\n" -#: pg_ctl.c:2021 +#: pg_ctl.c:2009 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart 全クライアントの接続切断後に停止\n" -#: pg_ctl.c:2022 +#: pg_ctl.c:2010 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast 適切な手続きで直ちに停止(デフォルト)\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:2011 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr " immediate 適切な手続き抜きで停止; 再起動時にはリカバリが実行される\n" -#: pg_ctl.c:2025 +#: pg_ctl.c:2013 #, c-format msgid "" "\n" @@ -730,7 +736,7 @@ "\n" "killモードで利用できるシグナル名:\n" -#: pg_ctl.c:2029 +#: pg_ctl.c:2017 #, c-format msgid "" "\n" @@ -739,27 +745,27 @@ "\n" "登録、登録解除のオプション:\n" -#: pg_ctl.c:2030 +#: pg_ctl.c:2018 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N SERVICENAME PostgreSQLサーバーを登録する際のサービス名\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2019 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P PASSWORD PostgreSQLサーバーを登録するためのアカウントのパスワード\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2020 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U USERNAME PostgreSQLサーバーを登録するためのアカウント名\n" -#: pg_ctl.c:2033 +#: pg_ctl.c:2021 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S START-TYPE PostgreSQLサーバーを登録する際のサービス起動タイプ\n" -#: pg_ctl.c:2035 +#: pg_ctl.c:2023 #, c-format msgid "" "\n" @@ -768,17 +774,17 @@ "\n" "起動タイプは以下の通り:\n" -#: pg_ctl.c:2036 +#: pg_ctl.c:2024 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto システムの起動時にサービスを自動的に開始(デフォルト)\n" -#: pg_ctl.c:2037 +#: pg_ctl.c:2025 #, c-format msgid " demand start service on demand\n" msgstr " demand 要求に応じてサービスを開始\n" -#: pg_ctl.c:2040 +#: pg_ctl.c:2028 #, c-format msgid "" "\n" @@ -787,37 +793,37 @@ "\n" "バグは<%s>に報告してください。\n" -#: pg_ctl.c:2041 +#: pg_ctl.c:2029 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_ctl.c:2066 +#: pg_ctl.c:2054 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: 不正なシャットダウンモード\"%s\"\n" -#: pg_ctl.c:2095 +#: pg_ctl.c:2083 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: 不正なシグナル名\"%s\"\n" -#: pg_ctl.c:2112 +#: pg_ctl.c:2100 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: 不正な起動タイプ\"%s\"\n" -#: pg_ctl.c:2168 +#: pg_ctl.c:2156 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: コマンド\"%s\"を使用するデータディレクトリを決定できませんでした\n" -#: pg_ctl.c:2191 +#: pg_ctl.c:2179 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: 制御ファイルが壊れているようです\n" -#: pg_ctl.c:2259 +#: pg_ctl.c:2247 #, c-format msgid "" "%s: cannot be run as root\n" @@ -828,32 +834,35 @@ "サーバープロセスの所有者となる(非特権)ユーザーとして(\"su\"などを使用して)\n" "ログインしてください。\n" -#: pg_ctl.c:2331 +#: pg_ctl.c:2319 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: -Sオプションはこのプラットフォームでサポートされていません\n" -#: pg_ctl.c:2387 +#: pg_ctl.c:2375 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: killモード用の引数がありません\n" -#: pg_ctl.c:2405 +#: pg_ctl.c:2393 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: 操作モード\"%s\"は不明です\n" -#: pg_ctl.c:2414 +#: pg_ctl.c:2402 #, c-format msgid "%s: too many command-line arguments (first is \"%s\")\n" msgstr "%s: コマンドライン引数が多すぎます(先頭は\"%s\")\n" -#: pg_ctl.c:2421 +#: pg_ctl.c:2409 #, c-format msgid "%s: no operation specified\n" msgstr "%s: 操作モードが指定されていません\n" -#: pg_ctl.c:2442 +#: pg_ctl.c:2430 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: データベースの指定も、PGDATA環境変数の設定もありません\n" + +#~ msgid "server shut down because of recovery target settings\n" +#~ msgstr "リカバリ目標設定によりシャットダウンしました\n" diff -Nru postgresql-17-17.10/src/bin/pg_ctl/po/ru.po postgresql-17-17.11/src/bin/pg_ctl/po/ru.po --- postgresql-17-17.10/src/bin/pg_ctl/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_ctl/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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-02-08 07:44+0200\n" -"PO-Revision-Date: 2024-09-07 06:47+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:830 ../../port/path.c:867 ../../port/path.c:884 +#: ../../common/fe_memutils.c:41 ../../common/fe_memutils.c:81 +#: ../../common/fe_memutils.c:104 ../../common/fe_memutils.c:167 +#: ../../port/path.c:847 ../../port/path.c:884 ../../port/path.c:901 #, 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 @@ msgid "child process exited with unrecognized status %d" msgstr "дочерний процесс завершился с нераспознанным кодом состояния %d" -#: ../../port/path.c:852 +#: ../../port/path.c:869 #, c-format msgid "could not get current working directory: %m\n" msgstr "не удалось определить текущий рабочий каталог: %m\n" diff -Nru postgresql-17-17.10/src/bin/pg_dump/common.c postgresql-17-17.11/src/bin/pg_dump/common.c --- postgresql-17-17.10/src/bin/pg_dump/common.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/common.c 2026-08-10 20:54:09.000000000 +0000 @@ -1089,50 +1089,146 @@ /* * 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 -Nru postgresql-17-17.10/src/bin/pg_dump/dumputils.c postgresql-17-17.11/src/bin/pg_dump/dumputils.c --- postgresql-17-17.10/src/bin/pg_dump/dumputils.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/dumputils.c 2026-08-10 20:54:09.000000000 +0000 @@ -727,6 +727,7 @@ variable_is_guc_list_quote(const char *name) { if (pg_strcasecmp(name, "local_preload_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 || @@ -738,115 +739,6 @@ } /* - * 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. * * Parse the contents of configitem (a "name=value" string), wrap it in diff -Nru postgresql-17-17.10/src/bin/pg_dump/dumputils.h postgresql-17-17.11/src/bin/pg_dump/dumputils.h --- postgresql-17-17.10/src/bin/pg_dump/dumputils.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/dumputils.h 2026-08-10 20:54:09.000000000 +0000 @@ -56,9 +56,6 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_dump/parallel.c postgresql-17-17.11/src/bin/pg_dump/parallel.c --- postgresql-17-17.10/src/bin/pg_dump/parallel.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/parallel.c 2026-08-10 20:54:09.000000000 +0000 @@ -974,6 +974,8 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_dump/pg_backup_archiver.c postgresql-17-17.11/src/bin/pg_dump/pg_backup_archiver.c --- postgresql-17-17.10/src/bin/pg_dump/pg_backup_archiver.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/pg_backup_archiver.c 2026-08-10 20:54:09.000000000 +0000 @@ -3004,7 +3004,9 @@ } /* 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 */ diff -Nru postgresql-17-17.10/src/bin/pg_dump/pg_dump.c postgresql-17-17.11/src/bin/pg_dump/pg_dump.c --- postgresql-17-17.10/src/bin/pg_dump/pg_dump.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/pg_dump.c 2026-08-10 20:54:09.000000000 +0000 @@ -6573,12 +6573,8 @@ 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 */ @@ -6773,11 +6769,8 @@ 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 */ @@ -7673,9 +7666,8 @@ 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'); @@ -12541,12 +12533,10 @@ if (*protrftypes) { - Oid *typeids = palloc(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, ", "); @@ -17297,7 +17287,7 @@ 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) @@ -17314,7 +17304,7 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_dump/pg_dump.h postgresql-17-17.11/src/bin/pg_dump/pg_dump.h --- postgresql-17-17.10/src/bin/pg_dump/pg_dump.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/pg_dump.h 2026-08-10 20:54:09.000000000 +0000 @@ -412,7 +412,7 @@ 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; @@ -738,7 +738,8 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_dump/po/de.po postgresql-17-17.11/src/bin/pg_dump/po/de.po --- postgresql-17-17.10/src/bin/pg_dump/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-05 10:30+0000\n" +"POT-Creation-Date: 2026-08-07 09:32+0000\n" "PO-Revision-Date: 2025-03-11 08:50+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -124,7 +124,7 @@ msgid "no data was returned by command \"%s\"" msgstr "Befehl »%s« gab keine Daten zurück" -#: ../../common/exec.c:424 parallel.c:1609 +#: ../../common/exec.c:424 parallel.c:1611 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" @@ -133,17 +133,27 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format @@ -656,22 +666,27 @@ msgid "could not create communication channels: %m" msgstr "konnte Kommunikationskanäle nicht erzeugen: %m" -#: parallel.c:1016 +#: parallel.c:978 +#, c-format +msgid "could not create worker thread: %m" +msgstr "konnte Arbeits-Thread nicht erzeugen: %m" + +#: parallel.c:1018 #, c-format msgid "could not create worker process: %m" msgstr "konnte Arbeitsprozess nicht erzeugen: %m" -#: parallel.c:1146 +#: parallel.c:1148 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "unbekannter Befehl vom Leader-Prozess empfangen: »%s«" -#: parallel.c:1189 parallel.c:1427 +#: parallel.c:1191 parallel.c:1429 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "ungültige Nachricht vom Arbeitsprozess empfangen: »%s«" -#: parallel.c:1321 +#: parallel.c:1323 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -680,47 +695,47 @@ "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:1410 +#: parallel.c:1412 #, c-format msgid "a worker process died unexpectedly" msgstr "ein Arbeitsprozess endete unerwartet" -#: parallel.c:1532 parallel.c:1650 +#: parallel.c:1534 parallel.c:1652 #, c-format msgid "could not write to the communication channel: %m" msgstr "konnte nicht in den Kommunikationskanal schreiben: %m" -#: parallel.c:1734 +#: parallel.c:1736 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: konnte Socket nicht erzeugen: Fehlercode %d" -#: parallel.c:1745 +#: parallel.c:1747 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: konnte nicht binden: Fehlercode %d" -#: parallel.c:1752 +#: parallel.c:1754 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: konnte nicht auf Socket hören: Fehlercode %d" -#: parallel.c:1759 +#: parallel.c:1761 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: %s() fehlgeschlagen: Fehlercode %d" -#: parallel.c:1770 +#: parallel.c:1772 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: konnte zweites Socket nicht erzeugen: Fehlercode %d" -#: parallel.c:1779 +#: parallel.c:1781 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: konnte Socket nicht verbinden: Fehlercode %d" -#: parallel.c:1788 +#: parallel.c:1790 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: konnte Verbindung nicht annehmen: Fehlercode %d" @@ -1003,12 +1018,12 @@ msgid "unrecognized file format \"%d\"" msgstr "nicht erkanntes Dateiformat »%d«" -#: pg_backup_archiver.c:2546 pg_backup_archiver.c:4672 +#: pg_backup_archiver.c:2546 pg_backup_archiver.c:4674 #, c-format msgid "finished item %d %s %s" msgstr "Element %d %s %s abgeschlossen" -#: pg_backup_archiver.c:2550 pg_backup_archiver.c:4685 +#: pg_backup_archiver.c:2550 pg_backup_archiver.c:4687 #, c-format msgid "worker process failed: exit code %d" msgstr "Arbeitsprozess fehlgeschlagen: Code %d" @@ -1063,102 +1078,102 @@ msgid "trigger \"%s\" not found" msgstr "Trigger »%s« nicht gefunden" -#: pg_backup_archiver.c:3376 +#: pg_backup_archiver.c:3378 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "konnte Sitzungsbenutzer nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3518 +#: pg_backup_archiver.c:3520 #, c-format msgid "could not set \"search_path\" to \"%s\": %s" msgstr "konnte »search_path« nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3579 +#: pg_backup_archiver.c:3581 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "konnte »default_tablespace« nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3628 +#: pg_backup_archiver.c:3630 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "konnte »default_table_access_method« nicht setzen: %s" -#: pg_backup_archiver.c:3677 +#: pg_backup_archiver.c:3679 #, c-format msgid "could not alter table access method: %s" msgstr "konnte Tabellenzugriffsmethode nicht ändern: %s" -#: pg_backup_archiver.c:3778 +#: pg_backup_archiver.c:3780 #, 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:4029 +#: pg_backup_archiver.c:4031 #, c-format msgid "did not find magic string in file header" msgstr "magische Zeichenkette im Dateikopf nicht gefunden" -#: pg_backup_archiver.c:4043 +#: pg_backup_archiver.c:4045 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "nicht unterstützte Version (%d.%d) im Dateikopf" -#: pg_backup_archiver.c:4048 +#: pg_backup_archiver.c:4050 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "Prüfung der Integer-Größe (%lu) fehlgeschlagen" -#: pg_backup_archiver.c:4052 +#: pg_backup_archiver.c:4054 #, 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:4062 +#: pg_backup_archiver.c:4064 #, 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:4084 +#: pg_backup_archiver.c:4086 #, 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:4120 +#: pg_backup_archiver.c:4122 #, c-format msgid "invalid creation date in header" msgstr "ungültiges Erstellungsdatum im Kopf" -#: pg_backup_archiver.c:4254 +#: pg_backup_archiver.c:4256 #, c-format msgid "processing item %d %s %s" msgstr "verarbeite Element %d %s %s" -#: pg_backup_archiver.c:4339 +#: pg_backup_archiver.c:4341 #, c-format msgid "entering main parallel loop" msgstr "Eintritt in Hauptparallelschleife" -#: pg_backup_archiver.c:4350 +#: pg_backup_archiver.c:4352 #, c-format msgid "skipping item %d %s %s" msgstr "Element %d %s %s wird übersprungen" -#: pg_backup_archiver.c:4359 +#: pg_backup_archiver.c:4361 #, c-format msgid "launching item %d %s %s" msgstr "starte Element %d %s %s" -#: pg_backup_archiver.c:4413 +#: pg_backup_archiver.c:4415 #, c-format msgid "finished main parallel loop" msgstr "Hauptparallelschleife beendet" -#: pg_backup_archiver.c:4449 +#: pg_backup_archiver.c:4451 #, c-format msgid "processing missed item %d %s %s" msgstr "verarbeite verpasstes Element %d %s %s" -#: pg_backup_archiver.c:4991 +#: pg_backup_archiver.c:4993 #, 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" diff -Nru postgresql-17-17.10/src/bin/pg_dump/po/ja.po postgresql-17-17.11/src/bin/pg_dump/po/ja.po --- postgresql-17-17.10/src/bin/pg_dump/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: pg_dump (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-09-01 10:21+0900\n" -"PO-Revision-Date: 2025-09-01 11:41+0900\n" +"POT-Creation-Date: 2026-05-12 14:47+0900\n" +"PO-Revision-Date: 2026-05-14 16:50+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -43,8 +43,8 @@ msgstr "ヒント: " #: ../../common/compression.c:132 ../../common/compression.c:141 -#: ../../common/compression.c:150 compress_gzip.c:428 compress_gzip.c:435 -#: compress_io.c:109 compress_lz4.c:800 compress_lz4.c:807 compress_zstd.c:26 +#: ../../common/compression.c:150 compress_gzip.c:441 compress_gzip.c:448 +#: compress_io.c:109 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 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format @@ -477,48 +487,48 @@ msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "数値配列\"%s\"のパースに失敗しました: 数値に不正な文字が含まれています" -#: compress_gzip.c:69 compress_gzip.c:183 +#: compress_gzip.c:78 compress_gzip.c:192 #, c-format msgid "could not initialize compression library: %s" msgstr "圧縮ライブラリを初期化できませんでした: %s" -#: compress_gzip.c:93 +#: compress_gzip.c:102 #, c-format msgid "could not close compression stream: %s" msgstr "圧縮ストリームをクローズできませんでした: %s" -#: compress_gzip.c:113 compress_lz4.c:228 compress_zstd.c:110 +#: compress_gzip.c:122 compress_lz4.c:228 compress_zstd.c:110 #, c-format msgid "could not compress data: %s" msgstr "データを圧縮できませんでした: %s" -#: compress_gzip.c:199 compress_gzip.c:214 +#: compress_gzip.c:208 compress_gzip.c:223 #, c-format msgid "could not uncompress data: %s" msgstr "データを伸張できませんでした: %s" -#: compress_gzip.c:221 +#: compress_gzip.c:230 #, c-format msgid "could not close compression library: %s" msgstr "圧縮ライブラリをクローズできませんでした: %s" -#: compress_gzip.c:277 compress_lz4.c:513 compress_lz4.c:616 compress_lz4.c:633 +#: compress_gzip.c:290 compress_lz4.c:513 compress_lz4.c:616 compress_lz4.c:633 #, c-format msgid "could not read from input file: %s" msgstr "入力ファイルから読み込めませんでした: %s" -#: compress_gzip.c:294 compress_zstd.c:381 +#: compress_gzip.c:307 compress_zstd.c:381 #, c-format msgid "could not write to file: %s" msgstr "ファイルに書き込めませんでした: %s" -#: compress_gzip.c:310 compress_lz4.c:494 compress_none.c:94 +#: compress_gzip.c:323 compress_lz4.c:494 compress_none.c:94 #: compress_none.c:135 compress_zstd.c:314 pg_backup_custom.c:651 #, c-format msgid "could not read from input file: %m" msgstr "入力ファイルから読み込めませんでした: %m" -#: compress_gzip.c:312 compress_lz4.c:635 compress_none.c:137 +#: compress_gzip.c:325 compress_lz4.c:635 compress_none.c:137 #: compress_zstd.c:399 pg_backup_custom.c:649 pg_backup_directory.c:547 #: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format @@ -540,7 +550,7 @@ 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" @@ -565,17 +575,17 @@ 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" @@ -1006,12 +1016,12 @@ msgid "unrecognized file format \"%d\"" msgstr "認識不能のファイル形式\"%d\"" -#: pg_backup_archiver.c:2546 pg_backup_archiver.c:4641 +#: pg_backup_archiver.c:2546 pg_backup_archiver.c:4672 #, c-format msgid "finished item %d %s %s" msgstr "項目 %d %s %s の処理が完了" -#: pg_backup_archiver.c:2550 pg_backup_archiver.c:4654 +#: pg_backup_archiver.c:2550 pg_backup_archiver.c:4685 #, c-format msgid "worker process failed: exit code %d" msgstr "ワーカープロセスの処理失敗: 終了コード %d" @@ -1066,102 +1076,102 @@ msgid "trigger \"%s\" not found" msgstr "トリガ\"%s\"が見つかりません" -#: pg_backup_archiver.c:3345 +#: pg_backup_archiver.c:3376 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "セッションユーザーを\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3487 +#: pg_backup_archiver.c:3518 #, c-format msgid "could not set \"search_path\" to \"%s\": %s" msgstr "\"search_path\"を\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3548 +#: pg_backup_archiver.c:3579 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "\"default_tablespace\"を\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3597 +#: pg_backup_archiver.c:3628 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "\"default_table_access_method\"を設定できませんでした: %s" -#: pg_backup_archiver.c:3646 +#: pg_backup_archiver.c:3677 #, c-format msgid "could not alter table access method: %s" msgstr "テーブルアクセスメソッドを変更できませんでした: %s" -#: pg_backup_archiver.c:3747 +#: pg_backup_archiver.c:3778 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "オブジェクトタイプ%sに対する所有者の設定方法がわかりません" -#: pg_backup_archiver.c:3998 +#: pg_backup_archiver.c:4029 #, c-format msgid "did not find magic string in file header" msgstr "ファイルヘッダにマジック文字列がありませんでした" -#: pg_backup_archiver.c:4012 +#: pg_backup_archiver.c:4043 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ファイルヘッダ内のバージョン(%d.%d)はサポートされていません" -#: pg_backup_archiver.c:4017 +#: pg_backup_archiver.c:4048 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "整数のサイズ(%lu)に関する健全性検査が失敗しました" -#: pg_backup_archiver.c:4021 +#: pg_backup_archiver.c:4052 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "アーカイブはより大きなサイズの整数を持つマシンで作成されました、一部の操作が失敗する可能性があります" -#: pg_backup_archiver.c:4031 +#: pg_backup_archiver.c:4062 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "想定した形式(%d)はファイル内にある形式(%d)と異なります" -#: pg_backup_archiver.c:4053 +#: pg_backup_archiver.c:4084 #, 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:4089 +#: pg_backup_archiver.c:4120 #, c-format msgid "invalid creation date in header" msgstr "ヘッダ内の作成日付が不正です" -#: pg_backup_archiver.c:4223 +#: pg_backup_archiver.c:4254 #, c-format msgid "processing item %d %s %s" msgstr "項目 %d %s %s を処理しています" -#: pg_backup_archiver.c:4308 +#: pg_backup_archiver.c:4339 #, c-format msgid "entering main parallel loop" msgstr "メインの並列ループに入ります" -#: pg_backup_archiver.c:4319 +#: pg_backup_archiver.c:4350 #, c-format msgid "skipping item %d %s %s" msgstr "項目 %d %s %s をスキップしています" -#: pg_backup_archiver.c:4328 +#: pg_backup_archiver.c:4359 #, c-format msgid "launching item %d %s %s" msgstr "項目 %d %s %s に着手します" -#: pg_backup_archiver.c:4382 +#: pg_backup_archiver.c:4413 #, c-format msgid "finished main parallel loop" msgstr "メインの並列ループが終了しました" -#: pg_backup_archiver.c:4418 +#: pg_backup_archiver.c:4449 #, c-format msgid "processing missed item %d %s %s" msgstr "やり残し項目 %d %s %s を処理しています" -#: pg_backup_archiver.c:4960 +#: pg_backup_archiver.c:4991 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "テーブル\"%s\"を作成できませんでした、このテーブルのデータは復元されません" @@ -1248,12 +1258,12 @@ msgid "could not get server_version from libpq" msgstr "libpqからserver_versionを取得できませんでした" -#: pg_backup_db.c:53 pg_dumpall.c:1924 +#: pg_backup_db.c:53 pg_dumpall.c:1935 #, c-format msgid "aborting because of server version mismatch" msgstr "サーバーバージョンの不一致のため処理を中断します" -#: pg_backup_db.c:54 pg_dumpall.c:1925 +#: pg_backup_db.c:54 pg_dumpall.c:1936 #, c-format msgid "server version: %s; %s version: %s" msgstr "サーバーバージョン: %s、%s バージョン: %s" @@ -1263,7 +1273,7 @@ msgid "already connected to a database" msgstr "データベースはすでに接続済みです" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1771 pg_dumpall.c:1873 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1782 pg_dumpall.c:1884 msgid "Password: " msgstr "パスワード: " @@ -1277,18 +1287,18 @@ msgid "reconnection failed: %s" msgstr "再接続に失敗しました: %s" -#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:808 pg_dump_sort.c:1439 -#: pg_dump_sort.c:1459 pg_dumpall.c:1798 pg_dumpall.c:1882 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:808 pg_dump_sort.c:1451 +#: pg_dump_sort.c:1471 pg_dumpall.c:1809 pg_dumpall.c:1893 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:271 pg_dumpall.c:1987 pg_dumpall.c:2010 +#: pg_backup_db.c:271 pg_dumpall.c:1998 pg_dumpall.c:2021 #, c-format msgid "query failed: %s" msgstr "問い合わせが失敗しました: %s" -#: pg_backup_db.c:273 pg_dumpall.c:1988 pg_dumpall.c:2011 +#: pg_backup_db.c:273 pg_dumpall.c:1999 pg_dumpall.c:2022 #, c-format msgid "Query was: %s" msgstr "問い合わせ: %s" @@ -2074,7 +2084,7 @@ msgid "invalid output format \"%s\" specified" msgstr "不正な出力形式\"%s\"が指定されました" -#: pg_dump.c:1481 pg_dump.c:1537 pg_dump.c:1590 pg_dumpall.c:1558 +#: pg_dump.c:1481 pg_dump.c:1537 pg_dump.c:1590 pg_dumpall.c:1569 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" @@ -2199,8 +2209,8 @@ msgid "unexpected policy command type: %c" msgstr "想定外のポリシコマンドタイプ: \"%c\"" -#: pg_dump.c:4625 pg_dump.c:5183 pg_dump.c:12499 pg_dump.c:18423 -#: pg_dump.c:18425 pg_dump.c:19047 +#: pg_dump.c:4625 pg_dump.c:5183 pg_dump.c:12499 pg_dump.c:18428 +#: pg_dump.c:18430 pg_dump.c:19052 #, c-format msgid "could not parse %s array" msgstr "%s配列をパースできませんでした" @@ -2469,74 +2479,74 @@ msgid "unrecognized sequence type: %s" msgstr "認識されないシーケンスの型\"%s\"" -#: pg_dump.c:18175 +#: pg_dump.c:18180 #, 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:18328 +#: pg_dump.c:18333 #, c-format msgid "could not find referenced extension %u" msgstr "親の機能拡張%uが見つかりません" -#: pg_dump.c:18427 +#: pg_dump.c:18432 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "機能拡張に対して設定と条件の数が一致しません" -#: pg_dump.c:18559 +#: pg_dump.c:18564 #, c-format msgid "reading dependency data" msgstr "データの依存データを読み込んでいます" -#: pg_dump.c:18645 +#: pg_dump.c:18650 #, c-format msgid "no referencing object %u %u" msgstr "参照元オブジェクト%u %uがありません" -#: pg_dump.c:18656 +#: pg_dump.c:18661 #, c-format msgid "no referenced object %u %u" msgstr "参照先オブジェクト%u %uがありません" -#: pg_dump.c:19081 pg_dump.c:19119 pg_dumpall.c:2056 pg_restore.c:573 +#: pg_dump.c:19086 pg_dump.c:19124 pg_dumpall.c:2067 pg_restore.c:573 #: pg_restore.c:619 #, c-format msgid "%s filter for \"%s\" is not allowed" msgstr "\"%2$s\"に対しては%1$sフィルターを指定できません" -#: pg_dump_sort.c:647 +#: pg_dump_sort.c:659 #, c-format msgid "invalid dumpId %d" msgstr "不正なdumpId %d" -#: pg_dump_sort.c:653 +#: pg_dump_sort.c:665 #, c-format msgid "invalid dependency %d" msgstr "不正な依存関係 %d" -#: pg_dump_sort.c:817 +#: pg_dump_sort.c:829 #, c-format msgid "could not identify dependency loop" msgstr "依存関係のループが見つかりませんでした" -#: pg_dump_sort.c:1435 +#: pg_dump_sort.c:1447 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "次のテーブルの中で外部キー制約の循環があります: " -#: pg_dump_sort.c:1440 +#: pg_dump_sort.c:1452 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "--disable-triggersの使用または一時的な制約の削除を行わずにこのダンプをリストアすることはできないかもしれません。" -#: pg_dump_sort.c:1441 +#: pg_dump_sort.c:1453 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "この問題を回避するために--data-onlyダンプの代わりに完全なダンプを使用することを検討してください。" -#: pg_dump_sort.c:1453 +#: pg_dump_sort.c:1465 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "以下の項目の間の依存関係のループを解決できませんでした:" @@ -2571,7 +2581,7 @@ msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "-r/--roles-onlyと-t/--tablespaces-onlyオプションは同時に使用できません" -#: pg_dumpall.c:493 pg_dumpall.c:1865 +#: pg_dumpall.c:493 pg_dumpall.c:1876 #, c-format msgid "could not connect to database \"%s\"" msgstr "データベース\"%s\"へ接続できませんでした" @@ -2685,67 +2695,84 @@ msgstr "\"pg_\"で始まるロール名はスキップされました(%s)" #. translator: %s represents a numeric role OID -#: pg_dumpall.c:1091 pg_dumpall.c:1149 pg_dumpall.c:1158 +#: pg_dumpall.c:1091 #, 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:1124 +#: pg_dumpall.c:1129 #, c-format msgid "could not find a legal dump ordering for memberships in role \"%s\"" msgstr "ロール\"%s\"のメンバーシップに対して正当なダンプ順序が見つかりませんでした" -#: pg_dumpall.c:1279 +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1155 +#, 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:1170 +#, c-format +msgid "grant of role \"%s\" to \"%s\" has invalid grantor OID %s" +msgstr "ロール \"%s\"から\"%s\"へのGRANTの権限付与者 OID %s が不正です" + +#: pg_dumpall.c:1172 +#, c-format +msgid "This grant will be dumped without GRANTED BY." +msgstr "このGRANTは GRANTED BY なしでダンプされます。" + +#: pg_dumpall.c:1290 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "パラメータ\"%2$s\"のACLリスト(%1$s)をパースできませんでした" -#: pg_dumpall.c:1406 +#: pg_dumpall.c:1417 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "テーブル空間\"%2$s\"のACLリスト(%1$s)をパースできませんでした" -#: pg_dumpall.c:1620 +#: pg_dumpall.c:1631 #, c-format msgid "excluding database \"%s\"" msgstr "データベース\"%s\"を除外します" -#: pg_dumpall.c:1624 +#: pg_dumpall.c:1635 #, c-format msgid "dumping database \"%s\"" msgstr "データベース\"%s\"をダンプしています" -#: pg_dumpall.c:1657 +#: pg_dumpall.c:1668 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "データベース\"%s\"のダンプが失敗しました、終了します" -#: pg_dumpall.c:1663 +#: pg_dumpall.c:1674 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "出力ファイル\"%s\"を再オープンできませんでした: %m" -#: pg_dumpall.c:1707 +#: pg_dumpall.c:1718 #, c-format msgid "running \"%s\"" msgstr "\"%s\"を実行しています" -#: pg_dumpall.c:1908 +#: pg_dumpall.c:1919 #, c-format msgid "could not get server version" msgstr "サーバーバージョンを取得できませんでした" -#: pg_dumpall.c:1911 +#: pg_dumpall.c:1922 #, c-format msgid "could not parse server version \"%s\"" msgstr "サーバーバージョン\"%s\"をパースできませんでした" -#: pg_dumpall.c:1981 pg_dumpall.c:2004 +#: pg_dumpall.c:1992 pg_dumpall.c:2015 #, c-format msgid "executing %s" msgstr "%s を実行しています" -#: pg_dumpall.c:2076 +#: pg_dumpall.c:2087 msgid "unsupported filter object" msgstr "サポートされていないフィルターオブジェクト" @@ -3017,3 +3044,6 @@ "\n" "入力ファイル名が指定されない場合、標準入力が使用されます。\n" "\n" + +#~ msgid "found orphaned pg_auth_members entry for role %s" +#~ msgstr "ロール %s に対する pg_auth_members エントリがありましたが、このロールは存在しません" diff -Nru postgresql-17-17.10/src/bin/pg_dump/po/ru.po postgresql-17-17.11/src/bin/pg_dump/po/ru.po --- postgresql-17-17.10/src/bin/pg_dump/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_dump/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: pg_dump (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-10 08:01+0300\n" -"PO-Revision-Date: 2026-05-10 08:53+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+0300\n" +"PO-Revision-Date: 2026-08-05 07:50+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -132,7 +132,7 @@ msgid "no data was returned by command \"%s\"" msgstr "команда \"%s\" не выдала данные" -#: ../../common/exec.c:424 parallel.c:1609 +#: ../../common/exec.c:424 parallel.c:1611 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" @@ -141,17 +141,27 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format @@ -671,22 +681,27 @@ msgid "could not create communication channels: %m" msgstr "не удалось создать каналы межпроцессного взаимодействия: %m" -#: parallel.c:1016 +#: parallel.c:978 +#, c-format +msgid "could not create worker thread: %m" +msgstr "не удалось создать рабочий поток: %m" + +#: parallel.c:1018 #, c-format msgid "could not create worker process: %m" msgstr "не удалось создать рабочий процесс: %m" -#: parallel.c:1146 +#: parallel.c:1148 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "от ведущего процесса получена нераспознанная команда: \"%s\"" -#: parallel.c:1189 parallel.c:1427 +#: parallel.c:1191 parallel.c:1429 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "от рабочего процесса получено ошибочное сообщение: \"%s\"" -#: parallel.c:1321 +#: parallel.c:1323 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -699,47 +714,47 @@ "этой таблицы после того, как родительский процесс pg_dump получил для неё " "начальную блокировку ACCESS SHARE." -#: parallel.c:1410 +#: parallel.c:1412 #, c-format msgid "a worker process died unexpectedly" msgstr "рабочий процесс неожиданно прервался" -#: parallel.c:1532 parallel.c:1650 +#: parallel.c:1534 parallel.c:1652 #, c-format msgid "could not write to the communication channel: %m" msgstr "не удалось записать в канал взаимодействия: %m" -#: parallel.c:1734 +#: parallel.c:1736 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: не удалось создать сокет (код ошибки: %d)" -#: parallel.c:1745 +#: parallel.c:1747 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: не удалось привязаться к сокету (код ошибки: %d)" -#: parallel.c:1752 +#: parallel.c:1754 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: не удалось начать приём (код ошибки: %d)" -#: parallel.c:1759 +#: parallel.c:1761 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: ошибка в %s() (код ошибки: %d)" -#: parallel.c:1770 +#: parallel.c:1772 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: не удалось создать второй сокет (код ошибки: %d)" -#: parallel.c:1779 +#: parallel.c:1781 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: не удалось подключить сокет (код ошибки: %d)" -#: parallel.c:1788 +#: parallel.c:1790 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: не удалось принять соединение (код ошибки: %d)" @@ -1036,12 +1051,12 @@ msgid "unrecognized file format \"%d\"" msgstr "неопознанный формат файла: \"%d\"" -#: pg_backup_archiver.c:2546 pg_backup_archiver.c:4672 +#: pg_backup_archiver.c:2546 pg_backup_archiver.c:4674 #, c-format msgid "finished item %d %s %s" msgstr "закончен объект %d %s %s" -#: pg_backup_archiver.c:2550 pg_backup_archiver.c:4685 +#: pg_backup_archiver.c:2550 pg_backup_archiver.c:4687 #, c-format msgid "worker process failed: exit code %d" msgstr "рабочий процесс завершился с кодом возврата %d" @@ -1096,52 +1111,52 @@ msgid "trigger \"%s\" not found" msgstr "триггер \"%s\" не найден" -#: pg_backup_archiver.c:3376 +#: pg_backup_archiver.c:3378 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "не удалось переключить пользователя сеанса на \"%s\": %s" -#: pg_backup_archiver.c:3518 +#: pg_backup_archiver.c:3520 #, c-format msgid "could not set \"search_path\" to \"%s\": %s" msgstr "не удалось присвоить \"search_path\" значение \"%s\": %s" -#: pg_backup_archiver.c:3579 +#: pg_backup_archiver.c:3581 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "не удалось задать для \"default_tablespace\" значение %s: %s" -#: pg_backup_archiver.c:3628 +#: pg_backup_archiver.c:3630 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "не удалось задать \"default_table_access_method\": %s" -#: pg_backup_archiver.c:3677 +#: pg_backup_archiver.c:3679 #, c-format msgid "could not alter table access method: %s" msgstr "не удалось изменить табличный метод доступа: %s" -#: pg_backup_archiver.c:3778 +#: pg_backup_archiver.c:3780 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "неизвестно, как назначить владельца для объекта типа \"%s\"" -#: pg_backup_archiver.c:4029 +#: pg_backup_archiver.c:4031 #, c-format msgid "did not find magic string in file header" msgstr "в заголовке файла не найдена нужная сигнатура" -#: pg_backup_archiver.c:4043 +#: pg_backup_archiver.c:4045 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "неподдерживаемая версия (%d.%d) в заголовке файла" -#: pg_backup_archiver.c:4048 +#: pg_backup_archiver.c:4050 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "несоответствие размера integer (%lu)" -#: pg_backup_archiver.c:4052 +#: pg_backup_archiver.c:4054 #, c-format msgid "" "archive was made on a machine with larger integers, some operations might " @@ -1150,12 +1165,12 @@ "архив был сделан на компьютере большей разрядности -- возможен сбой " "некоторых операций" -#: pg_backup_archiver.c:4062 +#: pg_backup_archiver.c:4064 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "ожидаемый формат (%d) отличается от формата, указанного в файле (%d)" -#: pg_backup_archiver.c:4084 +#: pg_backup_archiver.c:4086 #, c-format msgid "" "archive is compressed, but this installation does not support compression " @@ -1164,42 +1179,42 @@ "архив сжат, но установленная версия не поддерживает сжатие (%s) -- данные " "будут недоступны" -#: pg_backup_archiver.c:4120 +#: pg_backup_archiver.c:4122 #, c-format msgid "invalid creation date in header" msgstr "неверная дата создания в заголовке" -#: pg_backup_archiver.c:4254 +#: pg_backup_archiver.c:4256 #, c-format msgid "processing item %d %s %s" msgstr "обработка объекта %d %s %s" -#: pg_backup_archiver.c:4339 +#: pg_backup_archiver.c:4341 #, c-format msgid "entering main parallel loop" msgstr "вход в основной параллельный цикл" -#: pg_backup_archiver.c:4350 +#: pg_backup_archiver.c:4352 #, c-format msgid "skipping item %d %s %s" msgstr "объект %d %s %s пропускается" -#: pg_backup_archiver.c:4359 +#: pg_backup_archiver.c:4361 #, c-format msgid "launching item %d %s %s" msgstr "объект %d %s %s запускается" -#: pg_backup_archiver.c:4413 +#: pg_backup_archiver.c:4415 #, c-format msgid "finished main parallel loop" msgstr "основной параллельный цикл закончен" -#: pg_backup_archiver.c:4449 +#: pg_backup_archiver.c:4451 #, c-format msgid "processing missed item %d %s %s" msgstr "обработка пропущенного объекта %d %s %s" -#: pg_backup_archiver.c:4991 +#: pg_backup_archiver.c:4993 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "создать таблицу \"%s\" не удалось, её данные не будут восстановлены" diff -Nru postgresql-17-17.10/src/bin/pg_resetwal/po/de.po postgresql-17-17.11/src/bin/pg_resetwal/po/de.po --- postgresql-17-17.10/src/bin/pg_resetwal/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_resetwal/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:37+0000\n" +"POT-Creation-Date: 2026-08-07 09:31+0000\n" "PO-Revision-Date: 2024-03-26 11:01+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -94,17 +94,27 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" diff -Nru postgresql-17-17.10/src/bin/pg_resetwal/po/ru.po postgresql-17-17.11/src/bin/pg_resetwal/po/ru.po --- postgresql-17-17.10/src/bin/pg_resetwal/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_resetwal/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -10,8 +10,8 @@ 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 11:39+0200\n" -"PO-Revision-Date: 2026-02-07 09:15+0200\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" diff -Nru postgresql-17-17.10/src/bin/pg_rewind/po/de.po postgresql-17-17.11/src/bin/pg_rewind/po/de.po --- postgresql-17-17.10/src/bin/pg_rewind/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_rewind/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: pg_rewind (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-07 09:33+0000\n" "PO-Revision-Date: 2024-08-28 07:51+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -36,18 +36,18 @@ 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:104 -#: local_source.c:163 parsexlog.c:350 +#: ../../common/controldata_utils.c:110 file_ops.c:364 local_source.c:104 +#: local_source.c:163 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:352 +#: ../../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" @@ -79,12 +79,12 @@ #: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 #: ../../common/file_utils.c:347 ../../common/file_utils.c:406 #: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 -#: parsexlog.c:312 +#: parsexlog.c:333 #, c-format 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 @@ 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:76 #, 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 -#: ../../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 @@ 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 file_ops.c:388 +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:411 #, 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 file_ops.c:462 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:485 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" @@ -235,117 +245,152 @@ msgid "could not create file \"%s\": %m" msgstr "konnte Datei »%s« nicht erstellen: %m" -#: ../../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" -#: 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:235 +#: filemap.c:297 #, 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:240 filemap.c:273 +#: filemap.c:302 filemap.c:335 #, c-format msgid "duplicate source file \"%s\"" msgstr "doppelte Quelldatei »%s«" -#: filemap.c:328 +#: filemap.c:390 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "unerwartete Seitenänderung für nicht normale Datei »%s«" -#: filemap.c:682 filemap.c:776 +#: filemap.c:744 filemap.c:846 #, c-format msgid "unknown file type for \"%s\"" msgstr "unbekannter Dateityp für »%s«" -#: filemap.c:709 +#: 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:781 +#: 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" @@ -490,7 +535,7 @@ msgid "unexpected EOF while reading file \"%s\"" msgstr "unerwartetes EOF beim Lesen der Datei »%s«" -#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199 +#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:201 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "Speicher aufgebraucht beim Anlegen eines WAL-Leseprozessors" @@ -510,22 +555,22 @@ msgid "end pointer %X/%X is not a valid end point; expected %X/%X" msgstr "Endpunkt %X/%X ist kein gültiger Endpunkt; %X/%X erwartet" -#: parsexlog.c:212 +#: parsexlog.c:214 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "konnte vorangegangenen WAL-Eintrag bei %X/%X nicht finden: %s" -#: parsexlog.c:216 +#: parsexlog.c:218 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "konnte vorangegangenen WAL-Eintrag bei %X/%X nicht finden" -#: parsexlog.c:341 +#: parsexlog.c:362 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "konnte Positionszeiger in Datei »%s« nicht setzen: %m" -#: parsexlog.c:440 +#: parsexlog.c:461 #, c-format msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" msgstr "WAL-Eintrag modifiziert eine Relation, aber Typ des Eintrags wurde nicht erkannt: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" @@ -730,154 +775,154 @@ msgid "no rewind required" msgstr "kein Rückspulen nötig" -#: pg_rewind.c:460 +#: pg_rewind.c:463 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "Rückspulen ab letztem gemeinsamen Checkpoint bei %X/%X auf Zeitleiste %u" -#: pg_rewind.c:470 +#: pg_rewind.c:473 #, c-format msgid "reading source file list" msgstr "lese Quelldateiliste" -#: pg_rewind.c:474 +#: pg_rewind.c:477 #, c-format msgid "reading target file list" msgstr "lese Zieldateiliste" -#: pg_rewind.c:483 +#: pg_rewind.c:486 #, c-format msgid "reading WAL in target" msgstr "lese WAL im Ziel-Cluster" -#: pg_rewind.c:504 +#: pg_rewind.c:507 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "%lu MB müssen kopiert werden (Gesamtgröße des Quellverzeichnisses ist %lu MB)" -#: pg_rewind.c:522 +#: pg_rewind.c:525 #, c-format msgid "syncing target data directory" msgstr "synchronisiere Zieldatenverzeichnis" -#: pg_rewind.c:538 +#: pg_rewind.c:541 #, c-format msgid "Done!" msgstr "Fertig!" -#: pg_rewind.c:618 +#: pg_rewind.c:621 #, c-format msgid "no action decided for file \"%s\"" msgstr "keine Aktion bestimmt für Datei »%s«" -#: pg_rewind.c:650 +#: pg_rewind.c:653 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "Quellsystem wurde verändert, während pg_rewind lief" -#: pg_rewind.c:654 +#: pg_rewind.c:657 #, c-format msgid "creating backup label and updating control file" msgstr "erzeuge Backup-Label und aktualisiere Kontrolldatei" -#: pg_rewind.c:704 +#: pg_rewind.c:707 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "Quellsystem war in einem unerwarteten Zustand am Ende des Rückspulens" -#: pg_rewind.c:736 +#: pg_rewind.c:739 #, c-format msgid "source and target clusters are from different systems" msgstr "Quell- und Ziel-Cluster sind von verschiedenen Systemen" -#: pg_rewind.c:744 +#: pg_rewind.c:747 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "die Cluster sind nicht mit dieser Version von pg_rewind kompatibel" -#: pg_rewind.c:754 +#: pg_rewind.c:757 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "Zielserver muss entweder Datenprüfsummen oder »wal_log_hints = on« verwenden" -#: pg_rewind.c:765 +#: pg_rewind.c:768 #, c-format msgid "target server must be shut down cleanly" msgstr "Zielserver muss sauber heruntergefahren worden sein" -#: pg_rewind.c:775 +#: pg_rewind.c:778 #, c-format msgid "source data directory must be shut down cleanly" msgstr "Quelldatenverzeichnis muss sauber heruntergefahren worden sein" -#: pg_rewind.c:822 +#: pg_rewind.c:825 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) kopiert" -#: pg_rewind.c:948 +#: pg_rewind.c:951 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "konnte keinen gemeinsamen Anfangspunkt in den Zeitleisten von Quell- und Ziel-Cluster finden" -#: pg_rewind.c:989 +#: pg_rewind.c:992 #, c-format msgid "backup label buffer too small" msgstr "Puffer für Backup-Label ist zu klein" -#: pg_rewind.c:1012 +#: pg_rewind.c:1015 #, c-format msgid "unexpected control file CRC" msgstr "unerwartete CRC in Kontrolldatei" -#: pg_rewind.c:1024 +#: pg_rewind.c:1027 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "unerwartete Kontrolldateigröße %d, erwartet wurde %d" -#: pg_rewind.c:1034 +#: pg_rewind.c:1037 #, c-format msgid "invalid WAL segment size in control file (%d byte)" msgid_plural "invalid WAL segment size in control file (%d bytes)" msgstr[0] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Byte)" msgstr[1] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Bytes)" -#: pg_rewind.c:1038 +#: pg_rewind.c:1041 #, c-format 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." -#: pg_rewind.c:1075 pg_rewind.c:1143 +#: pg_rewind.c:1078 pg_rewind.c:1146 #, 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_rewind.c:1078 pg_rewind.c:1146 +#: pg_rewind.c:1081 pg_rewind.c:1149 #, 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_rewind.c:1107 +#: pg_rewind.c:1110 #, c-format msgid "could not read restore_command from target cluster" msgstr "konnte restore_command des Ziel-Clusters nicht lesen" -#: pg_rewind.c:1112 +#: pg_rewind.c:1115 #, c-format msgid "\"restore_command\" is not set in the target cluster" msgstr "»restore_command« ist im Ziel-Cluster nicht gesetzt" -#: pg_rewind.c:1150 +#: pg_rewind.c:1153 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "führe »%s« für Zielserver aus, um Wiederherstellung abzuschließen" -#: pg_rewind.c:1188 +#: pg_rewind.c:1191 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "postgres im Einzelbenutzermodus im Ziel-Cluster fehlgeschlagen" -#: pg_rewind.c:1189 +#: pg_rewind.c:1192 #, c-format msgid "Command was: %s" msgstr "Die Anweisung war: %s" @@ -927,147 +972,147 @@ msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: xlogreader.c:669 xlogreader.c:1134 +#: xlogreader.c:669 xlogreader.c:1144 #, 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:758 +#: xlogreader.c:759 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: xlogreader.c:771 +#: xlogreader.c:772 #, 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:1142 +#: xlogreader.c:1152 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: xlogreader.c:1155 xlogreader.c:1171 +#: xlogreader.c:1165 xlogreader.c:1181 #, 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:1209 +#: xlogreader.c:1219 #, 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:1243 +#: xlogreader.c:1253 #, 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:1258 xlogreader.c:1300 +#: xlogreader.c:1268 xlogreader.c:1310 #, 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:1274 +#: xlogreader.c:1284 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu" -#: xlogreader.c:1282 +#: xlogreader.c:1292 #, 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:1288 +#: xlogreader.c:1298 #, 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:1320 +#: xlogreader.c:1330 #, 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:1346 +#: xlogreader.c:1356 #, 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:1749 +#: xlogreader.c:1759 #, 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:1773 +#: xlogreader.c:1783 #, 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:1780 +#: xlogreader.c:1790 #, 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:1816 +#: xlogreader.c:1826 #, 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:1832 +#: xlogreader.c:1842 #, 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:1846 +#: xlogreader.c:1856 #, 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:1861 +#: xlogreader.c:1871 #, 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:1877 +#: xlogreader.c:1887 #, 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:1889 +#: xlogreader.c:1899 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: xlogreader.c:1956 +#: xlogreader.c:1966 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: xlogreader.c:1982 +#: xlogreader.c:1992 #, 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:2066 +#: xlogreader.c:2076 #, 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:2073 +#: xlogreader.c:2083 #, 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:2100 xlogreader.c:2117 +#: xlogreader.c:2110 xlogreader.c:2127 #, 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:2126 +#: xlogreader.c:2136 #, 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:2134 +#: xlogreader.c:2144 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" diff -Nru postgresql-17-17.10/src/bin/pg_rewind/po/ja.po postgresql-17-17.11/src/bin/pg_rewind/po/ja.po --- postgresql-17-17.10/src/bin/pg_rewind/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_rewind/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-28 10:06+0900\n" -"PO-Revision-Date: 2025-03-03 17:33+0900\n" +"POT-Creation-Date: 2026-05-12 14:47+0900\n" +"PO-Revision-Date: 2026-05-15 11:42+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -40,18 +40,18 @@ 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:104 +#: ../../common/controldata_utils.c:110 file_ops.c:364 local_source.c:104 #: local_source.c:163 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 @@ 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 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "ファイル\"%s\"に対してファイルシステムを同期できませんでした: %m" #: ../../common/file_utils.c:120 ../../common/file_utils.c:566 -#: ../../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 @@ msgid "this build does not support sync method \"%s\"" msgstr "このビルドでは同期方式\"%s\"をサポートしていません" -#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:411 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" -#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:485 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読み取れませんでした: %m" @@ -248,77 +258,112 @@ 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" @@ -925,147 +970,147 @@ msgid "contrecord is requested by %X/%X" msgstr "%X/%Xではcontrecordが必要です" -#: xlogreader.c:669 xlogreader.c:1134 +#: xlogreader.c:669 xlogreader.c:1144 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "%X/%Xのレコード長が無効です:最低でも%uを期待していましたが、実際は%uでした" -#: xlogreader.c:758 +#: xlogreader.c:759 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "%X/%Xで contrecord フラグがありません" -#: xlogreader.c:771 +#: xlogreader.c:772 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "%3$X/%4$Xの継続レコードの長さ%1$u(正しくは%2$lld)は不正です" -#: xlogreader.c:1142 +#: xlogreader.c:1152 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "%2$X/%3$XのリソースマネージャID %1$uが無効です" -#: xlogreader.c:1155 xlogreader.c:1171 +#: xlogreader.c:1165 xlogreader.c:1181 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "直前のリンク%1$X/%2$Xが不正なレコードが%3$X/%4$Xにあります" -#: xlogreader.c:1209 +#: xlogreader.c:1219 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "%X/%Xのレコード内のリソースマネージャデータのチェックサムが不正です" -#: xlogreader.c:1243 +#: xlogreader.c:1253 #, 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:1258 xlogreader.c:1300 +#: xlogreader.c:1268 xlogreader.c:1310 #, 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:1274 +#: xlogreader.c:1284 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WALファイルは異なるデータベースシステム由来のものです: WALファイルのデータベースシステム識別子は %lluで、pg_control におけるデータベースシステム識別子は %lluです" -#: xlogreader.c:1282 +#: xlogreader.c:1292 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのセグメントサイズが正しくありません" -#: xlogreader.c:1288 +#: xlogreader.c:1298 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL ファイルは異なるデータベースシステム由来のものです: ページヘッダーのXLOG_BLCKSZが正しくありません" -#: xlogreader.c:1320 +#: xlogreader.c:1330 #, 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:1346 +#: xlogreader.c:1356 #, 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:1749 +#: xlogreader.c:1759 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %uが%X/%Xで無効です" -#: xlogreader.c:1773 +#: xlogreader.c:1783 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATAが設定されていますが、%X/%Xにデータがありません" -#: xlogreader.c:1780 +#: xlogreader.c:1790 #, 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:1816 +#: xlogreader.c:1826 #, 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:1832 +#: xlogreader.c:1842 #, 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:1846 +#: xlogreader.c:1856 #, 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:1861 +#: xlogreader.c:1871 #, 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:1877 +#: xlogreader.c:1887 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_RELが設定されていますが、%X/%Xにおいて以前のリレーションがありません" -#: xlogreader.c:1889 +#: xlogreader.c:1899 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "%2$X/%3$Xにおけるblock_id %1$uが無効です" -#: xlogreader.c:1956 +#: xlogreader.c:1966 #, c-format msgid "record with invalid length at %X/%X" msgstr "%X/%Xのレコードのサイズが無効です" -#: xlogreader.c:1982 +#: xlogreader.c:1992 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "WALレコード中のID %dのバックアップブロックを特定できませんでした" -#: xlogreader.c:2066 +#: xlogreader.c:2076 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "%X/%Xで不正なブロック%dが指定されているためイメージが復元できませんでした" -#: xlogreader.c:2073 +#: xlogreader.c:2083 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "%X/%Xでブロック%dのイメージが不正な状態であるため復元できませんでした" -#: xlogreader.c:2100 xlogreader.c:2117 +#: xlogreader.c:2110 xlogreader.c:2127 #, 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:2126 +#: xlogreader.c:2136 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "%X/%Xでブロック%dのイメージが不明な方式で圧縮されているため復元できませんでした" -#: xlogreader.c:2134 +#: xlogreader.c:2144 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "%X/%Xのブロック%dが伸張できませんでした" diff -Nru postgresql-17-17.10/src/bin/pg_rewind/po/ru.po postgresql-17-17.11/src/bin/pg_rewind/po/ru.po --- postgresql-17-17.10/src/bin/pg_rewind/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_rewind/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,8 +6,8 @@ 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:20+0200\n" -"PO-Revision-Date: 2026-02-07 09:14+0200\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:104 +#: ../../common/controldata_utils.c:110 file_ops.c:364 local_source.c:104 #: local_source.c:163 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 @@ 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 @@ 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:76 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" #: ../../common/file_utils.c:120 ../../common/file_utils.c:566 -#: ../../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 @@ msgid "this build does not support sync method \"%s\"" msgstr "эта сборка программы не поддерживает метод синхронизации \"%s\"" -#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:411 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалось открыть каталог \"%s\": %m" -#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:485 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не удалось прочитать каталог \"%s\": %m" @@ -249,77 +259,112 @@ 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" diff -Nru postgresql-17-17.10/src/bin/pg_test_fsync/po/de.po postgresql-17-17.11/src/bin/pg_test_fsync/po/de.po --- postgresql-17-17.10/src/bin/pg_test_fsync/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_test_fsync/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,7 +6,7 @@ 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-07 09:34+0000\n" "PO-Revision-Date: 2024-05-26 22:03+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -36,17 +36,27 @@ 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 #, c-format diff -Nru postgresql-17-17.10/src/bin/pg_test_fsync/po/ru.po postgresql-17-17.11/src/bin/pg_test_fsync/po/ru.po --- postgresql-17-17.10/src/bin/pg_test_fsync/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_test_fsync/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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: 2024-09-02 09:29+0300\n" -"PO-Revision-Date: 2024-09-04 18:11+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:38 #, c-format diff -Nru postgresql-17-17.10/src/bin/pg_test_timing/po/de.po postgresql-17-17.11/src/bin/pg_test_timing/po/de.po --- postgresql-17-17.10/src/bin/pg_test_timing/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_test_timing/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 13\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-05 10:29+0000\n" +"POT-Creation-Date: 2026-08-07 09:30+0000\n" "PO-Revision-Date: 2021-04-12 16:37+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -18,17 +18,27 @@ "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 -Nru postgresql-17-17.10/src/bin/pg_test_timing/po/ja.po postgresql-17-17.11/src/bin/pg_test_timing/po/ja.po --- postgresql-17-17.10/src/bin/pg_test_timing/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_test_timing/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,9 +7,9 @@ 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:48+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 @@ "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 @@ #: 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 -Nru postgresql-17-17.10/src/bin/pg_test_timing/po/ru.po postgresql-17-17.11/src/bin/pg_test_timing/po/ru.po --- postgresql-17-17.10/src/bin/pg_test_timing/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_test_timing/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,8 +6,8 @@ msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-10 08:01+0300\n" -"PO-Revision-Date: 2026-05-10 08:31+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ "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" diff -Nru postgresql-17-17.10/src/bin/pg_upgrade/check.c postgresql-17-17.11/src/bin/pg_upgrade/check.c --- postgresql-17-17.10/src/bin/pg_upgrade/check.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_upgrade/check.c 2026-08-10 20:54:09.000000000 +0000 @@ -1816,6 +1816,7 @@ 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. */ @@ -1849,10 +1850,10 @@ 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); @@ -1861,7 +1862,85 @@ 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 -Nru postgresql-17-17.10/src/bin/pg_upgrade/po/de.po postgresql-17-17.11/src/bin/pg_upgrade/po/de.po --- postgresql-17-17.10/src/bin/pg_upgrade/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_upgrade/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-08-07 12:38+0000\n" +"POT-Creation-Date: 2026-08-07 09:30+0000\n" "PO-Revision-Date: 2025-08-07 23:48+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -15,17 +15,27 @@ "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" @@ -246,7 +256,7 @@ #: check.c:496 check.c:971 check.c:1144 check.c:1259 check.c:1353 check.c:1481 #: check.c:1557 check.c:1634 check.c:1700 check.c:1773 check.c:1952 #: check.c:1971 check.c:2040 check.c:2092 file.c:378 file.c:415 function.c:189 -#: option.c:493 version.c:79 version.c:177 +#: option.c:493 version.c:110 version.c:208 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" @@ -764,7 +774,7 @@ msgid "The target cluster lacks cluster state information:" msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:" -#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:558 pg_upgrade.c:598 +#: controldata.c:213 dump.c:54 exec.c:118 pg_upgrade.c:558 pg_upgrade.c:598 #: pg_upgrade.c:947 relfilenumber.c:233 server.c:34 util.c:337 #, c-format msgid "%s" @@ -995,7 +1005,7 @@ 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" @@ -1870,17 +1880,17 @@ msgid "linking \"%s\" to \"%s\"" msgstr "verknüpfe »%s« nach »%s«" -#: 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" @@ -1891,17 +1901,17 @@ "%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" @@ -1910,7 +1920,7 @@ "\n" "%s" -#: server.c:303 +#: server.c:305 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1919,7 +1929,7 @@ "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" @@ -1928,22 +1938,22 @@ "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 +#: server.c:370 #, 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" @@ -1987,17 +1997,17 @@ msgid "ok" msgstr "ok" -#: version.c:44 +#: version.c:75 #, c-format msgid "Checking for hash indexes" msgstr "Prüfe auf Hash-Indexe" -#: version.c:121 +#: version.c:152 #, c-format msgid "warning" msgstr "Warnung" -#: version.c:123 +#: version.c:154 #, c-format msgid "" "\n" @@ -2012,7 +2022,7 @@ "daher mit dem Befehl REINDEX reindiziert werden. Nach dem Upgrade\n" "werden Sie Anweisungen zum REINDEX erhalten." -#: version.c:129 +#: version.c:160 #, c-format msgid "" "\n" @@ -2032,17 +2042,17 @@ "ungültigen Indexe neu zu erzeugen. Bis dahin werden diese Indexe nicht\n" "verwendet werden." -#: version.c:153 +#: version.c:184 #, c-format msgid "Checking for extension updates" msgstr "Prüfe auf Aktualisierungen von Erweiterungen" -#: version.c:200 +#: version.c:231 #, c-format msgid "notice" msgstr "Hinweis" -#: version.c:201 +#: version.c:232 #, c-format msgid "" "\n" diff -Nru postgresql-17-17.10/src/bin/pg_upgrade/po/ru.po postgresql-17-17.11/src/bin/pg_upgrade/po/ru.po --- postgresql-17-17.10/src/bin/pg_upgrade/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_upgrade/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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: 2026-05-10 08:01+0300\n" -"PO-Revision-Date: 2025-08-09 07:24+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ "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" diff -Nru postgresql-17-17.10/src/bin/pg_upgrade/t/003_logical_slots.pl postgresql-17-17.11/src/bin/pg_upgrade/t/003_logical_slots.pl --- postgresql-17-17.10/src/bin/pg_upgrade/t/003_logical_slots.pl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_upgrade/t/003_logical_slots.pl 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/bin/pg_verifybackup/po/de.po postgresql-17-17.11/src/bin/pg_verifybackup/po/de.po --- postgresql-17-17.10/src/bin/pg_verifybackup/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_verifybackup/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-08-29 13:18+0000\n" +"POT-Creation-Date: 2026-08-07 09:28+0000\n" "PO-Revision-Date: 2024-08-29 16:47+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -92,7 +92,7 @@ msgstr "konnte Datei »%s« nicht fsyncen: %m" #: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 -#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:853 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -110,266 +110,276 @@ 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/jsonapi.c:2121 +#: ../../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:2175 msgid "Recursive descent parser cannot use incremental lexer." msgstr "Parser mit rekursivem Abstieg kann inkrementellen Lexer nicht benutzen." -#: ../../common/jsonapi.c:2123 +#: ../../common/jsonapi.c:2177 msgid "Incremental parser requires incremental lexer." msgstr "Inkrementeller Parser benötigt inkrementellen Lexer." -#: ../../common/jsonapi.c:2125 +#: ../../common/jsonapi.c:2179 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSON zu tief geschachtelt, maximale erlaubte Tiefe ist 6400." -#: ../../common/jsonapi.c:2127 +#: ../../common/jsonapi.c:2181 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Escape-Sequenz »\\%.*s« ist nicht gültig." -#: ../../common/jsonapi.c:2131 +#: ../../common/jsonapi.c:2185 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../../common/jsonapi.c:2135 +#: ../../common/jsonapi.c:2189 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ende der Eingabe erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2138 +#: ../../common/jsonapi.c:2192 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Array-Element oder »]« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2141 +#: ../../common/jsonapi.c:2195 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "»,« oder »]« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2144 +#: ../../common/jsonapi.c:2198 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "»:« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2147 +#: ../../common/jsonapi.c:2201 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON-Wert erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2150 +#: ../../common/jsonapi.c:2204 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../../common/jsonapi.c:2152 +#: ../../common/jsonapi.c:2206 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Zeichenkette oder »}« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2155 +#: ../../common/jsonapi.c:2209 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "»,« oder »}« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2158 +#: ../../common/jsonapi.c:2212 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Zeichenkette erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:2161 +#: ../../common/jsonapi.c:2215 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Token »%.*s« ist ungültig." -#: ../../common/jsonapi.c:2164 +#: ../../common/jsonapi.c:2218 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../../common/jsonapi.c:2166 +#: ../../common/jsonapi.c:2220 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../../common/jsonapi.c:2169 +#: ../../common/jsonapi.c:2223 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:2178 +#: ../../common/jsonapi.c:2232 #, 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:2185 +#: ../../common/jsonapi.c:2239 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen." -#: ../../common/jsonapi.c:2187 +#: ../../common/jsonapi.c:2241 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen." -#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 #, c-format msgid "could not initialize checksum of manifest" msgstr "konnte Prüfsumme des Manifests nicht initialisieren" -#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 msgid "manifest ended unexpectedly" msgstr "Manifest endete unerwartet" -#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 #, c-format msgid "could not update checksum of manifest" msgstr "konnte Prüfsumme des Manifests nicht aktualisieren" -#: ../../common/parse_manifest.c:302 +#: ../../common/parse_manifest.c:301 msgid "unexpected object start" msgstr "unerwarteter Objektstart" -#: ../../common/parse_manifest.c:337 +#: ../../common/parse_manifest.c:336 msgid "unexpected object end" msgstr "unerwartetes Objektende" -#: ../../common/parse_manifest.c:366 +#: ../../common/parse_manifest.c:365 msgid "unexpected array start" msgstr "unerwarteter Array-Start" -#: ../../common/parse_manifest.c:391 +#: ../../common/parse_manifest.c:390 msgid "unexpected array end" msgstr "unerwartetes Array-Ende" -#: ../../common/parse_manifest.c:418 +#: ../../common/parse_manifest.c:417 msgid "expected version indicator" msgstr "unerwartete Versionskennzeichnung" -#: ../../common/parse_manifest.c:454 +#: ../../common/parse_manifest.c:453 msgid "unrecognized top-level field" msgstr "unbekanntes Feld auf oberster Ebene" -#: ../../common/parse_manifest.c:473 +#: ../../common/parse_manifest.c:472 msgid "unexpected file field" msgstr "unerwartetes Feld für Datei" -#: ../../common/parse_manifest.c:487 +#: ../../common/parse_manifest.c:486 msgid "unexpected WAL range field" msgstr "unerwartetes Feld für WAL-Bereich" -#: ../../common/parse_manifest.c:493 +#: ../../common/parse_manifest.c:492 msgid "unexpected object field" msgstr "unbekanntes Feld für Objekt" -#: ../../common/parse_manifest.c:583 +#: ../../common/parse_manifest.c:582 msgid "unexpected scalar" msgstr "unerwarteter Skalar" -#: ../../common/parse_manifest.c:609 +#: ../../common/parse_manifest.c:608 msgid "manifest version not an integer" msgstr "Manifestversion ist keine ganze Zahl" -#: ../../common/parse_manifest.c:613 +#: ../../common/parse_manifest.c:612 msgid "unexpected manifest version" msgstr "unerwartete Manifestversion" -#: ../../common/parse_manifest.c:637 +#: ../../common/parse_manifest.c:636 msgid "system identifier in manifest not an integer" msgstr "Systemidentifikator im Manifest ist keine ganze Zahl" -#: ../../common/parse_manifest.c:662 +#: ../../common/parse_manifest.c:661 msgid "missing path name" msgstr "fehlender Pfadname" -#: ../../common/parse_manifest.c:665 +#: ../../common/parse_manifest.c:664 msgid "both path name and encoded path name" msgstr "sowohl Pfadname als auch kodierter Pfadname angegeben" -#: ../../common/parse_manifest.c:667 +#: ../../common/parse_manifest.c:666 msgid "missing size" msgstr "Größenangabe fehlt" -#: ../../common/parse_manifest.c:670 +#: ../../common/parse_manifest.c:669 msgid "checksum without algorithm" msgstr "Prüfsumme ohne Algorithmus" -#: ../../common/parse_manifest.c:684 +#: ../../common/parse_manifest.c:683 msgid "could not decode file name" msgstr "konnte Dateinamen nicht dekodieren" -#: ../../common/parse_manifest.c:694 +#: ../../common/parse_manifest.c:693 msgid "file size is not an integer" msgstr "Dateigröße ist keine ganze Zahl" -#: ../../common/parse_manifest.c:700 +#: ../../common/parse_manifest.c:699 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "unbekannter Prüfsummenalgorithmus: »%s«" -#: ../../common/parse_manifest.c:719 +#: ../../common/parse_manifest.c:718 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "ungültige Prüfsumme für Datei »%s«: »%s«" -#: ../../common/parse_manifest.c:762 +#: ../../common/parse_manifest.c:761 msgid "missing timeline" msgstr "Zeitleiste fehlt" -#: ../../common/parse_manifest.c:764 +#: ../../common/parse_manifest.c:763 msgid "missing start LSN" msgstr "Start-LSN fehlt" -#: ../../common/parse_manifest.c:766 +#: ../../common/parse_manifest.c:765 msgid "missing end LSN" msgstr "End-LSN fehlt" -#: ../../common/parse_manifest.c:772 +#: ../../common/parse_manifest.c:771 msgid "timeline is not an integer" msgstr "Zeitleiste ist keine ganze Zahl" -#: ../../common/parse_manifest.c:775 +#: ../../common/parse_manifest.c:774 msgid "could not parse start LSN" msgstr "konnte Start-LSN nicht parsen" -#: ../../common/parse_manifest.c:778 +#: ../../common/parse_manifest.c:777 msgid "could not parse end LSN" msgstr "konnte End-LSN nicht parsen" -#: ../../common/parse_manifest.c:843 +#: ../../common/parse_manifest.c:842 msgid "expected at least 2 lines" msgstr "mindestens 2 Zeilen erwartet" -#: ../../common/parse_manifest.c:846 +#: ../../common/parse_manifest.c:845 msgid "last line not newline-terminated" msgstr "letzte Zeile nicht durch Newline abgeschlossen" -#: ../../common/parse_manifest.c:865 +#: ../../common/parse_manifest.c:864 #, c-format msgid "could not finalize checksum of manifest" msgstr "konnte Prüfsumme des Manifests nicht abschließen" -#: ../../common/parse_manifest.c:869 +#: ../../common/parse_manifest.c:868 #, c-format msgid "manifest has no checksum" msgstr "Manifest hat keine Prüfsumme" -#: ../../common/parse_manifest.c:873 +#: ../../common/parse_manifest.c:872 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "ungültige Manifestprüfsumme: »%s«" -#: ../../common/parse_manifest.c:877 +#: ../../common/parse_manifest.c:876 #, c-format msgid "manifest checksum mismatch" msgstr "Manifestprüfsumme stimmt nicht überein" -#: ../../common/parse_manifest.c:892 +#: ../../common/parse_manifest.c:891 #, c-format msgid "could not parse backup manifest: %s" msgstr "konnte Backup-Manifest nicht parsen: %s" diff -Nru postgresql-17-17.10/src/bin/pg_verifybackup/po/ru.po postgresql-17-17.11/src/bin/pg_verifybackup/po/ru.po --- postgresql-17-17.10/src/bin/pg_verifybackup/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_verifybackup/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-05-10 08:01+0300\n" -"PO-Revision-Date: 2024-09-07 09:48+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+0300\n" +"PO-Revision-Date: 2026-08-05 07:51+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -110,17 +110,27 @@ 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/jsonapi.c:2175 msgid "Recursive descent parser cannot use incremental lexer." msgstr "" diff -Nru postgresql-17-17.10/src/bin/pg_waldump/po/de.po postgresql-17-17.11/src/bin/pg_waldump/po/de.po --- postgresql-17-17.10/src/bin/pg_waldump/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_waldump/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: pg_waldump (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-07 09:29+0000\n" "PO-Revision-Date: 2024-03-26 11:07+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -36,17 +36,27 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 #: pg_waldump.c:532 @@ -462,147 +472,147 @@ msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: xlogreader.c:669 xlogreader.c:1134 +#: xlogreader.c:669 xlogreader.c:1144 #, 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:758 +#: xlogreader.c:759 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: xlogreader.c:771 +#: xlogreader.c:772 #, 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:1142 +#: xlogreader.c:1152 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: xlogreader.c:1155 xlogreader.c:1171 +#: xlogreader.c:1165 xlogreader.c:1181 #, 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:1209 +#: xlogreader.c:1219 #, 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:1243 +#: xlogreader.c:1253 #, 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:1258 xlogreader.c:1300 +#: xlogreader.c:1268 xlogreader.c:1310 #, 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:1274 +#: xlogreader.c:1284 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu" -#: xlogreader.c:1282 +#: xlogreader.c:1292 #, 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:1288 +#: xlogreader.c:1298 #, 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:1320 +#: xlogreader.c:1330 #, 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:1346 +#: xlogreader.c:1356 #, 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:1749 +#: xlogreader.c:1759 #, 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:1773 +#: xlogreader.c:1783 #, 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:1780 +#: xlogreader.c:1790 #, 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:1816 +#: xlogreader.c:1826 #, 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:1832 +#: xlogreader.c:1842 #, 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:1846 +#: xlogreader.c:1856 #, 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:1861 +#: xlogreader.c:1871 #, 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:1877 +#: xlogreader.c:1887 #, 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:1889 +#: xlogreader.c:1899 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: xlogreader.c:1956 +#: xlogreader.c:1966 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: xlogreader.c:1982 +#: xlogreader.c:1992 #, 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:2066 +#: xlogreader.c:2076 #, 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:2073 +#: xlogreader.c:2083 #, 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:2100 xlogreader.c:2117 +#: xlogreader.c:2110 xlogreader.c:2127 #, 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:2126 +#: xlogreader.c:2136 #, 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:2134 +#: xlogreader.c:2144 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" diff -Nru postgresql-17-17.10/src/bin/pg_waldump/po/ru.po postgresql-17-17.11/src/bin/pg_waldump/po/ru.po --- postgresql-17-17.10/src/bin/pg_waldump/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_waldump/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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-02 11:37+0300\n" -"PO-Revision-Date: 2024-09-07 08:59+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 #: pg_waldump.c:532 diff -Nru postgresql-17-17.10/src/bin/pg_walsummary/meson.build postgresql-17-17.11/src/bin/pg_walsummary/meson.build --- postgresql-17-17.10/src/bin/pg_walsummary/meson.build 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_walsummary/meson.build 2026-08-10 20:54:09.000000000 +0000 @@ -25,6 +25,7 @@ 'tests': [ 't/001_basic.pl', 't/002_blocks.pl', + 't/003_tli_switch.pl', ], } } diff -Nru postgresql-17-17.10/src/bin/pg_walsummary/po/de.po postgresql-17-17.11/src/bin/pg_walsummary/po/de.po --- postgresql-17-17.10/src/bin/pg_walsummary/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_walsummary/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,7 +6,7 @@ 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-07 09:33+0000\n" "PO-Revision-Date: 2024-06-22 07:35+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -35,17 +35,27 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #: pg_walsummary.c:109 diff -Nru postgresql-17-17.10/src/bin/pg_walsummary/po/ru.po postgresql-17-17.11/src/bin/pg_walsummary/po/ru.po --- postgresql-17-17.10/src/bin/pg_walsummary/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_walsummary/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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: 2024-09-02 09:31+0300\n" -"PO-Revision-Date: 2024-09-05 14:47+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #: pg_walsummary.c:109 diff -Nru postgresql-17-17.10/src/bin/pg_walsummary/t/002_blocks.pl postgresql-17-17.11/src/bin/pg_walsummary/t/002_blocks.pl --- postgresql-17-17.10/src/bin/pg_walsummary/t/002_blocks.pl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_walsummary/t/002_blocks.pl 2026-08-10 20:54:09.000000000 +0000 @@ -85,13 +85,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 -Nru postgresql-17-17.10/src/bin/pg_walsummary/t/003_tli_switch.pl postgresql-17-17.11/src/bin/pg_walsummary/t/003_tli_switch.pl --- postgresql-17-17.10/src/bin/pg_walsummary/t/003_tli_switch.pl 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/bin/pg_walsummary/t/003_tli_switch.pl 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/bin/pgbench/pgbench.c postgresql-17-17.11/src/bin/pgbench/pgbench.c --- postgresql-17-17.10/src/bin/pgbench/pgbench.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pgbench/pgbench.c 2026-08-10 20:54:09.000000000 +0000 @@ -3601,22 +3601,19 @@ 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 @@ -3625,12 +3622,14 @@ 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); } /* @@ -6827,7 +6826,7 @@ 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 -Nru postgresql-17-17.10/src/bin/pgbench/t/002_pgbench_no_server.pl postgresql-17-17.11/src/bin/pgbench/t/002_pgbench_no_server.pl --- postgresql-17-17.10/src/bin/pgbench/t/002_pgbench_no_server.pl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/pgbench/t/002_pgbench_no_server.pl 2026-08-10 20:54:09.000000000 +0000 @@ -92,7 +92,7 @@ [ '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 -Nru postgresql-17-17.10/src/bin/psql/command.c postgresql-17-17.11/src/bin/psql/command.c --- postgresql-17-17.10/src/bin/psql/command.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/command.c 2026-08-10 20:54:09.000000000 +0000 @@ -2371,6 +2371,12 @@ 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') { @@ -2685,7 +2691,7 @@ { 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); @@ -2709,7 +2715,7 @@ } } else - ignore_slash_options(scan_state); + ignore_slash_whole_line(scan_state); return PSQL_CMD_SKIP_LINE; } @@ -3264,8 +3270,8 @@ * 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, @@ -3273,8 +3279,8 @@ { 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)); } /* @@ -3283,9 +3289,7 @@ * 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, @@ -3299,8 +3303,8 @@ 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 -Nru postgresql-17-17.10/src/bin/psql/common.c postgresql-17-17.11/src/bin/psql/common.c --- postgresql-17-17.10/src/bin/psql/common.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/common.c 2026-08-10 20:54:09.000000000 +0000 @@ -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 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, @@ -686,7 +688,11 @@ 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(); @@ -858,7 +864,7 @@ fflush(stdout); } - if (!SendQuery(query)) + if (!SendQuery(query, -1)) { /* Error - abandon execution if ON_ERROR_STOP */ success = false; @@ -889,8 +895,7 @@ * 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 @@ -931,8 +936,7 @@ 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), @@ -1076,10 +1080,14 @@ * 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; @@ -1173,7 +1181,11 @@ 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) @@ -1445,6 +1457,7 @@ 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) { @@ -1515,6 +1528,29 @@ 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) @@ -1603,14 +1639,15 @@ { FILE *copy_stream = NULL; - /* - * 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 */ @@ -1634,6 +1671,32 @@ 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 @@ -1819,6 +1882,24 @@ 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 -Nru postgresql-17-17.10/src/bin/psql/common.h postgresql-17-17.11/src/bin/psql/common.h --- postgresql-17-17.10/src/bin/psql/common.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/common.h 2026-08-10 20:54:09.000000000 +0000 @@ -34,7 +34,7 @@ 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 -Nru postgresql-17-17.10/src/bin/psql/copy.c postgresql-17-17.11/src/bin/psql/copy.c --- postgresql-17-17.10/src/bin/psql/copy.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/copy.c 2026-08-10 20:54:09.000000000 +0000 @@ -367,7 +367,7 @@ /* 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 @@ * 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 @@ 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 @@ /* 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 @@ if (buflen <= 0) break; - if (PQputCopyData(conn, buf, buflen) <= 0) + if (conn && PQputCopyData(conn, buf, buflen) <= 0) { OK = false; break; @@ -658,7 +661,7 @@ */ if (buflen >= COPYBUFSIZ - 5 || (copydone && buflen > 0)) { - if (PQputCopyData(conn, buf, buflen) <= 0) + if (conn && PQputCopyData(conn, buf, buflen) <= 0) { OK = false; break; @@ -679,7 +682,8 @@ * 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; @@ -696,6 +700,10 @@ */ 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 -Nru postgresql-17-17.10/src/bin/psql/describe.c postgresql-17-17.11/src/bin/psql/describe.c --- postgresql-17-17.10/src/bin/psql/describe.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/describe.c 2026-08-10 20:54:09.000000000 +0000 @@ -960,16 +960,20 @@ 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 -Nru postgresql-17-17.10/src/bin/psql/mainloop.c postgresql-17-17.11/src/bin/psql/mainloop.c --- postgresql-17-17.10/src/bin/psql/mainloop.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/mainloop.c 2026-08-10 20:54:09.000000000 +0000 @@ -436,7 +436,9 @@ /* 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 @@ 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 @@ /* 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 @@ 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 @@ /* 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 -Nru postgresql-17-17.10/src/bin/psql/po/de.po postgresql-17-17.11/src/bin/psql/po/de.po --- postgresql-17-17.10/src/bin/psql/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:35+0000\n" +"POT-Creation-Date: 2026-08-07 09:28+0000\n" "PO-Revision-Date: 2025-02-07 08:23+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -84,17 +84,27 @@ 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 @@ 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 %lld is equal to or exceeds maximum %lld.\n" msgstr "Kann Tabelleninhalt nicht ausgeben: Anzahl der Zellen %lld ist gleich oder überschreitet Maximum %lld.\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 %lld exceeded.\n" msgstr "Kann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %lld ü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" @@ -907,7 +917,7 @@ msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Zeit: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:626 common.c:683 common.c:1094 describe.c:6192 +#: common.c:626 common.c:683 common.c:1094 describe.c:6196 #, c-format msgid "You are currently not connected to a database." msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden." @@ -963,14 +973,14 @@ msgid "unexpected transaction status (%d)" msgstr "unerwarteter Transaktionsstatus (%d)" -#: common.c:1362 describe.c:2025 +#: common.c:1362 describe.c:2029 msgid "Column" msgstr "Spalte" -#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 -#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 -#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 -#: describe.c:5829 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1047 +#: describe.c:1205 describe.c:1735 describe.c:1759 describe.c:2030 +#: describe.c:3960 describe.c:4171 describe.c:4408 describe.c:4568 +#: describe.c:5833 msgid "Type" msgstr "Typ" @@ -1089,21 +1099,21 @@ msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: Spaltenname nicht gefunden: »%s«" -#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 -#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 -#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 -#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 -#: describe.c:5542 describe.c:5941 describe.c:6018 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1039 +#: describe.c:1194 describe.c:1268 describe.c:3949 describe.c:4158 +#: describe.c:4406 describe.c:4487 describe.c:4719 describe.c:4925 +#: describe.c:5169 describe.c:5410 describe.c:5479 describe.c:5490 +#: describe.c:5546 describe.c:5945 describe.c:6022 msgid "Schema" msgstr "Schema" #: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 -#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 -#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 -#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 -#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 -#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 -#: describe.c:6016 describe.c:6243 describe.c:6551 +#: describe.c:803 describe.c:924 describe.c:1040 describe.c:1269 +#: describe.c:3950 describe.c:4159 describe.c:4323 describe.c:4407 +#: describe.c:4488 describe.c:4649 describe.c:4720 describe.c:4926 +#: describe.c:5042 describe.c:5170 describe.c:5411 describe.c:5480 +#: describe.c:5491 describe.c:5547 describe.c:5744 describe.c:5814 +#: describe.c:6020 describe.c:6247 describe.c:6555 msgid "Name" msgstr "Name" @@ -1116,13 +1126,13 @@ msgstr "Argumentdatentypen" #: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 -#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 -#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 -#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 -#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 -#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 -#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 -#: describe.c:6019 describe.c:7078 +#: describe.c:658 describe.c:818 describe.c:975 describe.c:1271 describe.c:2050 +#: describe.c:3680 describe.c:4004 describe.c:4205 describe.c:4347 +#: describe.c:4420 describe.c:4497 describe.c:4662 describe.c:4838 +#: describe.c:4979 describe.c:5051 describe.c:5171 describe.c:5321 +#: describe.c:5362 describe.c:5427 describe.c:5483 describe.c:5492 +#: describe.c:5548 describe.c:5762 describe.c:5836 describe.c:5959 +#: describe.c:6023 describe.c:7082 msgid "Description" msgstr "Beschreibung" @@ -1139,11 +1149,11 @@ msgid "Index" msgstr "Index" -#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 +#: describe.c:168 describe.c:3968 describe.c:4184 describe.c:5946 msgid "Table" msgstr "Tabelle" -#: describe.c:176 describe.c:5742 +#: describe.c:176 describe.c:5746 msgid "Handler" msgstr "Handler" @@ -1151,11 +1161,11 @@ msgid "List of access methods" msgstr "Liste der Zugriffsmethoden" -#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 -#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 -#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 -#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 -#: describe.c:7066 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1193 +#: describe.c:3961 describe.c:4160 describe.c:4324 describe.c:4651 +#: describe.c:5043 describe.c:5745 describe.c:5815 describe.c:6248 +#: describe.c:6435 describe.c:6556 describe.c:6726 describe.c:6811 +#: describe.c:7070 msgid "Owner" msgstr "Eigentümer" @@ -1163,11 +1173,11 @@ msgid "Location" msgstr "Pfad" -#: describe.c:239 describe.c:3517 describe.c:3857 +#: describe.c:239 describe.c:3521 describe.c:3861 msgid "Options" msgstr "Optionen" -#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 +#: describe.c:240 describe.c:649 describe.c:973 describe.c:4003 msgid "Size" msgstr "Größe" @@ -1202,7 +1212,7 @@ msgid "func" msgstr "Funk" -#: describe.c:371 describe.c:1397 +#: describe.c:371 describe.c:1401 msgid "trigger" msgstr "Trigger" @@ -1282,8 +1292,8 @@ msgid "Result type" msgstr "Ergebnistyp" -#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 -#: describe.c:6996 describe.c:7000 +#: describe.c:811 describe.c:4657 describe.c:4821 describe.c:5320 +#: describe.c:7000 describe.c:7004 msgid "Function" msgstr "Funktion" @@ -1299,952 +1309,952 @@ msgid "Locale Provider" msgstr "Locale-Provider" -#: describe.c:938 describe.c:4936 +#: describe.c:938 describe.c:4940 msgid "Collate" msgstr "Sortierfolge" -#: describe.c:939 describe.c:4937 +#: describe.c:939 describe.c:4941 msgid "Ctype" msgstr "Zeichentyp" -#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 -#: describe.c:4950 +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4946 describe.c:4950 +#: describe.c:4954 msgid "Locale" msgstr "Locale" -#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 +#: describe.c:955 describe.c:959 describe.c:4959 describe.c:4963 msgid "ICU Rules" msgstr "ICU-Regeln" -#: describe.c:971 +#: describe.c:974 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:996 +#: describe.c:1000 msgid "List of databases" msgstr "Liste der Datenbanken" -#: describe.c:1037 describe.c:1192 describe.c:3947 +#: describe.c:1041 describe.c:1196 describe.c:3951 msgid "table" msgstr "Tabelle" -#: describe.c:1038 describe.c:3948 +#: describe.c:1042 describe.c:3952 msgid "view" msgstr "Sicht" -#: describe.c:1039 describe.c:3949 +#: describe.c:1043 describe.c:3953 msgid "materialized view" msgstr "materialisierte Sicht" -#: describe.c:1040 describe.c:1194 describe.c:3951 +#: describe.c:1044 describe.c:1198 describe.c:3955 msgid "sequence" msgstr "Sequenz" -#: describe.c:1041 describe.c:3953 +#: describe.c:1045 describe.c:3957 msgid "foreign table" msgstr "Fremdtabelle" -#: describe.c:1042 describe.c:3954 describe.c:4165 +#: describe.c:1046 describe.c:3958 describe.c:4169 msgid "partitioned table" msgstr "partitionierte Tabelle" -#: describe.c:1058 +#: describe.c:1062 msgid "Column privileges" msgstr "Spaltenprivilegien" -#: describe.c:1089 describe.c:1123 +#: describe.c:1093 describe.c:1127 msgid "Policies" msgstr "Policys" -#: describe.c:1151 describe.c:4570 describe.c:6667 +#: describe.c:1155 describe.c:4574 describe.c:6671 msgid "Access privileges" msgstr "Zugriffsprivilegien" -#: describe.c:1196 +#: describe.c:1200 msgid "function" msgstr "Funktion" -#: describe.c:1198 +#: describe.c:1202 msgid "type" msgstr "Typ" -#: describe.c:1200 +#: describe.c:1204 msgid "schema" msgstr "Schema" -#: describe.c:1222 +#: describe.c:1226 msgid "Default access privileges" msgstr "Vorgegebene Zugriffsprivilegien" -#: describe.c:1266 +#: describe.c:1270 msgid "Object" msgstr "Objekt" -#: describe.c:1280 +#: describe.c:1284 msgid "table constraint" msgstr "Tabellen-Constraint" -#: describe.c:1304 +#: describe.c:1308 msgid "domain constraint" msgstr "Domänen-Constraint" -#: describe.c:1328 +#: describe.c:1332 msgid "operator class" msgstr "Operatorklasse" -#: describe.c:1352 +#: describe.c:1356 msgid "operator family" msgstr "Operatorfamilie" -#: describe.c:1375 +#: describe.c:1379 msgid "rule" msgstr "Rule" -#: describe.c:1420 +#: describe.c:1424 msgid "Object descriptions" msgstr "Objektbeschreibungen" -#: describe.c:1485 describe.c:4072 +#: describe.c:1489 describe.c:4076 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Keine Relation namens »%s« gefunden" -#: describe.c:1488 describe.c:4075 +#: describe.c:1492 describe.c:4079 #, c-format msgid "Did not find any relations." msgstr "Keine Relationen gefunden" -#: describe.c:1684 +#: describe.c:1688 #, c-format msgid "Did not find any relation with OID %s." msgstr "Keine Relation mit OID %s gefunden" -#: describe.c:1732 describe.c:1756 +#: describe.c:1736 describe.c:1760 msgid "Start" msgstr "Start" -#: describe.c:1733 describe.c:1757 +#: describe.c:1737 describe.c:1761 msgid "Minimum" msgstr "Minimum" -#: describe.c:1734 describe.c:1758 +#: describe.c:1738 describe.c:1762 msgid "Maximum" msgstr "Maximum" -#: describe.c:1735 describe.c:1759 +#: describe.c:1739 describe.c:1763 msgid "Increment" msgstr "Inkrement" -#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 -#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 +#: describe.c:1740 describe.c:1764 describe.c:1893 describe.c:4491 +#: describe.c:4832 describe.c:4968 describe.c:4973 describe.c:6714 msgid "yes" msgstr "ja" -#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 -#: describe.c:4825 describe.c:4964 describe.c:6711 +#: describe.c:1741 describe.c:1765 describe.c:1894 describe.c:4491 +#: describe.c:4829 describe.c:4968 describe.c:6715 msgid "no" msgstr "nein" -#: describe.c:1738 describe.c:1762 +#: describe.c:1742 describe.c:1766 msgid "Cycles?" msgstr "Zyklisch?" -#: describe.c:1739 describe.c:1763 +#: describe.c:1743 describe.c:1767 msgid "Cache" msgstr "Cache" -#: describe.c:1804 +#: describe.c:1808 #, c-format msgid "Owned by: %s" msgstr "Eigentümer: %s" -#: describe.c:1808 +#: describe.c:1812 #, c-format msgid "Sequence for identity column: %s" msgstr "Sequenz für Identitätsspalte: %s" -#: describe.c:1816 +#: describe.c:1820 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "Ungeloggte Sequenz »%s.%s«" -#: describe.c:1819 +#: describe.c:1823 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Sequenz »%s.%s«" -#: describe.c:1962 +#: describe.c:1966 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ungeloggte Tabelle »%s.%s«" -#: describe.c:1965 +#: describe.c:1969 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabelle »%s.%s«" -#: describe.c:1969 +#: describe.c:1973 #, c-format msgid "View \"%s.%s\"" msgstr "Sicht »%s.%s«" -#: describe.c:1974 +#: describe.c:1978 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Ungeloggte materialisierte Sicht »%s.%s«" -#: describe.c:1977 +#: describe.c:1981 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialisierte Sicht »%s.%s«" -#: describe.c:1982 +#: describe.c:1986 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ungeloggter Index »%s.%s«" -#: describe.c:1985 +#: describe.c:1989 #, c-format msgid "Index \"%s.%s\"" msgstr "Index »%s.%s«" -#: describe.c:1990 +#: describe.c:1994 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ungeloggter partitionierter Index »%s.%s«" -#: describe.c:1993 +#: describe.c:1997 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Partitionierter Index »%s.%s«" -#: describe.c:1997 +#: describe.c:2001 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-Tabelle »%s.%s«" -#: describe.c:2001 +#: describe.c:2005 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Zusammengesetzter Typ »%s.%s«" -#: describe.c:2005 +#: describe.c:2009 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Fremdtabelle »%s.%s«" -#: describe.c:2010 +#: describe.c:2014 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Ungeloggte partitionierte Tabelle »%s.%s«" -#: describe.c:2013 +#: describe.c:2017 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Partitionierte Tabelle »%s.%s«" -#: describe.c:2029 describe.c:4405 +#: describe.c:2033 describe.c:4409 msgid "Collation" msgstr "Sortierfolge" -#: describe.c:2030 describe.c:4406 +#: describe.c:2034 describe.c:4410 msgid "Nullable" msgstr "NULL erlaubt?" -#: describe.c:2031 describe.c:4407 +#: describe.c:2035 describe.c:4411 msgid "Default" msgstr "Vorgabewert" -#: describe.c:2034 +#: describe.c:2038 msgid "Key?" msgstr "Schlüssel?" -#: describe.c:2036 describe.c:4723 describe.c:4734 +#: describe.c:2040 describe.c:4727 describe.c:4738 msgid "Definition" msgstr "Definition" -#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 -#: describe.c:5954 +#: describe.c:2042 describe.c:5761 describe.c:5835 describe.c:5900 +#: describe.c:5958 msgid "FDW options" msgstr "FDW-Optionen" -#: describe.c:2040 +#: describe.c:2044 msgid "Storage" msgstr "Speicherung" -#: describe.c:2042 +#: describe.c:2046 msgid "Compression" msgstr "Kompression" -#: describe.c:2044 +#: describe.c:2048 msgid "Stats target" msgstr "Statistikziel" -#: describe.c:2180 +#: describe.c:2184 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition von: %s %s%s" -#: describe.c:2193 +#: describe.c:2197 msgid "No partition constraint" msgstr "Kein Partitions-Constraint" -#: describe.c:2195 +#: describe.c:2199 #, c-format msgid "Partition constraint: %s" msgstr "Partitions-Constraint: %s" -#: describe.c:2219 +#: describe.c:2223 #, c-format msgid "Partition key: %s" msgstr "Partitionsschlüssel: %s" -#: describe.c:2245 +#: describe.c:2249 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Gehört zu Tabelle: »%s.%s«" -#: describe.c:2314 +#: describe.c:2318 msgid "primary key, " msgstr "Primärschlüssel, " -#: describe.c:2317 +#: describe.c:2321 msgid "unique" msgstr "unique" -#: describe.c:2319 +#: describe.c:2323 msgid " nulls not distinct" msgstr " nulls not distinct" -#: describe.c:2320 +#: describe.c:2324 msgid ", " msgstr ", " -#: describe.c:2327 +#: describe.c:2331 #, c-format msgid "for table \"%s.%s\"" msgstr "für Tabelle »%s.%s«" -#: describe.c:2331 +#: describe.c:2335 #, c-format msgid ", predicate (%s)" msgstr ", Prädikat (%s)" -#: describe.c:2334 +#: describe.c:2338 msgid ", clustered" msgstr ", geclustert" -#: describe.c:2337 +#: describe.c:2341 msgid ", invalid" msgstr ", ungültig" -#: describe.c:2340 +#: describe.c:2344 msgid ", deferrable" msgstr ", DEFERRABLE" -#: describe.c:2343 +#: describe.c:2347 msgid ", initially deferred" msgstr ", INITIALLY DEFERRED" -#: describe.c:2346 +#: describe.c:2350 msgid ", replica identity" msgstr ", Replika-Identität" -#: describe.c:2400 +#: describe.c:2404 msgid "Indexes:" msgstr "Indexe:" -#: describe.c:2483 +#: describe.c:2487 msgid "Check constraints:" msgstr "Check-Constraints:" -#: describe.c:2551 +#: describe.c:2555 msgid "Foreign-key constraints:" msgstr "Fremdschlüssel-Constraints:" -#: describe.c:2614 +#: describe.c:2618 msgid "Referenced by:" msgstr "Fremdschlüsselverweise von:" -#: describe.c:2664 +#: describe.c:2668 msgid "Policies:" msgstr "Policys:" -#: describe.c:2667 +#: describe.c:2671 msgid "Policies (forced row security enabled):" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen):" -#: describe.c:2670 +#: describe.c:2674 msgid "Policies (row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene eingeschaltet): (keine)" -#: describe.c:2673 +#: describe.c:2677 msgid "Policies (forced row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen): (keine)" -#: describe.c:2676 +#: describe.c:2680 msgid "Policies (row security disabled):" msgstr "Policys (Sicherheit auf Zeilenebene ausgeschaltet):" -#: describe.c:2736 describe.c:2841 +#: describe.c:2740 describe.c:2845 msgid "Statistics objects:" msgstr "Statistikobjekte:" -#: describe.c:2943 describe.c:3096 +#: describe.c:2947 describe.c:3100 msgid "Rules:" msgstr "Regeln:" -#: describe.c:2946 +#: describe.c:2950 msgid "Disabled rules:" msgstr "Abgeschaltete Regeln:" -#: describe.c:2949 +#: describe.c:2953 msgid "Rules firing always:" msgstr "Regeln, die immer aktiv werden:" -#: describe.c:2952 +#: describe.c:2956 msgid "Rules firing on replica only:" msgstr "Regeln, die nur im Replikat aktiv werden:" -#: describe.c:3031 describe.c:5100 +#: describe.c:3035 describe.c:5104 msgid "Publications:" msgstr "Publikationen:" -#: describe.c:3079 +#: describe.c:3083 msgid "View definition:" msgstr "Sichtdefinition:" -#: describe.c:3242 +#: describe.c:3246 msgid "Triggers:" msgstr "Trigger:" -#: describe.c:3245 +#: describe.c:3249 msgid "Disabled user triggers:" msgstr "Abgeschaltete Benutzer-Trigger:" -#: describe.c:3248 +#: describe.c:3252 msgid "Disabled internal triggers:" msgstr "Abgeschaltete interne Trigger:" -#: describe.c:3251 +#: describe.c:3255 msgid "Triggers firing always:" msgstr "Trigger, die immer aktiv werden:" -#: describe.c:3254 +#: describe.c:3258 msgid "Triggers firing on replica only:" msgstr "Trigger, die nur im Replikat aktiv werden:" -#: describe.c:3325 +#: describe.c:3329 #, c-format msgid "Server: %s" msgstr "Server: %s" -#: describe.c:3333 +#: describe.c:3337 #, c-format msgid "FDW options: (%s)" msgstr "FDW-Optionen: (%s)" -#: describe.c:3354 +#: describe.c:3358 msgid "Inherits" msgstr "Erbt von" -#: describe.c:3419 +#: describe.c:3423 #, c-format msgid "Number of partitions: %d" msgstr "Anzahl Partitionen: %d" -#: describe.c:3428 +#: describe.c:3432 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Anzahl Partitionen: %d (Mit \\d+ alle anzeigen.)" -#: describe.c:3430 +#: describe.c:3434 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Anzahl Kindtabellen: %d (Mit \\d+ alle anzeigen.)" -#: describe.c:3437 +#: describe.c:3441 msgid "Child tables" msgstr "Kindtabellen" -#: describe.c:3437 +#: describe.c:3441 msgid "Partitions" msgstr "Partitionen" -#: describe.c:3470 +#: describe.c:3474 #, c-format msgid "Typed table of type: %s" msgstr "Getypte Tabelle vom Typ: %s" -#: describe.c:3486 +#: describe.c:3490 msgid "Replica Identity" msgstr "Replika-Identität" -#: describe.c:3499 +#: describe.c:3503 msgid "Has OIDs: yes" msgstr "Hat OIDs: ja" -#: describe.c:3508 +#: describe.c:3512 #, c-format msgid "Access method: %s" msgstr "Zugriffsmethode: %s" -#: describe.c:3585 +#: describe.c:3589 #, 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:3597 +#: describe.c:3601 #, c-format msgid ", tablespace \"%s\"" msgstr ", Tablespace »%s«" -#: describe.c:3670 +#: describe.c:3674 msgid "List of roles" msgstr "Liste der Rollen" -#: describe.c:3672 describe.c:3840 +#: describe.c:3676 describe.c:3844 msgid "Role name" msgstr "Rollenname" -#: describe.c:3673 +#: describe.c:3677 msgid "Attributes" msgstr "Attribute" -#: describe.c:3684 +#: describe.c:3688 msgid "Superuser" msgstr "Superuser" -#: describe.c:3687 +#: describe.c:3691 msgid "No inheritance" msgstr "keine Vererbung" -#: describe.c:3690 +#: describe.c:3694 msgid "Create role" msgstr "Rolle erzeugen" -#: describe.c:3693 +#: describe.c:3697 msgid "Create DB" msgstr "DB erzeugen" -#: describe.c:3696 +#: describe.c:3700 msgid "Cannot login" msgstr "kann nicht einloggen" -#: describe.c:3699 +#: describe.c:3703 msgid "Replication" msgstr "Replikation" -#: describe.c:3703 +#: describe.c:3707 msgid "Bypass RLS" msgstr "Bypass RLS" -#: describe.c:3712 +#: describe.c:3716 msgid "No connections" msgstr "keine Verbindungen" -#: describe.c:3714 +#: describe.c:3718 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d Verbindung" msgstr[1] "%d Verbindungen" -#: describe.c:3724 +#: describe.c:3728 msgid "Password valid until " msgstr "Passwort gültig bis " -#: describe.c:3775 +#: describe.c:3779 msgid "Role" msgstr "Rolle" -#: describe.c:3776 +#: describe.c:3780 msgid "Database" msgstr "Datenbank" -#: describe.c:3777 +#: describe.c:3781 msgid "Settings" msgstr "Einstellung" -#: describe.c:3801 +#: describe.c:3805 #, 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:3804 +#: describe.c:3808 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Keine Einstellungen für Rolle »%s« gefunden" -#: describe.c:3807 +#: describe.c:3811 #, c-format msgid "Did not find any settings." msgstr "Keine Einstellungen gefunden" -#: describe.c:3811 +#: describe.c:3815 msgid "List of settings" msgstr "Liste der Einstellungen" -#: describe.c:3841 +#: describe.c:3845 msgid "Member of" msgstr "Mitglied von" -#: describe.c:3858 +#: describe.c:3862 msgid "Grantor" msgstr "Grantor" -#: describe.c:3884 +#: describe.c:3888 msgid "List of role grants" msgstr "Liste der Rollen-Grants" -#: describe.c:3950 +#: describe.c:3954 msgid "index" msgstr "Index" -#: describe.c:3952 +#: describe.c:3956 msgid "TOAST table" msgstr "TOAST-Tabelle" -#: describe.c:3955 describe.c:4166 +#: describe.c:3959 describe.c:4170 msgid "partitioned index" msgstr "partitionierter Index" -#: describe.c:3975 +#: describe.c:3979 msgid "permanent" msgstr "permanent" -#: describe.c:3976 +#: describe.c:3980 msgid "temporary" msgstr "temporär" -#: describe.c:3977 +#: describe.c:3981 msgid "unlogged" msgstr "ungeloggt" -#: describe.c:3978 +#: describe.c:3982 msgid "Persistence" msgstr "Persistenz" -#: describe.c:3994 +#: describe.c:3998 msgid "Access method" msgstr "Zugriffsmethode" -#: describe.c:4079 +#: describe.c:4083 msgid "List of relations" msgstr "Liste der Relationen" -#: describe.c:4127 +#: describe.c:4131 #, 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:4138 +#: describe.c:4142 msgid "List of partitioned indexes" msgstr "Liste partitionierter Indexe" -#: describe.c:4140 +#: describe.c:4144 msgid "List of partitioned tables" msgstr "Liste partitionierte Tabellen" -#: describe.c:4144 +#: describe.c:4148 msgid "List of partitioned relations" msgstr "Liste partitionierter Relationen" -#: describe.c:4175 +#: describe.c:4179 msgid "Parent name" msgstr "Elternname" -#: describe.c:4188 +#: describe.c:4192 msgid "Leaf partition size" msgstr "Größe Leaf-Partition" -#: describe.c:4191 describe.c:4197 +#: describe.c:4195 describe.c:4201 msgid "Total size" msgstr "Gesamtgröße" -#: describe.c:4321 +#: describe.c:4325 msgid "Trusted" msgstr "Vertraut" -#: describe.c:4330 +#: describe.c:4334 msgid "Internal language" msgstr "Interne Sprache" -#: describe.c:4331 +#: describe.c:4335 msgid "Call handler" msgstr "Call-Handler" -#: describe.c:4332 describe.c:5743 +#: describe.c:4336 describe.c:5747 msgid "Validator" msgstr "Validator" -#: describe.c:4333 +#: describe.c:4337 msgid "Inline handler" msgstr "Inline-Handler" -#: describe.c:4367 +#: describe.c:4371 msgid "List of languages" msgstr "Liste der Sprachen" -#: describe.c:4408 +#: describe.c:4412 msgid "Check" msgstr "Check" -#: describe.c:4451 +#: describe.c:4455 msgid "List of domains" msgstr "Liste der Domänen" -#: describe.c:4485 +#: describe.c:4489 msgid "Source" msgstr "Quelle" -#: describe.c:4486 +#: describe.c:4490 msgid "Destination" msgstr "Ziel" -#: describe.c:4488 describe.c:6712 +#: describe.c:4492 describe.c:6716 msgid "Default?" msgstr "Standard?" -#: describe.c:4529 +#: describe.c:4533 msgid "List of conversions" msgstr "Liste der Konversionen" -#: describe.c:4557 +#: describe.c:4561 msgid "Parameter" msgstr "Parameter" -#: describe.c:4558 +#: describe.c:4562 msgid "Value" msgstr "Wert" -#: describe.c:4565 +#: describe.c:4569 msgid "Context" msgstr "Kontext" -#: describe.c:4597 +#: describe.c:4601 msgid "List of configuration parameters" msgstr "Liste der Konfigurationsparameter" -#: describe.c:4599 +#: describe.c:4603 msgid "List of non-default configuration parameters" msgstr "Liste der veränderten Konfigurationsparameter" -#: describe.c:4626 +#: describe.c:4630 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Der Server (Version %s) unterstützt keine Ereignistrigger." -#: describe.c:4646 +#: describe.c:4650 msgid "Event" msgstr "Ereignis" -#: describe.c:4648 +#: describe.c:4652 msgid "enabled" msgstr "eingeschaltet" -#: describe.c:4649 +#: describe.c:4653 msgid "replica" msgstr "Replika" -#: describe.c:4650 +#: describe.c:4654 msgid "always" msgstr "immer" -#: describe.c:4651 +#: describe.c:4655 msgid "disabled" msgstr "ausgeschaltet" -#: describe.c:4652 describe.c:6553 +#: describe.c:4656 describe.c:6557 msgid "Enabled" msgstr "Eingeschaltet" -#: describe.c:4654 +#: describe.c:4658 msgid "Tags" msgstr "Tags" -#: describe.c:4677 +#: describe.c:4681 msgid "List of event triggers" msgstr "Liste der Ereignistrigger" -#: describe.c:4704 +#: describe.c:4708 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Der Server (Version %s) unterstützt keine erweiterten Statistiken." -#: describe.c:4741 +#: describe.c:4745 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4742 +#: describe.c:4746 msgid "Dependencies" msgstr "Abhängigkeiten" -#: describe.c:4752 +#: describe.c:4756 msgid "MCV" msgstr "MCV" -#: describe.c:4775 +#: describe.c:4779 msgid "List of extended statistics" msgstr "Liste der erweiterten Statistiken" -#: describe.c:4802 +#: describe.c:4806 msgid "Source type" msgstr "Quelltyp" -#: describe.c:4803 +#: describe.c:4807 msgid "Target type" msgstr "Zieltyp" -#: describe.c:4827 +#: describe.c:4831 msgid "in assignment" msgstr "in Zuweisung" -#: describe.c:4829 +#: describe.c:4833 msgid "Implicit?" msgstr "Implizit?" -#: describe.c:4887 +#: describe.c:4891 msgid "List of casts" msgstr "Liste der Typumwandlungen" -#: describe.c:4927 describe.c:4931 +#: describe.c:4931 describe.c:4935 msgid "Provider" msgstr "Provider" -#: describe.c:4965 describe.c:4970 +#: describe.c:4969 describe.c:4974 msgid "Deterministic?" msgstr "Deterministisch?" -#: describe.c:5009 +#: describe.c:5013 msgid "List of collations" msgstr "Liste der Sortierfolgen" -#: describe.c:5070 +#: describe.c:5074 msgid "List of schemas" msgstr "Liste der Schemas" -#: describe.c:5186 +#: describe.c:5190 msgid "List of text search parsers" msgstr "Liste der Textsucheparser" -#: describe.c:5236 +#: describe.c:5240 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Kein Textsucheparser namens »%s« gefunden" -#: describe.c:5239 +#: describe.c:5243 #, c-format msgid "Did not find any text search parsers." msgstr "Keine Textsucheparser gefunden" -#: describe.c:5314 +#: describe.c:5318 msgid "Start parse" msgstr "Parsen starten" -#: describe.c:5315 +#: describe.c:5319 msgid "Method" msgstr "Methode" -#: describe.c:5319 +#: describe.c:5323 msgid "Get next token" msgstr "Nächstes Token lesen" -#: describe.c:5321 +#: describe.c:5325 msgid "End parse" msgstr "Parsen beenden" -#: describe.c:5323 +#: describe.c:5327 msgid "Get headline" msgstr "Überschrift ermitteln" -#: describe.c:5325 +#: describe.c:5329 msgid "Get token types" msgstr "Tokentypen ermitteln" -#: describe.c:5335 +#: describe.c:5339 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Textsucheparser »%s.%s«" -#: describe.c:5338 +#: describe.c:5342 #, c-format msgid "Text search parser \"%s\"" msgstr "Textsucheparser »%s«" -#: describe.c:5357 +#: describe.c:5361 msgid "Token name" msgstr "Tokenname" -#: describe.c:5370 +#: describe.c:5374 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Tokentypen für Parser »%s.%s«" -#: describe.c:5373 +#: describe.c:5377 #, c-format msgid "Token types for parser \"%s\"" msgstr "Tokentypen für Parser »%s«" -#: describe.c:5417 +#: describe.c:5421 msgid "Template" msgstr "Vorlage" -#: describe.c:5418 +#: describe.c:5422 msgid "Init options" msgstr "Initialisierungsoptionen" -#: describe.c:5444 +#: describe.c:5448 msgid "List of text search dictionaries" msgstr "Liste der Textsuchewörterbücher" -#: describe.c:5477 +#: describe.c:5481 msgid "Init" msgstr "Init" -#: describe.c:5478 +#: describe.c:5482 msgid "Lexize" msgstr "Lexize" -#: describe.c:5509 +#: describe.c:5513 msgid "List of text search templates" msgstr "Liste der Textsuchevorlagen" -#: describe.c:5563 +#: describe.c:5567 msgid "List of text search configurations" msgstr "Liste der Textsuchekonfigurationen" -#: describe.c:5614 +#: describe.c:5618 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Keine Textsuchekonfiguration namens »%s« gefunden" -#: describe.c:5617 +#: describe.c:5621 #, c-format msgid "Did not find any text search configurations." msgstr "Keine Textsuchekonfigurationen gefunden" -#: describe.c:5683 +#: describe.c:5687 msgid "Token" msgstr "Token" -#: describe.c:5684 +#: describe.c:5688 msgid "Dictionaries" msgstr "Wörterbücher" -#: describe.c:5695 +#: describe.c:5699 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Textsuchekonfiguration »%s.%s«" -#: describe.c:5698 +#: describe.c:5702 #, c-format msgid "Text search configuration \"%s\"" msgstr "Textsuchekonfiguration »%s«" -#: describe.c:5702 +#: describe.c:5706 #, c-format msgid "" "\n" @@ -2253,7 +2263,7 @@ "\n" "Parser: »%s.%s«" -#: describe.c:5705 +#: describe.c:5709 #, c-format msgid "" "\n" @@ -2262,269 +2272,269 @@ "\n" "Parser: »%s«" -#: describe.c:5784 +#: describe.c:5788 msgid "List of foreign-data wrappers" msgstr "Liste der Fremddaten-Wrapper" -#: describe.c:5812 +#: describe.c:5816 msgid "Foreign-data wrapper" msgstr "Fremddaten-Wrapper" -#: describe.c:5830 describe.c:6017 +#: describe.c:5834 describe.c:6021 msgid "Version" msgstr "Version" -#: describe.c:5860 +#: describe.c:5864 msgid "List of foreign servers" msgstr "Liste der Fremdserver" -#: describe.c:5885 describe.c:5943 +#: describe.c:5889 describe.c:5947 msgid "Server" msgstr "Server" -#: describe.c:5886 +#: describe.c:5890 msgid "User name" msgstr "Benutzername" -#: describe.c:5915 +#: describe.c:5919 msgid "List of user mappings" msgstr "Liste der Benutzerabbildungen" -#: describe.c:5987 +#: describe.c:5991 msgid "List of foreign tables" msgstr "Liste der Fremdtabellen" -#: describe.c:6038 +#: describe.c:6042 msgid "List of installed extensions" msgstr "Liste der installierten Erweiterungen" -#: describe.c:6086 +#: describe.c:6090 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Keine Erweiterung namens »%s« gefunden" -#: describe.c:6089 +#: describe.c:6093 #, c-format msgid "Did not find any extensions." msgstr "Keine Erweiterungen gefunden" -#: describe.c:6133 +#: describe.c:6137 msgid "Object description" msgstr "Objektbeschreibung" -#: describe.c:6142 +#: describe.c:6146 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objekte in Erweiterung »%s«" -#: describe.c:6183 +#: describe.c:6187 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" -#: describe.c:6197 +#: describe.c:6201 #, c-format msgid "cross-database references are not implemented: %s" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" -#: describe.c:6228 describe.c:6354 +#: describe.c:6232 describe.c:6358 #, c-format msgid "The server (version %s) does not support publications." msgstr "Der Server (Version %s) unterstützt keine Publikationen." -#: describe.c:6245 describe.c:6432 +#: describe.c:6249 describe.c:6436 msgid "All tables" msgstr "Alle Tabellen" -#: describe.c:6246 describe.c:6433 +#: describe.c:6250 describe.c:6437 msgid "Inserts" msgstr "Inserts" -#: describe.c:6247 describe.c:6434 +#: describe.c:6251 describe.c:6438 msgid "Updates" msgstr "Updates" -#: describe.c:6248 describe.c:6435 +#: describe.c:6252 describe.c:6439 msgid "Deletes" msgstr "Deletes" -#: describe.c:6252 describe.c:6437 +#: describe.c:6256 describe.c:6441 msgid "Truncates" msgstr "Truncates" -#: describe.c:6256 describe.c:6439 +#: describe.c:6260 describe.c:6443 msgid "Via root" msgstr "Über Wurzel" -#: describe.c:6277 +#: describe.c:6281 msgid "List of publications" msgstr "Liste der Publikationen" -#: describe.c:6401 +#: describe.c:6405 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Keine Publikation namens »%s« gefunden" -#: describe.c:6404 +#: describe.c:6408 #, c-format msgid "Did not find any publications." msgstr "Keine Publikationen gefunden" -#: describe.c:6428 +#: describe.c:6432 #, c-format msgid "Publication %s" msgstr "Publikation %s" -#: describe.c:6481 +#: describe.c:6485 msgid "Tables:" msgstr "Tabellen:" -#: describe.c:6493 +#: describe.c:6497 msgid "Tables from schemas:" msgstr "Tabellen aus Schemas:" -#: describe.c:6538 +#: describe.c:6542 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Der Server (Version %s) unterstützt keine Subskriptionen." -#: describe.c:6554 +#: describe.c:6558 msgid "Publication" msgstr "Publikation" -#: describe.c:6563 +#: describe.c:6567 msgid "Binary" msgstr "Binär" -#: describe.c:6572 describe.c:6576 +#: describe.c:6576 describe.c:6580 msgid "Streaming" msgstr "Streaming" -#: describe.c:6584 +#: describe.c:6588 msgid "Two-phase commit" msgstr "Two-Phase-Commit" -#: describe.c:6585 +#: describe.c:6589 msgid "Disable on error" msgstr "Bei Fehler abschalten" -#: describe.c:6592 +#: describe.c:6596 msgid "Origin" msgstr "Herkunft" -#: describe.c:6593 +#: describe.c:6597 msgid "Password required" msgstr "Passwort nötig" -#: describe.c:6594 +#: describe.c:6598 msgid "Run as owner?" msgstr "Als Eigentümer ausführen?" -#: describe.c:6599 +#: describe.c:6603 msgid "Failover" msgstr "Failover" -#: describe.c:6604 +#: describe.c:6608 msgid "Synchronous commit" msgstr "Synchroner Commit" -#: describe.c:6605 +#: describe.c:6609 msgid "Conninfo" msgstr "Verbindungsinfo" -#: describe.c:6611 +#: describe.c:6615 msgid "Skip LSN" msgstr "Skip-LSN" -#: describe.c:6637 +#: describe.c:6641 msgid "List of subscriptions" msgstr "Liste der Subskriptionen" -#: describe.c:6666 +#: describe.c:6670 msgid "(none)" msgstr "(keine)" -#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 +#: describe.c:6710 describe.c:6805 describe.c:6897 describe.c:6991 msgid "AM" msgstr "AM" -#: describe.c:6707 +#: describe.c:6711 msgid "Input type" msgstr "Eingabetyp" -#: describe.c:6708 +#: describe.c:6712 msgid "Storage type" msgstr "Storage-Typ" -#: describe.c:6709 +#: describe.c:6713 msgid "Operator class" msgstr "Operatorklasse" -#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 +#: describe.c:6725 describe.c:6806 describe.c:6898 describe.c:6992 msgid "Operator family" msgstr "Operatorfamilie" -#: describe.c:6756 +#: describe.c:6760 msgid "List of operator classes" msgstr "Liste der Operatorklassen" -#: describe.c:6803 +#: describe.c:6807 msgid "Applicable types" msgstr "Passende Typen" -#: describe.c:6844 +#: describe.c:6848 msgid "List of operator families" msgstr "Liste der Operatorfamilien" -#: describe.c:6895 +#: describe.c:6899 msgid "Operator" msgstr "Operator" -#: describe.c:6896 +#: describe.c:6900 msgid "Strategy" msgstr "Strategie" -#: describe.c:6897 +#: describe.c:6901 msgid "ordering" msgstr "Sortieren" -#: describe.c:6898 +#: describe.c:6902 msgid "search" msgstr "Suchen" -#: describe.c:6899 +#: describe.c:6903 msgid "Purpose" msgstr "Zweck" -#: describe.c:6904 +#: describe.c:6908 msgid "Sort opfamily" msgstr "Sortier-Opfamilie" -#: describe.c:6942 +#: describe.c:6946 msgid "List of operators of operator families" msgstr "Liste der Operatoren in Operatorfamilien" -#: describe.c:6989 +#: describe.c:6993 msgid "Registered left type" msgstr "Registrierter linker Typ" -#: describe.c:6990 +#: describe.c:6994 msgid "Registered right type" msgstr "Registrierter rechter Typ" -#: describe.c:6991 +#: describe.c:6995 msgid "Number" msgstr "Nummer" -#: describe.c:7034 +#: describe.c:7038 msgid "List of support functions of operator families" msgstr "Liste der Unterstützungsfunktionen in Operatorfamilien" -#: describe.c:7065 +#: describe.c:7069 msgid "ID" msgstr "ID" -#: describe.c:7085 +#: describe.c:7089 msgid "Large objects" msgstr "Large Objects" diff -Nru postgresql-17-17.10/src/bin/psql/po/ru.po postgresql-17-17.11/src/bin/psql/po/ru.po --- postgresql-17-17.10/src/bin/psql/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: psql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 11:39+0200\n" -"PO-Revision-Date: 2026-02-07 09:12+0200\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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[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 %lld is equal to or exceeds " @@ -173,19 +183,19 @@ "Вывести содержимое таблицы нельзя: число ячеек %lld достигло максимума " "%lld.\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 %lld exceeded.\n" msgstr "" "Ошибка добавления ячейки в таблицу: превышен предел числа ячеек (%lld).\n" -#: ../../fe_utils/print.c:3530 +#: ../../fe_utils/print.c:3531 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутренняя ошибка): %d" @@ -983,7 +993,7 @@ msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Время: %.3f мс (%.0f д. %02d:%02d:%06.3f)\n" -#: common.c:626 common.c:683 common.c:1094 describe.c:6192 +#: common.c:626 common.c:683 common.c:1094 describe.c:6196 #, c-format msgid "You are currently not connected to a database." msgstr "В данный момент вы не подключены к базе данных." @@ -1049,14 +1059,14 @@ msgid "unexpected transaction status (%d)" msgstr "неожиданное состояние транзакции (%d)" -#: common.c:1362 describe.c:2025 +#: common.c:1362 describe.c:2029 msgid "Column" msgstr "Столбец" -#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 -#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 -#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 -#: describe.c:5829 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1047 +#: describe.c:1205 describe.c:1735 describe.c:1759 describe.c:2030 +#: describe.c:3960 describe.c:4171 describe.c:4408 describe.c:4568 +#: describe.c:5833 msgid "Type" msgstr "Тип" @@ -1186,21 +1196,21 @@ msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: имя столбца не найдено: \"%s\"" -#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 -#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 -#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 -#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 -#: describe.c:5542 describe.c:5941 describe.c:6018 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1039 +#: describe.c:1194 describe.c:1268 describe.c:3949 describe.c:4158 +#: describe.c:4406 describe.c:4487 describe.c:4719 describe.c:4925 +#: describe.c:5169 describe.c:5410 describe.c:5479 describe.c:5490 +#: describe.c:5546 describe.c:5945 describe.c:6022 msgid "Schema" msgstr "Схема" #: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 -#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 -#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 -#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 -#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 -#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 -#: describe.c:6016 describe.c:6243 describe.c:6551 +#: describe.c:803 describe.c:924 describe.c:1040 describe.c:1269 +#: describe.c:3950 describe.c:4159 describe.c:4323 describe.c:4407 +#: describe.c:4488 describe.c:4649 describe.c:4720 describe.c:4926 +#: describe.c:5042 describe.c:5170 describe.c:5411 describe.c:5480 +#: describe.c:5491 describe.c:5547 describe.c:5744 describe.c:5814 +#: describe.c:6020 describe.c:6247 describe.c:6555 msgid "Name" msgstr "Имя" @@ -1213,13 +1223,13 @@ msgstr "Типы данных аргументов" #: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 -#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 -#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 -#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 -#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 -#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 -#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 -#: describe.c:6019 describe.c:7078 +#: describe.c:658 describe.c:818 describe.c:975 describe.c:1271 describe.c:2050 +#: describe.c:3680 describe.c:4004 describe.c:4205 describe.c:4347 +#: describe.c:4420 describe.c:4497 describe.c:4662 describe.c:4838 +#: describe.c:4979 describe.c:5051 describe.c:5171 describe.c:5321 +#: describe.c:5362 describe.c:5427 describe.c:5483 describe.c:5492 +#: describe.c:5548 describe.c:5762 describe.c:5836 describe.c:5959 +#: describe.c:6023 describe.c:7082 msgid "Description" msgstr "Описание" @@ -1236,11 +1246,11 @@ msgid "Index" msgstr "Индекс" -#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 +#: describe.c:168 describe.c:3968 describe.c:4184 describe.c:5946 msgid "Table" msgstr "Таблица" -#: describe.c:176 describe.c:5742 +#: describe.c:176 describe.c:5746 msgid "Handler" msgstr "Обработчик" @@ -1248,11 +1258,11 @@ msgid "List of access methods" msgstr "Список методов доступа" -#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 -#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 -#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 -#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 -#: describe.c:7066 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1193 +#: describe.c:3961 describe.c:4160 describe.c:4324 describe.c:4651 +#: describe.c:5043 describe.c:5745 describe.c:5815 describe.c:6248 +#: describe.c:6435 describe.c:6556 describe.c:6726 describe.c:6811 +#: describe.c:7070 msgid "Owner" msgstr "Владелец" @@ -1260,11 +1270,11 @@ msgid "Location" msgstr "Расположение" -#: describe.c:239 describe.c:3517 describe.c:3857 +#: describe.c:239 describe.c:3521 describe.c:3861 msgid "Options" msgstr "Параметры" -#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 +#: describe.c:240 describe.c:649 describe.c:973 describe.c:4003 msgid "Size" msgstr "Размер" @@ -1301,7 +1311,7 @@ msgid "func" msgstr "функ." -#: describe.c:371 describe.c:1397 +#: describe.c:371 describe.c:1401 msgid "trigger" msgstr "триггерная" @@ -1381,8 +1391,8 @@ msgid "Result type" msgstr "Результирующий тип" -#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 -#: describe.c:6996 describe.c:7000 +#: describe.c:811 describe.c:4657 describe.c:4821 describe.c:5320 +#: describe.c:7000 describe.c:7004 msgid "Function" msgstr "Функция" @@ -1398,556 +1408,556 @@ msgid "Locale Provider" msgstr "Провайдер локали" -#: describe.c:938 describe.c:4936 +#: describe.c:938 describe.c:4940 msgid "Collate" msgstr "LC_COLLATE" -#: describe.c:939 describe.c:4937 +#: describe.c:939 describe.c:4941 msgid "Ctype" msgstr "LC_CTYPE" -#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 -#: describe.c:4950 +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4946 describe.c:4950 +#: describe.c:4954 msgid "Locale" msgstr "Локаль" -#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 +#: describe.c:955 describe.c:959 describe.c:4959 describe.c:4963 msgid "ICU Rules" msgstr "Правила ICU" -#: describe.c:971 +#: describe.c:974 msgid "Tablespace" msgstr "Табл. пространство" -#: describe.c:996 +#: describe.c:1000 msgid "List of databases" msgstr "Список баз данных" -#: describe.c:1037 describe.c:1192 describe.c:3947 +#: describe.c:1041 describe.c:1196 describe.c:3951 msgid "table" msgstr "таблица" -#: describe.c:1038 describe.c:3948 +#: describe.c:1042 describe.c:3952 msgid "view" msgstr "представление" -#: describe.c:1039 describe.c:3949 +#: describe.c:1043 describe.c:3953 msgid "materialized view" msgstr "материализованное представление" -#: describe.c:1040 describe.c:1194 describe.c:3951 +#: describe.c:1044 describe.c:1198 describe.c:3955 msgid "sequence" msgstr "последовательность" -#: describe.c:1041 describe.c:3953 +#: describe.c:1045 describe.c:3957 msgid "foreign table" msgstr "сторонняя таблица" -#: describe.c:1042 describe.c:3954 describe.c:4165 +#: describe.c:1046 describe.c:3958 describe.c:4169 msgid "partitioned table" msgstr "секционированная таблица" -#: describe.c:1058 +#: describe.c:1062 msgid "Column privileges" msgstr "Права для столбцов" -#: describe.c:1089 describe.c:1123 +#: describe.c:1093 describe.c:1127 msgid "Policies" msgstr "Политики" -#: describe.c:1151 describe.c:4570 describe.c:6667 +#: describe.c:1155 describe.c:4574 describe.c:6671 msgid "Access privileges" msgstr "Права доступа" -#: describe.c:1196 +#: describe.c:1200 msgid "function" msgstr "функция" -#: describe.c:1198 +#: describe.c:1202 msgid "type" msgstr "тип" -#: describe.c:1200 +#: describe.c:1204 msgid "schema" msgstr "схема" -#: describe.c:1222 +#: describe.c:1226 msgid "Default access privileges" msgstr "Права доступа по умолчанию" -#: describe.c:1266 +#: describe.c:1270 msgid "Object" msgstr "Объект" -#: describe.c:1280 +#: describe.c:1284 msgid "table constraint" msgstr "ограничение таблицы" -#: describe.c:1304 +#: describe.c:1308 msgid "domain constraint" msgstr "ограничение домена" -#: describe.c:1328 +#: describe.c:1332 msgid "operator class" msgstr "класс операторов" -#: describe.c:1352 +#: describe.c:1356 msgid "operator family" msgstr "семейство операторов" -#: describe.c:1375 +#: describe.c:1379 msgid "rule" msgstr "правило" -#: describe.c:1420 +#: describe.c:1424 msgid "Object descriptions" msgstr "Описание объекта" -#: describe.c:1485 describe.c:4072 +#: describe.c:1489 describe.c:4076 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Отношение \"%s\" не найдено." -#: describe.c:1488 describe.c:4075 +#: describe.c:1492 describe.c:4079 #, c-format msgid "Did not find any relations." msgstr "Отношения не найдены." -#: describe.c:1684 +#: describe.c:1688 #, c-format msgid "Did not find any relation with OID %s." msgstr "Отношение с OID %s не найдено." -#: describe.c:1732 describe.c:1756 +#: describe.c:1736 describe.c:1760 msgid "Start" msgstr "Начальное_значение" -#: describe.c:1733 describe.c:1757 +#: describe.c:1737 describe.c:1761 msgid "Minimum" msgstr "Минимум" -#: describe.c:1734 describe.c:1758 +#: describe.c:1738 describe.c:1762 msgid "Maximum" msgstr "Максимум" -#: describe.c:1735 describe.c:1759 +#: describe.c:1739 describe.c:1763 msgid "Increment" msgstr "Шаг" -#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 -#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 +#: describe.c:1740 describe.c:1764 describe.c:1893 describe.c:4491 +#: describe.c:4832 describe.c:4968 describe.c:4973 describe.c:6714 msgid "yes" msgstr "да" -#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 -#: describe.c:4825 describe.c:4964 describe.c:6711 +#: describe.c:1741 describe.c:1765 describe.c:1894 describe.c:4491 +#: describe.c:4829 describe.c:4968 describe.c:6715 msgid "no" msgstr "нет" -#: describe.c:1738 describe.c:1762 +#: describe.c:1742 describe.c:1766 msgid "Cycles?" msgstr "Зацикливается?" -#: describe.c:1739 describe.c:1763 +#: describe.c:1743 describe.c:1767 msgid "Cache" msgstr "Кешируется" -#: describe.c:1804 +#: describe.c:1808 #, c-format msgid "Owned by: %s" msgstr "Владелец: %s" -#: describe.c:1808 +#: describe.c:1812 #, c-format msgid "Sequence for identity column: %s" msgstr "Последовательность для столбца идентификации: %s" -#: describe.c:1816 +#: describe.c:1820 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "Нежурналируемая последовательность \"%s.%s\"" -#: describe.c:1819 +#: describe.c:1823 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Последовательность \"%s.%s\"" -#: describe.c:1962 +#: describe.c:1966 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Нежурналируемая таблица \"%s.%s\"" -#: describe.c:1965 +#: describe.c:1969 #, c-format msgid "Table \"%s.%s\"" msgstr "Таблица \"%s.%s\"" -#: describe.c:1969 +#: describe.c:1973 #, c-format msgid "View \"%s.%s\"" msgstr "Представление \"%s.%s\"" -#: describe.c:1974 +#: describe.c:1978 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Нежурналируемое материализованное представление \"%s.%s\"" -#: describe.c:1977 +#: describe.c:1981 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Материализованное представление \"%s.%s\"" -#: describe.c:1982 +#: describe.c:1986 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Нежурналируемый индекс \"%s.%s\"" -#: describe.c:1985 +#: describe.c:1989 #, c-format msgid "Index \"%s.%s\"" msgstr "Индекс \"%s.%s\"" -#: describe.c:1990 +#: describe.c:1994 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Нежурналируемый секционированный индекс \"%s.%s\"" -#: describe.c:1993 +#: describe.c:1997 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Секционированный индекс \"%s.%s\"" -#: describe.c:1997 +#: describe.c:2001 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-таблица \"%s.%s\"" -#: describe.c:2001 +#: describe.c:2005 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Составной тип \"%s.%s\"" -#: describe.c:2005 +#: describe.c:2009 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Сторонняя таблица \"%s.%s\"" -#: describe.c:2010 +#: describe.c:2014 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Нежурналируемая секционированная таблица \"%s.%s\"" -#: describe.c:2013 +#: describe.c:2017 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Секционированная таблица \"%s.%s\"" -#: describe.c:2029 describe.c:4405 +#: describe.c:2033 describe.c:4409 msgid "Collation" msgstr "Правило сортировки" -#: describe.c:2030 describe.c:4406 +#: describe.c:2034 describe.c:4410 msgid "Nullable" msgstr "Допустимость NULL" -#: describe.c:2031 describe.c:4407 +#: describe.c:2035 describe.c:4411 msgid "Default" msgstr "По умолчанию" -#: describe.c:2034 +#: describe.c:2038 msgid "Key?" msgstr "Ключевой?" -#: describe.c:2036 describe.c:4723 describe.c:4734 +#: describe.c:2040 describe.c:4727 describe.c:4738 msgid "Definition" msgstr "Определение" # well-spelled: ОСД -#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 -#: describe.c:5954 +#: describe.c:2042 describe.c:5761 describe.c:5835 describe.c:5900 +#: describe.c:5958 msgid "FDW options" msgstr "Параметры ОСД" -#: describe.c:2040 +#: describe.c:2044 msgid "Storage" msgstr "Хранилище" -#: describe.c:2042 +#: describe.c:2046 msgid "Compression" msgstr "Сжатие" -#: describe.c:2044 +#: describe.c:2048 msgid "Stats target" msgstr "Цель для статистики" -#: describe.c:2180 +#: describe.c:2184 #, c-format msgid "Partition of: %s %s%s" msgstr "Секция: %s %s%s" -#: describe.c:2193 +#: describe.c:2197 msgid "No partition constraint" msgstr "Нет ограничения секции" -#: describe.c:2195 +#: describe.c:2199 #, c-format msgid "Partition constraint: %s" msgstr "Ограничение секции: %s" -#: describe.c:2219 +#: describe.c:2223 #, c-format msgid "Partition key: %s" msgstr "Ключ разбиения: %s" -#: describe.c:2245 +#: describe.c:2249 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Принадлежит таблице: \"%s.%s\"" -#: describe.c:2314 +#: describe.c:2318 msgid "primary key, " msgstr "первичный ключ, " -#: describe.c:2317 +#: describe.c:2321 msgid "unique" msgstr "уникальный" -#: describe.c:2319 +#: describe.c:2323 msgid " nulls not distinct" msgstr " null не различаются" -#: describe.c:2320 +#: describe.c:2324 msgid ", " msgstr ", " -#: describe.c:2327 +#: describe.c:2331 #, c-format msgid "for table \"%s.%s\"" msgstr "для таблицы \"%s.%s\"" -#: describe.c:2331 +#: describe.c:2335 #, c-format msgid ", predicate (%s)" msgstr ", предикат (%s)" -#: describe.c:2334 +#: describe.c:2338 msgid ", clustered" msgstr ", кластеризованный" -#: describe.c:2337 +#: describe.c:2341 msgid ", invalid" msgstr ", нерабочий" -#: describe.c:2340 +#: describe.c:2344 msgid ", deferrable" msgstr ", откладываемый" -#: describe.c:2343 +#: describe.c:2347 msgid ", initially deferred" msgstr ", изначально отложенный" -#: describe.c:2346 +#: describe.c:2350 msgid ", replica identity" msgstr ", репликационный" -#: describe.c:2400 +#: describe.c:2404 msgid "Indexes:" msgstr "Индексы:" -#: describe.c:2483 +#: describe.c:2487 msgid "Check constraints:" msgstr "Ограничения-проверки:" # TO REWVIEW -#: describe.c:2551 +#: describe.c:2555 msgid "Foreign-key constraints:" msgstr "Ограничения внешнего ключа:" -#: describe.c:2614 +#: describe.c:2618 msgid "Referenced by:" msgstr "Ссылки извне:" -#: describe.c:2664 +#: describe.c:2668 msgid "Policies:" msgstr "Политики:" -#: describe.c:2667 +#: describe.c:2671 msgid "Policies (forced row security enabled):" msgstr "Политики (усиленная защита строк включена):" -#: describe.c:2670 +#: describe.c:2674 msgid "Policies (row security enabled): (none)" msgstr "Политики (защита строк включена): (Нет)" -#: describe.c:2673 +#: describe.c:2677 msgid "Policies (forced row security enabled): (none)" msgstr "Политики (усиленная защита строк включена): (Нет)" -#: describe.c:2676 +#: describe.c:2680 msgid "Policies (row security disabled):" msgstr "Политики (защита строк выключена):" -#: describe.c:2736 describe.c:2841 +#: describe.c:2740 describe.c:2845 msgid "Statistics objects:" msgstr "Объекты статистики:" -#: describe.c:2943 describe.c:3096 +#: describe.c:2947 describe.c:3100 msgid "Rules:" msgstr "Правила:" -#: describe.c:2946 +#: describe.c:2950 msgid "Disabled rules:" msgstr "Отключённые правила:" -#: describe.c:2949 +#: describe.c:2953 msgid "Rules firing always:" msgstr "Правила, срабатывающие всегда:" -#: describe.c:2952 +#: describe.c:2956 msgid "Rules firing on replica only:" msgstr "Правила, срабатывающие только в реплике:" -#: describe.c:3031 describe.c:5100 +#: describe.c:3035 describe.c:5104 msgid "Publications:" msgstr "Публикации:" -#: describe.c:3079 +#: describe.c:3083 msgid "View definition:" msgstr "Определение представления:" -#: describe.c:3242 +#: describe.c:3246 msgid "Triggers:" msgstr "Триггеры:" -#: describe.c:3245 +#: describe.c:3249 msgid "Disabled user triggers:" msgstr "Отключённые пользовательские триггеры:" -#: describe.c:3248 +#: describe.c:3252 msgid "Disabled internal triggers:" msgstr "Отключённые внутренние триггеры:" -#: describe.c:3251 +#: describe.c:3255 msgid "Triggers firing always:" msgstr "Триггеры, срабатывающие всегда:" -#: describe.c:3254 +#: describe.c:3258 msgid "Triggers firing on replica only:" msgstr "Триггеры, срабатывающие только в реплике:" -#: describe.c:3325 +#: describe.c:3329 #, c-format msgid "Server: %s" msgstr "Сервер: %s" # well-spelled: ОСД -#: describe.c:3333 +#: describe.c:3337 #, c-format msgid "FDW options: (%s)" msgstr "Параметр ОСД: (%s)" -#: describe.c:3354 +#: describe.c:3358 msgid "Inherits" msgstr "Наследует" -#: describe.c:3419 +#: describe.c:3423 #, c-format msgid "Number of partitions: %d" msgstr "Число секций: %d" -#: describe.c:3428 +#: describe.c:3432 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Число секций: %d (чтобы просмотреть их, введите \\d+)" -#: describe.c:3430 +#: describe.c:3434 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Дочерних таблиц: %d (чтобы просмотреть и их, воспользуйтесь \\d+)" -#: describe.c:3437 +#: describe.c:3441 msgid "Child tables" msgstr "Дочерние таблицы" -#: describe.c:3437 +#: describe.c:3441 msgid "Partitions" msgstr "Секции" -#: describe.c:3470 +#: describe.c:3474 #, c-format msgid "Typed table of type: %s" msgstr "Типизированная таблица типа: %s" -#: describe.c:3486 +#: describe.c:3490 msgid "Replica Identity" msgstr "Идентификация реплики" -#: describe.c:3499 +#: describe.c:3503 msgid "Has OIDs: yes" msgstr "Содержит OID: да" -#: describe.c:3508 +#: describe.c:3512 #, c-format msgid "Access method: %s" msgstr "Метод доступа: %s" -#: describe.c:3585 +#: describe.c:3589 #, 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:3597 +#: describe.c:3601 #, c-format msgid ", tablespace \"%s\"" msgstr ", табл. пространство \"%s\"" -#: describe.c:3670 +#: describe.c:3674 msgid "List of roles" msgstr "Список ролей" -#: describe.c:3672 describe.c:3840 +#: describe.c:3676 describe.c:3844 msgid "Role name" msgstr "Имя роли" -#: describe.c:3673 +#: describe.c:3677 msgid "Attributes" msgstr "Атрибуты" -#: describe.c:3684 +#: describe.c:3688 msgid "Superuser" msgstr "Суперпользователь" -#: describe.c:3687 +#: describe.c:3691 msgid "No inheritance" msgstr "Не наследуется" -#: describe.c:3690 +#: describe.c:3694 msgid "Create role" msgstr "Создаёт роли" -#: describe.c:3693 +#: describe.c:3697 msgid "Create DB" msgstr "Создаёт БД" -#: describe.c:3696 +#: describe.c:3700 msgid "Cannot login" msgstr "Вход запрещён" -#: describe.c:3699 +#: describe.c:3703 msgid "Replication" msgstr "Репликация" -#: describe.c:3703 +#: describe.c:3707 msgid "Bypass RLS" msgstr "Пропускать RLS" -#: describe.c:3712 +#: describe.c:3716 msgid "No connections" msgstr "Нет подключений" -#: describe.c:3714 +#: describe.c:3718 #, c-format msgid "%d connection" msgid_plural "%d connections" @@ -1955,401 +1965,401 @@ msgstr[1] "%d подключения" msgstr[2] "%d подключений" -#: describe.c:3724 +#: describe.c:3728 msgid "Password valid until " msgstr "Пароль действует до " -#: describe.c:3775 +#: describe.c:3779 msgid "Role" msgstr "Роль" -#: describe.c:3776 +#: describe.c:3780 msgid "Database" msgstr "БД" -#: describe.c:3777 +#: describe.c:3781 msgid "Settings" msgstr "Параметры" -#: describe.c:3801 +#: describe.c:3805 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Параметры для роли \"%s\" и базы данных \"%s\" не найдены." -#: describe.c:3804 +#: describe.c:3808 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Параметры для роли \"%s\" не найдены." -#: describe.c:3807 +#: describe.c:3811 #, c-format msgid "Did not find any settings." msgstr "Никакие параметры не найдены." -#: describe.c:3811 +#: describe.c:3815 msgid "List of settings" msgstr "Список параметров" -#: describe.c:3841 +#: describe.c:3845 msgid "Member of" msgstr "Член ролей" -#: describe.c:3858 +#: describe.c:3862 msgid "Grantor" msgstr "Праводатель" -#: describe.c:3884 +#: describe.c:3888 msgid "List of role grants" msgstr "Список назначений ролей" -#: describe.c:3950 +#: describe.c:3954 msgid "index" msgstr "индекс" -#: describe.c:3952 +#: describe.c:3956 msgid "TOAST table" msgstr "TOAST-таблица" -#: describe.c:3955 describe.c:4166 +#: describe.c:3959 describe.c:4170 msgid "partitioned index" msgstr "секционированный индекс" -#: describe.c:3975 +#: describe.c:3979 msgid "permanent" msgstr "постоянное" -#: describe.c:3976 +#: describe.c:3980 msgid "temporary" msgstr "временное" -#: describe.c:3977 +#: describe.c:3981 msgid "unlogged" msgstr "нежурналируемое" -#: describe.c:3978 +#: describe.c:3982 msgid "Persistence" msgstr "Хранение" -#: describe.c:3994 +#: describe.c:3998 msgid "Access method" msgstr "Метод доступа" -#: describe.c:4079 +#: describe.c:4083 msgid "List of relations" msgstr "Список отношений" -#: describe.c:4127 +#: describe.c:4131 #, c-format msgid "" "The server (version %s) does not support declarative table partitioning." msgstr "" "Сервер (версия %s) не поддерживает декларативное секционирование таблиц." -#: describe.c:4138 +#: describe.c:4142 msgid "List of partitioned indexes" msgstr "Список секционированных индексов" -#: describe.c:4140 +#: describe.c:4144 msgid "List of partitioned tables" msgstr "Список секционированных таблиц" -#: describe.c:4144 +#: describe.c:4148 msgid "List of partitioned relations" msgstr "Список секционированных отношений" -#: describe.c:4175 +#: describe.c:4179 msgid "Parent name" msgstr "Имя родителя" -#: describe.c:4188 +#: describe.c:4192 msgid "Leaf partition size" msgstr "Размер конечной секции" -#: describe.c:4191 describe.c:4197 +#: describe.c:4195 describe.c:4201 msgid "Total size" msgstr "Общий размер" -#: describe.c:4321 +#: describe.c:4325 msgid "Trusted" msgstr "Доверенный" -#: describe.c:4330 +#: describe.c:4334 msgid "Internal language" msgstr "Внутренний язык" -#: describe.c:4331 +#: describe.c:4335 msgid "Call handler" msgstr "Обработчик вызова" -#: describe.c:4332 describe.c:5743 +#: describe.c:4336 describe.c:5747 msgid "Validator" msgstr "Функция проверки" -#: describe.c:4333 +#: describe.c:4337 msgid "Inline handler" msgstr "Обработчик внедрённого кода" -#: describe.c:4367 +#: describe.c:4371 msgid "List of languages" msgstr "Список языков" -#: describe.c:4408 +#: describe.c:4412 msgid "Check" msgstr "Проверка" -#: describe.c:4451 +#: describe.c:4455 msgid "List of domains" msgstr "Список доменов" -#: describe.c:4485 +#: describe.c:4489 msgid "Source" msgstr "Источник" -#: describe.c:4486 +#: describe.c:4490 msgid "Destination" msgstr "Назначение" -#: describe.c:4488 describe.c:6712 +#: describe.c:4492 describe.c:6716 msgid "Default?" msgstr "По умолчанию?" -#: describe.c:4529 +#: describe.c:4533 msgid "List of conversions" msgstr "Список преобразований" -#: describe.c:4557 +#: describe.c:4561 msgid "Parameter" msgstr "Параметр" -#: describe.c:4558 +#: describe.c:4562 msgid "Value" msgstr "Значение" -#: describe.c:4565 +#: describe.c:4569 msgid "Context" msgstr "Контекст" -#: describe.c:4597 +#: describe.c:4601 msgid "List of configuration parameters" msgstr "Список параметров конфигурации" -#: describe.c:4599 +#: describe.c:4603 msgid "List of non-default configuration parameters" msgstr "Список изменённых параметров конфигурации" -#: describe.c:4626 +#: describe.c:4630 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Сервер (версия %s) не поддерживает событийные триггеры." -#: describe.c:4646 +#: describe.c:4650 msgid "Event" msgstr "Событие" -#: describe.c:4648 +#: describe.c:4652 msgid "enabled" msgstr "включён" -#: describe.c:4649 +#: describe.c:4653 msgid "replica" msgstr "реплика" -#: describe.c:4650 +#: describe.c:4654 msgid "always" msgstr "всегда" -#: describe.c:4651 +#: describe.c:4655 msgid "disabled" msgstr "отключён" -#: describe.c:4652 describe.c:6553 +#: describe.c:4656 describe.c:6557 msgid "Enabled" msgstr "Включён" -#: describe.c:4654 +#: describe.c:4658 msgid "Tags" msgstr "Теги" -#: describe.c:4677 +#: describe.c:4681 msgid "List of event triggers" msgstr "Список событийных триггеров" -#: describe.c:4704 +#: describe.c:4708 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Сервер (версия %s) не поддерживает расширенные статистики." -#: describe.c:4741 +#: describe.c:4745 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4742 +#: describe.c:4746 msgid "Dependencies" msgstr "Зависимости" -#: describe.c:4752 +#: describe.c:4756 msgid "MCV" msgstr "MCV" -#: describe.c:4775 +#: describe.c:4779 msgid "List of extended statistics" msgstr "Список расширенных статистик" -#: describe.c:4802 +#: describe.c:4806 msgid "Source type" msgstr "Исходный тип" -#: describe.c:4803 +#: describe.c:4807 msgid "Target type" msgstr "Целевой тип" -#: describe.c:4827 +#: describe.c:4831 msgid "in assignment" msgstr "в присваивании" -#: describe.c:4829 +#: describe.c:4833 msgid "Implicit?" msgstr "Неявное?" -#: describe.c:4887 +#: describe.c:4891 msgid "List of casts" msgstr "Список приведений типов" -#: describe.c:4927 describe.c:4931 +#: describe.c:4931 describe.c:4935 msgid "Provider" msgstr "Провайдер" -#: describe.c:4965 describe.c:4970 +#: describe.c:4969 describe.c:4974 msgid "Deterministic?" msgstr "Детерминированное?" -#: describe.c:5009 +#: describe.c:5013 msgid "List of collations" msgstr "Список правил сортировки" -#: describe.c:5070 +#: describe.c:5074 msgid "List of schemas" msgstr "Список схем" -#: describe.c:5186 +#: describe.c:5190 msgid "List of text search parsers" msgstr "Список анализаторов текстового поиска" -#: describe.c:5236 +#: describe.c:5240 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Анализатор текстового поиска \"%s\" не найден." -#: describe.c:5239 +#: describe.c:5243 #, c-format msgid "Did not find any text search parsers." msgstr "Никакие анализаторы текстового поиска не найдены." -#: describe.c:5314 +#: describe.c:5318 msgid "Start parse" msgstr "Начало разбора" -#: describe.c:5315 +#: describe.c:5319 msgid "Method" msgstr "Метод" -#: describe.c:5319 +#: describe.c:5323 msgid "Get next token" msgstr "Получение следующего фрагмента" -#: describe.c:5321 +#: describe.c:5325 msgid "End parse" msgstr "Окончание разбора" -#: describe.c:5323 +#: describe.c:5327 msgid "Get headline" msgstr "Получение выдержки" -#: describe.c:5325 +#: describe.c:5329 msgid "Get token types" msgstr "Получение типов фрагментов" -#: describe.c:5335 +#: describe.c:5339 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Анализатор текстового поиска \"%s.%s\"" -#: describe.c:5338 +#: describe.c:5342 #, c-format msgid "Text search parser \"%s\"" msgstr "Анализатор текстового поиска \"%s\"" -#: describe.c:5357 +#: describe.c:5361 msgid "Token name" msgstr "Имя фрагмента" -#: describe.c:5370 +#: describe.c:5374 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Типы фрагментов для анализатора \"%s.%s\"" -#: describe.c:5373 +#: describe.c:5377 #, c-format msgid "Token types for parser \"%s\"" msgstr "Типы фрагментов для анализатора \"%s\"" -#: describe.c:5417 +#: describe.c:5421 msgid "Template" msgstr "Шаблон" -#: describe.c:5418 +#: describe.c:5422 msgid "Init options" msgstr "Параметры инициализации" -#: describe.c:5444 +#: describe.c:5448 msgid "List of text search dictionaries" msgstr "Список словарей текстового поиска" -#: describe.c:5477 +#: describe.c:5481 msgid "Init" msgstr "Инициализация" -#: describe.c:5478 +#: describe.c:5482 msgid "Lexize" msgstr "Выделение лексем" -#: describe.c:5509 +#: describe.c:5513 msgid "List of text search templates" msgstr "Список шаблонов текстового поиска" -#: describe.c:5563 +#: describe.c:5567 msgid "List of text search configurations" msgstr "Список конфигураций текстового поиска" -#: describe.c:5614 +#: describe.c:5618 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Конфигурация текстового поиска \"%s\" не найдена." -#: describe.c:5617 +#: describe.c:5621 #, c-format msgid "Did not find any text search configurations." msgstr "Никакие конфигурации текстового поиска не найдены." -#: describe.c:5683 +#: describe.c:5687 msgid "Token" msgstr "Фрагмент" -#: describe.c:5684 +#: describe.c:5688 msgid "Dictionaries" msgstr "Словари" -#: describe.c:5695 +#: describe.c:5699 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Конфигурация текстового поиска \"%s.%s\"" -#: describe.c:5698 +#: describe.c:5702 #, c-format msgid "Text search configuration \"%s\"" msgstr "Конфигурация текстового поиска \"%s\"" -#: describe.c:5702 +#: describe.c:5706 #, c-format msgid "" "\n" @@ -2358,7 +2368,7 @@ "\n" "Анализатор: \"%s.%s\"" -#: describe.c:5705 +#: describe.c:5709 #, c-format msgid "" "\n" @@ -2367,269 +2377,269 @@ "\n" "Анализатор: \"%s\"" -#: describe.c:5784 +#: describe.c:5788 msgid "List of foreign-data wrappers" msgstr "Список обёрток сторонних данных" -#: describe.c:5812 +#: describe.c:5816 msgid "Foreign-data wrapper" msgstr "Обёртка сторонних данных" -#: describe.c:5830 describe.c:6017 +#: describe.c:5834 describe.c:6021 msgid "Version" msgstr "Версия" -#: describe.c:5860 +#: describe.c:5864 msgid "List of foreign servers" msgstr "Список сторонних серверов" -#: describe.c:5885 describe.c:5943 +#: describe.c:5889 describe.c:5947 msgid "Server" msgstr "Сервер" -#: describe.c:5886 +#: describe.c:5890 msgid "User name" msgstr "Имя пользователя" -#: describe.c:5915 +#: describe.c:5919 msgid "List of user mappings" msgstr "Список сопоставлений пользователей" -#: describe.c:5987 +#: describe.c:5991 msgid "List of foreign tables" msgstr "Список сторонних таблиц" -#: describe.c:6038 +#: describe.c:6042 msgid "List of installed extensions" msgstr "Список установленных расширений" -#: describe.c:6086 +#: describe.c:6090 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Расширение \"%s\" не найдено." -#: describe.c:6089 +#: describe.c:6093 #, c-format msgid "Did not find any extensions." msgstr "Никакие расширения не найдены." -#: describe.c:6133 +#: describe.c:6137 msgid "Object description" msgstr "Описание объекта" -#: describe.c:6142 +#: describe.c:6146 #, c-format msgid "Objects in extension \"%s\"" msgstr "Объекты в расширении \"%s\"" -#: describe.c:6183 +#: describe.c:6187 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное имя (слишком много компонентов): %s" -#: describe.c:6197 +#: describe.c:6201 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ссылки между базами не реализованы: %s" -#: describe.c:6228 describe.c:6354 +#: describe.c:6232 describe.c:6358 #, c-format msgid "The server (version %s) does not support publications." msgstr "Сервер (версия %s) не поддерживает публикации." -#: describe.c:6245 describe.c:6432 +#: describe.c:6249 describe.c:6436 msgid "All tables" msgstr "Все таблицы" -#: describe.c:6246 describe.c:6433 +#: describe.c:6250 describe.c:6437 msgid "Inserts" msgstr "Добавления" -#: describe.c:6247 describe.c:6434 +#: describe.c:6251 describe.c:6438 msgid "Updates" msgstr "Изменения" -#: describe.c:6248 describe.c:6435 +#: describe.c:6252 describe.c:6439 msgid "Deletes" msgstr "Удаления" -#: describe.c:6252 describe.c:6437 +#: describe.c:6256 describe.c:6441 msgid "Truncates" msgstr "Опустошения" -#: describe.c:6256 describe.c:6439 +#: describe.c:6260 describe.c:6443 msgid "Via root" msgstr "Через корень" -#: describe.c:6277 +#: describe.c:6281 msgid "List of publications" msgstr "Список публикаций" -#: describe.c:6401 +#: describe.c:6405 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Публикация \"%s\" не найдена." -#: describe.c:6404 +#: describe.c:6408 #, c-format msgid "Did not find any publications." msgstr "Никакие публикации не найдены." -#: describe.c:6428 +#: describe.c:6432 #, c-format msgid "Publication %s" msgstr "Публикация %s" -#: describe.c:6481 +#: describe.c:6485 msgid "Tables:" msgstr "Таблицы:" -#: describe.c:6493 +#: describe.c:6497 msgid "Tables from schemas:" msgstr "Таблицы из схем:" -#: describe.c:6538 +#: describe.c:6542 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Сервер (версия %s) не поддерживает подписки." -#: describe.c:6554 +#: describe.c:6558 msgid "Publication" msgstr "Публикация" -#: describe.c:6563 +#: describe.c:6567 msgid "Binary" msgstr "Бинарная" -#: describe.c:6572 describe.c:6576 +#: describe.c:6576 describe.c:6580 msgid "Streaming" msgstr "Потоковая" -#: describe.c:6584 +#: describe.c:6588 msgid "Two-phase commit" msgstr "Двухфазная фиксация" -#: describe.c:6585 +#: describe.c:6589 msgid "Disable on error" msgstr "Отключается при ошибке" -#: describe.c:6592 +#: describe.c:6596 msgid "Origin" msgstr "Источник" -#: describe.c:6593 +#: describe.c:6597 msgid "Password required" msgstr "Требуется пароль" -#: describe.c:6594 +#: describe.c:6598 msgid "Run as owner?" msgstr "Использовать владельца?" -#: describe.c:6599 +#: describe.c:6603 msgid "Failover" msgstr "Переносимая" -#: describe.c:6604 +#: describe.c:6608 msgid "Synchronous commit" msgstr "Синхронная фиксация" -#: describe.c:6605 +#: describe.c:6609 msgid "Conninfo" msgstr "Строка подключения" -#: describe.c:6611 +#: describe.c:6615 msgid "Skip LSN" msgstr "Пропустить LSN" -#: describe.c:6637 +#: describe.c:6641 msgid "List of subscriptions" msgstr "Список подписок" -#: describe.c:6666 +#: describe.c:6670 msgid "(none)" msgstr "(нет)" -#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 +#: describe.c:6710 describe.c:6805 describe.c:6897 describe.c:6991 msgid "AM" msgstr "МД" -#: describe.c:6707 +#: describe.c:6711 msgid "Input type" msgstr "Входной тип" -#: describe.c:6708 +#: describe.c:6712 msgid "Storage type" msgstr "Тип хранения" -#: describe.c:6709 +#: describe.c:6713 msgid "Operator class" msgstr "Класс операторов" -#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 +#: describe.c:6725 describe.c:6806 describe.c:6898 describe.c:6992 msgid "Operator family" msgstr "Семейство операторов" -#: describe.c:6756 +#: describe.c:6760 msgid "List of operator classes" msgstr "Список классов операторов" -#: describe.c:6803 +#: describe.c:6807 msgid "Applicable types" msgstr "Применимые типы" -#: describe.c:6844 +#: describe.c:6848 msgid "List of operator families" msgstr "Список семейств операторов" -#: describe.c:6895 +#: describe.c:6899 msgid "Operator" msgstr "Оператор" -#: describe.c:6896 +#: describe.c:6900 msgid "Strategy" msgstr "Стратегия" -#: describe.c:6897 +#: describe.c:6901 msgid "ordering" msgstr "сортировка" -#: describe.c:6898 +#: describe.c:6902 msgid "search" msgstr "поиск" -#: describe.c:6899 +#: describe.c:6903 msgid "Purpose" msgstr "Назначение" -#: describe.c:6904 +#: describe.c:6908 msgid "Sort opfamily" msgstr "Семейство для сортировки" -#: describe.c:6942 +#: describe.c:6946 msgid "List of operators of operator families" msgstr "Список операторов из семейств операторов" -#: describe.c:6989 +#: describe.c:6993 msgid "Registered left type" msgstr "Зарегистрированный левый тип" -#: describe.c:6990 +#: describe.c:6994 msgid "Registered right type" msgstr "Зарегистрированный правый тип" -#: describe.c:6991 +#: describe.c:6995 msgid "Number" msgstr "Номер" -#: describe.c:7034 +#: describe.c:7038 msgid "List of support functions of operator families" msgstr "Список опорных функций из семейств операторов" -#: describe.c:7065 +#: describe.c:7069 msgid "ID" msgstr "ID" -#: describe.c:7085 +#: describe.c:7089 msgid "Large objects" msgstr "Большие объекты" diff -Nru postgresql-17-17.10/src/bin/psql/psqlscanslash.h postgresql-17-17.11/src/bin/psql/psqlscanslash.h --- postgresql-17-17.10/src/bin/psql/psqlscanslash.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/psqlscanslash.h 2026-08-10 20:54:09.000000000 +0000 @@ -31,6 +31,11 @@ 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 -Nru postgresql-17-17.10/src/bin/psql/psqlscanslash.l postgresql-17-17.11/src/bin/psql/psqlscanslash.l --- postgresql-17-17.10/src/bin/psql/psqlscanslash.l 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/psqlscanslash.l 2026-08-10 20:54:09.000000000 +0000 @@ -713,7 +713,47 @@ } /* + * 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 -Nru postgresql-17-17.10/src/bin/psql/startup.c postgresql-17-17.11/src/bin/psql/startup.c --- postgresql-17-17.10/src/bin/psql/startup.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/startup.c 2026-08-10 20:54:09.000000000 +0000 @@ -381,7 +381,7 @@ 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 -Nru postgresql-17-17.10/src/bin/psql/t/001_basic.pl postgresql-17-17.11/src/bin/psql/t/001_basic.pl --- postgresql-17-17.10/src/bin/psql/t/001_basic.pl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/t/001_basic.pl 2026-08-10 20:54:09.000000000 +0000 @@ -450,4 +450,11 @@ 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 -Nru postgresql-17-17.10/src/bin/psql/tab-complete.c postgresql-17-17.11/src/bin/psql/tab-complete.c --- postgresql-17-17.10/src/bin/psql/tab-complete.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/psql/tab-complete.c 2026-08-10 20:54:09.000000000 +0000 @@ -4842,7 +4842,7 @@ 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 -Nru postgresql-17-17.10/src/bin/scripts/po/de.po postgresql-17-17.11/src/bin/scripts/po/de.po --- postgresql-17-17.10/src/bin/scripts/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/scripts/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-06-16 10:21+0000\n" +"POT-Creation-Date: 2026-08-07 09:31+0000\n" "PO-Revision-Date: 2024-06-16 19:03+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -37,17 +37,27 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format @@ -168,27 +178,27 @@ 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 %lld is equal to or exceeds maximum %lld.\n" msgstr "Kann Tabelleninhalt nicht ausgeben: Anzahl der Zellen %lld ist gleich oder überschreitet Maximum %lld.\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 %lld exceeded.\n" msgstr "Kann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %lld ü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" @@ -203,12 +213,12 @@ 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" @@ -216,13 +226,13 @@ #: clusterdb.c:114 clusterdb.c:133 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:177 reindexdb.c:196 vacuumdb.c:280 vacuumdb.c:300 +#: reindexdb.c:180 reindexdb.c:199 vacuumdb.c:280 vacuumdb.c:300 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." #: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 +#: pg_isready.c:109 reindexdb.c:197 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" @@ -256,19 +266,19 @@ "%s clustert alle vorher geclusterten Tabellen in einer Datenbank.\n" "\n" -#: clusterdb.c:275 createdb.c:298 createuser.c:415 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:868 vacuumdb.c:1147 +#: clusterdb.c:275 createdb.c:300 createuser.c:417 dropdb.c:171 dropuser.c:171 +#: pg_isready.c:226 reindexdb.c:887 vacuumdb.c:1171 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: clusterdb.c:276 reindexdb.c:869 vacuumdb.c:1148 +#: clusterdb.c:276 reindexdb.c:888 vacuumdb.c:1172 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: clusterdb.c:277 createdb.c:300 createuser.c:417 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:870 vacuumdb.c:1149 +#: clusterdb.c:277 createdb.c:302 createuser.c:419 dropdb.c:173 dropuser.c:173 +#: pg_isready.c:229 reindexdb.c:889 vacuumdb.c:1173 #, c-format msgid "" "\n" @@ -287,7 +297,7 @@ msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME zu clusternde Datenbank\n" -#: clusterdb.c:280 createuser.c:423 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:280 createuser.c:425 dropdb.c:174 dropuser.c:174 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" @@ -309,18 +319,18 @@ msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: clusterdb.c:284 createuser.c:439 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:284 createuser.c:441 dropdb.c:177 dropuser.c:177 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: clusterdb.c:285 createuser.c:447 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:285 createuser.c:449 dropdb.c:179 dropuser.c:179 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: clusterdb.c:286 createdb.c:317 createuser.c:448 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:885 vacuumdb.c:1178 +#: clusterdb.c:286 createdb.c:319 createuser.c:450 dropdb.c:180 dropuser.c:180 +#: pg_isready.c:235 reindexdb.c:904 vacuumdb.c:1202 #, c-format msgid "" "\n" @@ -329,32 +339,32 @@ "\n" "Verbindungsoptionen:\n" -#: clusterdb.c:287 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1179 +#: clusterdb.c:287 createuser.c:451 dropdb.c:181 dropuser.c:181 vacuumdb.c:1203 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: clusterdb.c:288 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1180 +#: clusterdb.c:288 createuser.c:452 dropdb.c:182 dropuser.c:182 vacuumdb.c:1204 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: clusterdb.c:289 dropdb.c:184 vacuumdb.c:1181 +#: clusterdb.c:289 dropdb.c:183 vacuumdb.c:1205 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: clusterdb.c:290 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1182 +#: clusterdb.c:290 createuser.c:454 dropdb.c:184 dropuser.c:184 vacuumdb.c:1206 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: clusterdb.c:291 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1183 +#: clusterdb.c:291 createuser.c:455 dropdb.c:185 dropuser.c:185 vacuumdb.c:1207 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: clusterdb.c:292 dropdb.c:187 vacuumdb.c:1184 +#: clusterdb.c:292 dropdb.c:186 vacuumdb.c:1208 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" @@ -369,8 +379,8 @@ "Für weitere Informationen lesen Sie bitte die Beschreibung des\n" "SQL-Befehls CLUSTER.\n" -#: clusterdb.c:294 createdb.c:325 createuser.c:454 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:893 vacuumdb.c:1186 +#: clusterdb.c:294 createdb.c:327 createuser.c:456 dropdb.c:187 dropuser.c:186 +#: pg_isready.c:240 reindexdb.c:912 vacuumdb.c:1210 #, c-format msgid "" "\n" @@ -379,8 +389,8 @@ "\n" "Berichten Sie Fehler an <%s>.\n" -#: clusterdb.c:295 createdb.c:326 createuser.c:455 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:894 vacuumdb.c:1187 +#: clusterdb.c:295 createdb.c:328 createuser.c:457 dropdb.c:188 dropuser.c:187 +#: pg_isready.c:241 reindexdb.c:913 vacuumdb.c:1211 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" @@ -393,23 +403,23 @@ msgstr[1] "Anfrage ergab %d Zeilen anstatt einer: %s" #. translator: abbreviation for "yes" -#: common.c:131 +#: common.c:132 msgid "y" msgstr "j" #. translator: abbreviation for "no" -#: common.c:133 +#: common.c:134 msgid "n" msgstr "n" #. translator: This is a question followed by the translated options for #. "yes" and "no". -#: common.c:143 +#: common.c:144 #, c-format msgid "%s (%s/%s) " msgstr "%s (%s/%s) " -#: common.c:164 +#: common.c:165 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Bitte antworten Sie »%s« oder »%s«.\n" @@ -419,17 +429,17 @@ msgid "\"%s\" is not a valid encoding name" msgstr "»%s« ist kein gültiger Kodierungsname" -#: createdb.c:260 +#: createdb.c:262 #, c-format msgid "database creation failed: %s" msgstr "Erzeugen der Datenbank ist fehlgeschlagen: %s" -#: createdb.c:279 +#: createdb.c:281 #, c-format msgid "comment creation failed (database was created): %s" msgstr "Erzeugen des Kommentars ist fehlgeschlagen (Datenbank wurde erzeugt): %s" -#: createdb.c:297 +#: createdb.c:299 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -438,61 +448,61 @@ "%s erzeugt eine PostgreSQL-Datenbank.\n" "\n" -#: createdb.c:299 +#: createdb.c:301 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPTION]... [DBNAME] [BESCHREIBUNG]\n" -#: createdb.c:301 +#: createdb.c:303 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE Standard-Tablespace der Datenbank\n" -#: createdb.c:302 reindexdb.c:874 +#: createdb.c:304 reindexdb.c:893 #, 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" -#: createdb.c:303 +#: createdb.c:305 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=KODIERUNG Kodierung für die Datenbank\n" -#: createdb.c:304 +#: createdb.c:306 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE Locale-Einstellungen für die Datenbank\n" -#: createdb.c:305 +#: createdb.c:307 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE LC_COLLATE-Einstellung für die Datenbank\n" -#: createdb.c:306 +#: createdb.c:308 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE LC_CTYPE-Einstellung für die Datenbank\n" -#: createdb.c:307 +#: createdb.c:309 #, c-format msgid " --builtin-locale=LOCALE builtin locale setting for the database\n" msgstr "" " --builtin-locale=LOCALE Locale-Einstellung für Provider »builtin« für\n" " die Datenbank\n" -#: createdb.c:308 +#: createdb.c:310 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=LOCALE ICU-Locale-Einstellung für die Datenbank\n" -#: createdb.c:309 +#: createdb.c:311 #, c-format msgid " --icu-rules=RULES ICU rules setting for the database\n" msgstr " --icu-rules=REGELN ICU-Regel-Einstellung für die Datenbank\n" -#: createdb.c:310 +#: createdb.c:312 #, c-format msgid "" " --locale-provider={builtin|libc|icu}\n" @@ -501,62 +511,62 @@ " --locale-provider={builtin|libc|icu}\n" " Locale-Provider für Standardsortierfolge der Datenbank\n" -#: createdb.c:312 +#: createdb.c:314 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=EIGENTÜMER Eigentümer der neuen Datenbank\n" -#: createdb.c:313 +#: createdb.c:315 #, c-format msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" msgstr " -S, --strategy=STRATEGIE Datenbankerzeugungsstrategie wal_log oder file_copy\n" -#: createdb.c:314 +#: createdb.c:316 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE zu kopierende Template-Datenbank\n" -#: createdb.c:315 reindexdb.c:883 +#: createdb.c:317 reindexdb.c:902 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: createdb.c:316 reindexdb.c:884 +#: createdb.c:318 reindexdb.c:903 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: createdb.c:318 reindexdb.c:886 +#: createdb.c:320 reindexdb.c:905 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: createdb.c:319 reindexdb.c:887 +#: createdb.c:321 reindexdb.c:906 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: createdb.c:320 reindexdb.c:888 +#: createdb.c:322 reindexdb.c:907 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: createdb.c:321 reindexdb.c:889 +#: createdb.c:323 reindexdb.c:908 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: createdb.c:322 reindexdb.c:890 +#: createdb.c:324 reindexdb.c:909 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: createdb.c:323 reindexdb.c:891 +#: createdb.c:325 reindexdb.c:910 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" -#: createdb.c:324 +#: createdb.c:326 #, c-format msgid "" "\n" @@ -595,17 +605,17 @@ msgid "Shall the new role be allowed to create more new roles?" msgstr "Soll die neue Rolle weitere neue Rollen erzeugen dürfen?" -#: createuser.c:309 +#: createuser.c:311 #, c-format msgid "password encryption failed: %s" msgstr "Passwortverschlüsselung ist fehlgeschlagen: %s" -#: createuser.c:400 +#: createuser.c:402 #, c-format msgid "creation of new role failed: %s" msgstr "Erzeugen der neuen Rolle fehlgeschlagen: %s" -#: createuser.c:414 +#: createuser.c:416 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -614,12 +624,12 @@ "%s erzeugt eine neue PostgreSQL-Rolle.\n" "\n" -#: createuser.c:416 dropuser.c:171 +#: createuser.c:418 dropuser.c:172 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [OPTION]... [ROLLENNAME]\n" -#: createuser.c:418 +#: createuser.c:420 #, c-format msgid "" " -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" @@ -628,34 +638,34 @@ " -a, --with-admin=ROLLE ROLLE wird Mitglied der neuen Rolle mit\n" " Admin-Option\n" -#: createuser.c:420 +#: createuser.c:422 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr "" " -c, --connection-limit=N Hochzahl an Verbindungen für Rolle\n" " (Voreinstellung: keine Begrenzung)\n" -#: createuser.c:421 +#: createuser.c:423 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb Rolle kann neue Datenbanken erzeugen\n" -#: createuser.c:422 +#: createuser.c:424 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb Rolle kann keine Datenbanken erzeugen (Voreinstellung)\n" -#: createuser.c:424 +#: createuser.c:426 #, c-format msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" msgstr " -g, --member-of=ROLLE neue Rolle wird Mitglied von ROLLE\n" -#: createuser.c:425 +#: createuser.c:427 #, c-format msgid " --role=ROLE (same as --member-of, deprecated)\n" msgstr " --role=ROLLE (gleich --member-of, veraltet)\n" -#: createuser.c:426 +#: createuser.c:428 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -664,52 +674,52 @@ " -i, --inherit Rolle erbt alle Privilegien von Rollen, deren\n" " Mitglied sie ist (Voreinstellung)\n" -#: createuser.c:428 +#: createuser.c:430 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit Rolle erbt keine Privilegien\n" -#: createuser.c:429 +#: createuser.c:431 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login Rolle kann sich anmelden (Voreinstellung)\n" -#: createuser.c:430 +#: createuser.c:432 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login Rolle kann sich nicht anmelden\n" -#: createuser.c:431 +#: createuser.c:433 #, c-format msgid " -m, --with-member=ROLE ROLE will be a member of new role\n" msgstr " -m, --with-member=ROLLE ROLLE wird Mitglied der neuen Rolle\n" -#: createuser.c:432 +#: createuser.c:434 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt weise der neuen Rolle ein Passwort zu\n" -#: createuser.c:433 +#: createuser.c:435 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole Rolle kann neue Rollen erzeugen\n" -#: createuser.c:434 +#: createuser.c:436 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole Rolle kann keine Rollen erzeugen (Voreinstellung)\n" -#: createuser.c:435 +#: createuser.c:437 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser Rolle wird Superuser\n" -#: createuser.c:436 +#: createuser.c:438 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser Rolle wird kein Superuser (Voreinstellung)\n" -#: createuser.c:437 +#: createuser.c:439 #, c-format msgid "" " -v, --valid-until=TIMESTAMP\n" @@ -718,7 +728,7 @@ " -v, --valid-until=TIMESTAMP\n" " Ablaufdatum und -zeit des Passworts der Rolle\n" -#: createuser.c:440 +#: createuser.c:442 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -727,14 +737,14 @@ " --interactive nach fehlenden Rollennamen und -attributen fragen\n" " anstatt Vorgabewerte zu nehmen\n" -#: createuser.c:442 +#: createuser.c:444 #, c-format msgid " --bypassrls role can bypass row-level security (RLS) policy\n" msgstr "" " --bypassrls Rolle kann Policy für Sicherheit auf Zeilenebene (RLS)\n" " umgehen\n" -#: createuser.c:443 +#: createuser.c:445 #, c-format msgid "" " --no-bypassrls role cannot bypass row-level security (RLS) policy\n" @@ -743,17 +753,17 @@ " --no-bypassrls Rolle kann Policy für Sicherheit auf Zeilenebene (RLS)\n" " nicht umgehen (Voreinstellung)\n" -#: createuser.c:445 +#: createuser.c:447 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication Rolle kann Replikation einleiten\n" -#: createuser.c:446 +#: createuser.c:448 #, c-format msgid " --no-replication role cannot initiate replication (default)\n" msgstr " --no-replication Rolle kann Replikation nicht einleiten (Voreinstellung)\n" -#: createuser.c:451 +#: createuser.c:453 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr "" @@ -774,12 +784,12 @@ msgid "Are you sure?" msgstr "Sind Sie sich sicher?" -#: dropdb.c:157 +#: dropdb.c:156 #, c-format msgid "database removal failed: %s" msgstr "Löschen der Datenbank fehlgeschlagen: %s" -#: dropdb.c:171 +#: dropdb.c:170 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -788,22 +798,22 @@ "%s löscht eine PostgreSQL-Datenbank.\n" "\n" -#: dropdb.c:173 +#: dropdb.c:172 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [OPTION]... DBNAME\n" -#: dropdb.c:176 +#: dropdb.c:175 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force vor dem Löschen versuchen andere Verbindungen abzubrechen\n" -#: dropdb.c:177 +#: dropdb.c:176 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive frage nach, bevor irgendetwas gelöscht wird\n" -#: dropdb.c:179 +#: dropdb.c:178 #, c-format msgid " --if-exists don't report error if database doesn't exist\n" msgstr " --if-exists keinen Fehler ausgeben, wenn Datenbank nicht existiert\n" @@ -822,12 +832,12 @@ msgid "Role \"%s\" will be permanently removed.\n" msgstr "Rolle »%s« wird unwiderruflich gelöscht werden.\n" -#: dropuser.c:154 +#: dropuser.c:155 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "Löschen der Rolle »%s« fehlgeschlagen: %s" -#: dropuser.c:169 +#: dropuser.c:170 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -836,7 +846,7 @@ "%s löscht eine PostgreSQL-Rolle.\n" "\n" -#: dropuser.c:174 +#: dropuser.c:175 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -845,12 +855,12 @@ " -i, --interactive nachfragen, bevor irgendetwas gelöscht wird, und\n" " nach Rollennamen fragen, wenn nicht angegeben\n" -#: dropuser.c:177 +#: dropuser.c:178 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr " --if-exists keinen Fehler ausgeben, wenn Benutzer nicht existiert\n" -#: dropuser.c:182 +#: dropuser.c:183 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" msgstr "" @@ -941,54 +951,54 @@ msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: reindexdb.c:210 +#: reindexdb.c:213 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "kann nicht mehrere Jobs verwenden, um Systemkataloge zu reindizieren" -#: reindexdb.c:215 +#: reindexdb.c:218 #, c-format 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:296 reindexdb.c:303 vacuumdb.c:515 vacuumdb.c:522 vacuumdb.c:529 -#: vacuumdb.c:536 vacuumdb.c:543 vacuumdb.c:550 vacuumdb.c:557 vacuumdb.c:562 -#: vacuumdb.c:566 vacuumdb.c:570 vacuumdb.c:574 +#: reindexdb.c:298 reindexdb.c:305 vacuumdb.c:514 vacuumdb.c:521 vacuumdb.c:528 +#: vacuumdb.c:535 vacuumdb.c:542 vacuumdb.c:549 vacuumdb.c:556 vacuumdb.c:563 +#: vacuumdb.c:570 vacuumdb.c:577 vacuumdb.c:584 #, 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" -#: reindexdb.c:584 +#: reindexdb.c:604 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "Reindizieren der Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:588 +#: reindexdb.c:608 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "Reindizieren des Index »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:592 +#: reindexdb.c:612 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "Reindizieren des Schemas »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:596 +#: reindexdb.c:616 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "Reindizieren der Systemkataloge in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:600 +#: reindexdb.c:620 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "Reindizieren der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:824 +#: reindexdb.c:843 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: reindiziere Datenbank »%s«\n" -#: reindexdb.c:867 +#: reindexdb.c:886 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -997,64 +1007,64 @@ "%s reindiziert eine PostgreSQL-Datenbank.\n" "\n" -#: reindexdb.c:871 +#: reindexdb.c:890 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all alle Datenbanken reindizieren\n" -#: reindexdb.c:872 +#: reindexdb.c:891 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently nebenläufig reindizieren\n" -#: reindexdb.c:873 +#: reindexdb.c:892 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME zu reindizierende Datenbank\n" -#: reindexdb.c:875 +#: reindexdb.c:894 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX nur bestimmte(n) Index(e) erneuern\n" -#: reindexdb.c:876 +#: reindexdb.c:895 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr "" " -j, --jobs=NUM so viele parallele Verbindungen zum Reindizieren\n" " verwenden\n" -#: reindexdb.c:877 +#: reindexdb.c:896 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: reindexdb.c:878 +#: reindexdb.c:897 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system nur Systemkataloge reindizieren\n" -#: reindexdb.c:879 +#: reindexdb.c:898 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA nur bestimmte(s) Schema(s) reindizieren\n" -#: reindexdb.c:880 +#: reindexdb.c:899 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABELLE nur bestimmte Tabelle(n) reindizieren\n" -#: reindexdb.c:881 +#: reindexdb.c:900 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE Tablespace wo Indexe neu gebaut werden\n" -#: reindexdb.c:882 +#: reindexdb.c:901 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: reindexdb.c:892 +#: reindexdb.c:911 #, c-format msgid "" "\n" @@ -1105,39 +1115,39 @@ msgid "out of memory" msgstr "Speicher aufgebraucht" -#: vacuumdb.c:502 +#: vacuumdb.c:501 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Erzeuge minimale Optimierer-Statistiken (1 Ziel)" -#: vacuumdb.c:503 +#: vacuumdb.c:502 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Erzeuge mittlere Optimierer-Statistiken (10 Ziele)" -#: vacuumdb.c:504 +#: vacuumdb.c:503 msgid "Generating default (full) optimizer statistics" msgstr "Erzeuge volle Optimierer-Statistiken" -#: vacuumdb.c:583 +#: vacuumdb.c:594 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: bearbeite Datenbank »%s«: %s\n" -#: vacuumdb.c:586 +#: vacuumdb.c:597 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: führe Vacuum in Datenbank »%s« aus\n" -#: vacuumdb.c:1135 +#: vacuumdb.c:1159 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "Vacuum der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: vacuumdb.c:1138 +#: vacuumdb.c:1162 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "Vacuum der Datenbank »%s« fehlgeschlagen: %s" -#: vacuumdb.c:1146 +#: vacuumdb.c:1170 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1146,148 +1156,148 @@ "%s säubert und analysiert eine PostgreSQL-Datenbank.\n" "\n" -#: vacuumdb.c:1150 +#: vacuumdb.c:1174 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all führe Vacuum in allen Datenbanken aus\n" -#: vacuumdb.c:1151 +#: vacuumdb.c:1175 #, c-format msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" msgstr " --buffer-usage-limit=GRÖSSE Größe des für Vacuum verwendeten Ringpuffers\n" -#: vacuumdb.c:1152 +#: vacuumdb.c:1176 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME führe Vacuum in dieser Datenbank aus\n" -#: vacuumdb.c:1153 +#: vacuumdb.c:1177 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping Page-Skipping-Verhalten abschalten\n" -#: vacuumdb.c:1154 +#: vacuumdb.c:1178 #, 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" -#: vacuumdb.c:1155 +#: vacuumdb.c:1179 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full führe volles Vacuum durch\n" -#: vacuumdb.c:1156 +#: vacuumdb.c:1180 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze Zeilentransaktionsinformationen einfrieren\n" -#: vacuumdb.c:1157 +#: vacuumdb.c:1181 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr " --force-index-cleanup Indexeinträge, die auf tote Tupel zeigen, immer entfernen\n" -#: vacuumdb.c:1158 +#: vacuumdb.c:1182 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr "" " -j, --jobs=NUM so viele parallele Verbindungen zum Vacuum\n" " verwenden\n" -#: vacuumdb.c:1159 +#: vacuumdb.c:1183 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr "" " --min-mxid-age=MXID-ALTER minimales Multixact-ID-Alter zu bearbeitender\n" " Tabellen\n" -#: vacuumdb.c:1160 +#: vacuumdb.c:1184 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr "" " --min-xid-age=XID-ALTER minimales Transaktions-ID-Alter zu bearbeitender\n" " Tabellen\n" -#: vacuumdb.c:1161 +#: vacuumdb.c:1185 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr " --no-index-cleanup Indexeinträge, die auf tote Tupel zeigen, nicht entfernen\n" -#: vacuumdb.c:1162 +#: vacuumdb.c:1186 #, c-format msgid " --no-process-main skip the main relation\n" msgstr " --no-process-main die Hauptrelation überspringen\n" -#: vacuumdb.c:1163 +#: vacuumdb.c:1187 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr " --no-process-toast zur Tabelle gehörige TOAST-Tabelle überspringen\n" -#: vacuumdb.c:1164 +#: vacuumdb.c:1188 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate leere Seiten am Ende der Tabelle nicht abschneiden\n" -#: vacuumdb.c:1165 +#: vacuumdb.c:1189 #, c-format msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n" msgstr " -n, --schema=SCHEMA nur Tabellen in den angegebenen Schemas vacuumen\n" -#: vacuumdb.c:1166 +#: vacuumdb.c:1190 #, c-format msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n" msgstr " -N, --exclude-schema=SCHEMA Tabellen in den angegebenen Schemas nicht vacuumen\n" -#: vacuumdb.c:1167 +#: vacuumdb.c:1191 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" " -P, --parallel=PARALLEL-PROZ so viele Background-Worker für Vacuum verwenden,\n" " wenn verfügbar\n" -#: vacuumdb.c:1168 +#: vacuumdb.c:1192 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: vacuumdb.c:1169 +#: vacuumdb.c:1193 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr "" " --skip-locked Relationen überspringen, die nicht sofort\n" " gesperrt werden können\n" -#: vacuumdb.c:1170 +#: vacuumdb.c:1194 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='TABELLE[(SPALTEN)]'\n" " führe Vacuum für bestimmte Tabelle(n) aus\n" -#: vacuumdb.c:1171 +#: vacuumdb.c:1195 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: vacuumdb.c:1172 +#: vacuumdb.c:1196 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: vacuumdb.c:1173 +#: vacuumdb.c:1197 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze aktualisiere Statistiken für den Optimierer\n" -#: vacuumdb.c:1174 +#: vacuumdb.c:1198 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr "" " -Z, --analyze-only aktualisiere nur Statistiken für den Optimierer;\n" " kein Vacuum\n" -#: vacuumdb.c:1175 +#: vacuumdb.c:1199 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1297,12 +1307,12 @@ " in mehreren Phasen für schnellere Ergebnisse;\n" " kein Vacuum\n" -#: vacuumdb.c:1177 +#: vacuumdb.c:1201 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: vacuumdb.c:1185 +#: vacuumdb.c:1209 #, c-format msgid "" "\n" diff -Nru postgresql-17-17.10/src/bin/scripts/po/ru.po postgresql-17-17.11/src/bin/scripts/po/ru.po --- postgresql-17-17.10/src/bin/scripts/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/bin/scripts/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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-05-03 16:06+0300\n" -"PO-Revision-Date: 2024-09-05 08:25+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ 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:70 ../../common/file_utils.c:347 #: ../../common/file_utils.c:406 ../../common/file_utils.c:480 #, c-format @@ -171,12 +181,12 @@ 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 %lld is equal to or exceeds " @@ -185,19 +195,19 @@ "Вывести содержимое таблицы нельзя: число ячеек %lld достигло максимума " "%lld.\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 %lld exceeded.\n" msgstr "" "Ошибка добавления ячейки в таблицу: превышен предел числа ячеек (%lld).\n" -#: ../../fe_utils/print.c:3530 +#: ../../fe_utils/print.c:3531 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутренняя ошибка): %d" diff -Nru postgresql-17-17.10/src/common/blkreftable.c postgresql-17-17.11/src/common/blkreftable.c --- postgresql-17-17.10/src/common/blkreftable.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/common/blkreftable.c 2026-08-10 20:54:09.000000000 +0000 @@ -657,6 +657,15 @@ 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 @@ 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 -Nru postgresql-17-17.10/src/common/unicode/case_test.c postgresql-17-17.11/src/common/unicode/case_test.c --- postgresql-17-17.10/src/common/unicode/case_test.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/common/unicode/case_test.c 2026-08-10 20:54:09.000000000 +0000 @@ -169,6 +169,8 @@ static void test_convert_case() { + size_t needed; + /* test string with no case changes */ test_strlower("√∞", "√∞"); /* test string with case changes */ @@ -176,6 +178,13 @@ /* test string with case changes and byte length changes */ test_strlower("ȺȺȺ", "ⱥⱥⱥ"); + /* invalid UTF8: truncated multibyte sequence */ + needed = unicode_strlower(NULL, 0, "abc\xCE", 4); + Assert(needed == 3); + /* invalid UTF8: invalid byte */ + needed = unicode_strlower(NULL, 0, "abc\xF8xyz", 7); + Assert(needed == 3); + printf("case_test: convert_case: success\n"); } diff -Nru postgresql-17-17.10/src/common/unicode_case.c postgresql-17-17.11/src/common/unicode_case.c --- postgresql-17-17.10/src/common/unicode_case.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/common/unicode_case.c 2026-08-10 20:54:09.000000000 +0000 @@ -126,6 +126,22 @@ return convert_case(dst, dstsize, src, srclen, CaseUpper, NULL, 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; +} + /* * If str_casekind is CaseLower or CaseUpper, map each character in the string * for which a mapping is available. @@ -152,11 +168,18 @@ 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); - const pg_case_map *casemap = find_case_map(u1); + int u1len = utf8_mblen((const unsigned char *) src + srcoff); + pg_wchar u1; + const pg_case_map *casemap; + + /* invalid UTF8 */ + if (u1len < 0 || srcoff + u1len > srclen) + break; + + u1 = utf8_to_unicode((const unsigned char *) src + srcoff); if (str_casekind == CaseTitle) { @@ -169,6 +192,8 @@ chr_casekind = CaseLower; } + casemap = find_case_map(u1); + /* perform mapping, update result_len, and write to dst */ if (casemap) { diff -Nru postgresql-17-17.10/src/common/unicode_norm.c postgresql-17-17.11/src/common/unicode_norm.c --- postgresql-17-17.10/src/common/unicode_norm.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/common/unicode_norm.c 2026-08-10 20:54:09.000000000 +0000 @@ -236,7 +236,7 @@ /* 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 -Nru postgresql-17-17.10/src/fe_utils/conditional.c postgresql-17-17.11/src/fe_utils/conditional.c --- postgresql-17-17.10/src/fe_utils/conditional.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/fe_utils/conditional.c 2026-08-10 20:54:09.000000000 +0000 @@ -57,6 +57,7 @@ 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 @@ if (!p) return false; cstack->head = cstack->head->next; + if (p->lex_state) + free(p->lex_state); free(p); return true; } @@ -167,7 +170,38 @@ } /* + * 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 -Nru postgresql-17-17.10/src/fe_utils/print.c postgresql-17-17.11/src/fe_utils/print.c --- postgresql-17-17.10/src/fe_utils/print.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/fe_utils/print.c 2026-08-10 20:54:09.000000000 +0000 @@ -1458,9 +1458,10 @@ } /* - * 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 @@ if (width < rwidth) width = rwidth; - if (output_columns > 0) + if (cont->opt->format == PRINT_WRAPPED && output_columns > 0) { unsigned int min_width; diff -Nru postgresql-17-17.10/src/fe_utils/psqlscan.l postgresql-17-17.11/src/fe_utils/psqlscan.l --- postgresql-17-17.10/src/fe_utils/psqlscan.l 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/fe_utils/psqlscan.l 2026-08-10 20:54:09.000000000 +0000 @@ -76,6 +76,10 @@ extern int psql_yyget_column(yyscan_t yyscanner); extern void psql_yyset_column(int column_no, yyscan_t yyscanner); +static bool psqlscan_is_copy_from_stdin(PsqlScanState state); +static void psqlscan_track_identifier(PsqlScanState state, + const char *identifier); + %} %option reentrant @@ -680,11 +684,15 @@ ";" { 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; } } @@ -697,8 +705,16 @@ "\\"[;:] { /* 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; + } } "\\" { @@ -924,55 +940,7 @@ {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; } @@ -1000,6 +968,145 @@ /* 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. * * callbacks is a struct of function pointers that encapsulate some @@ -1264,10 +1371,9 @@ /* * 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(). @@ -1281,8 +1387,9 @@ 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; } /* @@ -1307,6 +1414,26 @@ } /* + * 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. * * This is pretty grotty but is needed to preserve the old behavior diff -Nru postgresql-17-17.10/src/fe_utils/string_utils.c postgresql-17-17.11/src/fe_utils/string_utils.c --- postgresql-17-17.10/src/fe_utils/string_utils.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/fe_utils/string_utils.c 2026-08-10 20:54:09.000000000 +0000 @@ -806,6 +806,116 @@ /* + * 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 -Nru postgresql-17-17.10/src/include/access/heapam_xlog.h postgresql-17-17.11/src/include/access/heapam_xlog.h --- postgresql-17-17.10/src/include/access/heapam_xlog.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/access/heapam_xlog.h 2026-08-10 20:54:09.000000000 +0000 @@ -109,6 +109,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 */ @@ -156,12 +159,15 @@ #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)) @@ -172,10 +178,14 @@ * 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 { @@ -200,7 +210,7 @@ /* * 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. @@ -212,8 +222,25 @@ * 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 */ @@ -392,6 +419,9 @@ #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 -Nru postgresql-17-17.10/src/include/access/visibilitymap.h postgresql-17-17.11/src/include/access/visibilitymap.h --- postgresql-17-17.10/src/include/access/visibilitymap.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/access/visibilitymap.h 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/include/access/xlogutils.h postgresql-17-17.11/src/include/access/xlogutils.h --- postgresql-17-17.10/src/include/access/xlogutils.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/access/xlogutils.h 2026-08-10 20:54:09.000000000 +0000 @@ -84,6 +84,8 @@ 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 -Nru postgresql-17-17.10/src/include/c.h postgresql-17-17.11/src/include/c.h --- postgresql-17-17.10/src/include/c.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/c.h 2026-08-10 20:54:09.000000000 +0000 @@ -228,19 +228,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 -Nru postgresql-17-17.10/src/include/catalog/dependency.h postgresql-17-17.11/src/include/catalog/dependency.h --- postgresql-17-17.10/src/include/catalog/dependency.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/catalog/dependency.h 2026-08-10 20:54:09.000000000 +0000 @@ -120,6 +120,10 @@ 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 -Nru postgresql-17-17.10/src/include/catalog/index.h postgresql-17-17.11/src/include/catalog/index.h --- postgresql-17-17.10/src/include/catalog/index.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/catalog/index.h 2026-08-10 20:54:09.000000000 +0000 @@ -65,6 +65,7 @@ #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 -Nru postgresql-17-17.10/src/include/catalog/pg_operator.dat postgresql-17-17.11/src/include/catalog/pg_operator.dat --- postgresql-17-17.10/src/include/catalog/pg_operator.dat 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/catalog/pg_operator.dat 2026-08-10 20:54:09.000000000 +0000 @@ -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', @@ -3262,7 +3262,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 -Nru postgresql-17-17.10/src/include/commands/defrem.h postgresql-17-17.11/src/include/commands/defrem.h --- postgresql-17-17.10/src/include/commands/defrem.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/commands/defrem.h 2026-08-10 20:54:09.000000000 +0000 @@ -81,7 +81,7 @@ 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 -Nru postgresql-17-17.10/src/include/commands/typecmds.h postgresql-17-17.11/src/include/commands/typecmds.h --- postgresql-17-17.10/src/include/commands/typecmds.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/commands/typecmds.h 2026-08-10 20:54:09.000000000 +0000 @@ -35,7 +35,8 @@ 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 -Nru postgresql-17-17.10/src/include/fe_utils/conditional.h postgresql-17-17.11/src/include/fe_utils/conditional.h --- postgresql-17-17.10/src/include/fe_utils/conditional.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/fe_utils/conditional.h 2026-08-10 20:54:09.000000000 +0000 @@ -49,18 +49,18 @@ * 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 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 -Nru postgresql-17-17.10/src/include/fe_utils/psqlscan.h postgresql-17-17.11/src/include/fe_utils/psqlscan.h --- postgresql-17-17.10/src/include/fe_utils/psqlscan.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/fe_utils/psqlscan.h 2026-08-10 20:54:09.000000000 +0000 @@ -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_reselect_sql_lexer(PsqlScanState state); +extern int psql_scan_count_copy_from_stdin(PsqlScanState state); + extern bool psql_scan_in_quote(PsqlScanState state); #endif /* PSQLSCAN_H */ diff -Nru postgresql-17-17.10/src/include/fe_utils/psqlscan_int.h postgresql-17-17.11/src/include/fe_utils/psqlscan_int.h --- postgresql-17-17.10/src/include/fe_utils/psqlscan_int.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/fe_utils/psqlscan_int.h 2026-08-10 20:54:09.000000000 +0000 @@ -116,12 +116,14 @@ 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, @@ -131,6 +133,24 @@ 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 -Nru postgresql-17-17.10/src/include/fe_utils/string_utils.h postgresql-17-17.11/src/include/fe_utils/string_utils.h --- postgresql-17-17.10/src/include/fe_utils/string_utils.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/fe_utils/string_utils.h 2026-08-10 20:54:09.000000000 +0000 @@ -48,6 +48,8 @@ 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 -Nru postgresql-17-17.10/src/include/nodes/parsenodes.h postgresql-17-17.11/src/include/nodes/parsenodes.h --- postgresql-17-17.10/src/include/nodes/parsenodes.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/nodes/parsenodes.h 2026-08-10 20:54:09.000000000 +0000 @@ -3391,6 +3391,7 @@ 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 -Nru postgresql-17-17.10/src/include/replication/logical.h postgresql-17-17.11/src/include/replication/logical.h --- postgresql-17-17.10/src/include/replication/logical.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/replication/logical.h 2026-08-10 20:54:09.000000000 +0000 @@ -152,4 +152,7 @@ extern XLogRecPtr LogicalSlotAdvanceAndCheckSnapState(XLogRecPtr moveto, bool *found_consistent_snapshot); +/* GUCs */ +extern PGDLLIMPORT char *output_plugin_libraries_string; + #endif diff -Nru postgresql-17-17.10/src/include/replication/walreceiver.h postgresql-17-17.11/src/include/replication/walreceiver.h --- postgresql-17-17.10/src/include/replication/walreceiver.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/replication/walreceiver.h 2026-08-10 20:54:09.000000000 +0000 @@ -163,6 +163,13 @@ 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 -Nru postgresql-17-17.10/src/include/tsearch/ts_type.h postgresql-17-17.11/src/include/tsearch/ts_type.h --- postgresql-17-17.10/src/include/tsearch/ts_type.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/tsearch/ts_type.h 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ 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 @@ 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 @@ */ #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 -Nru postgresql-17-17.10/src/include/utils/acl.h postgresql-17-17.11/src/include/utils/acl.h --- postgresql-17-17.10/src/include/utils/acl.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/utils/acl.h 2026-08-10 20:54:09.000000000 +0000 @@ -227,6 +227,9 @@ 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 -Nru postgresql-17-17.10/src/include/utils/lsyscache.h postgresql-17-17.11/src/include/utils/lsyscache.h --- postgresql-17-17.10/src/include/utils/lsyscache.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/utils/lsyscache.h 2026-08-10 20:54:09.000000000 +0000 @@ -83,6 +83,8 @@ 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_btree_interpretation(Oid opno); extern bool equality_ops_are_compatible(Oid opno1, Oid opno2); extern bool comparison_ops_are_compatible(Oid opno1, Oid opno2); diff -Nru postgresql-17-17.10/src/include/utils/numeric.h postgresql-17-17.11/src/include/utils/numeric.h --- postgresql-17-17.10/src/include/utils/numeric.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/utils/numeric.h 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ 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 -Nru postgresql-17-17.10/src/include/utils/pgstat_internal.h postgresql-17-17.11/src/include/utils/pgstat_internal.h --- postgresql-17-17.10/src/include/utils/pgstat_internal.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/utils/pgstat_internal.h 2026-08-10 20:54:09.000000000 +0000 @@ -626,6 +626,8 @@ 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, Oid objoid); +extern bool pgstat_drop_entry_ext(PgStat_Kind kind, Oid dboid, Oid objoid, + bool missing_ok); extern void pgstat_drop_all_entries(void); extern PgStat_EntryRef *pgstat_get_entry_ref_locked(PgStat_Kind kind, Oid dboid, Oid objoid, bool nowait); diff -Nru postgresql-17-17.10/src/include/utils/rel.h postgresql-17-17.11/src/include/utils/rel.h --- postgresql-17-17.10/src/include/utils/rel.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/include/utils/rel.h 2026-08-10 20:54:09.000000000 +0000 @@ -653,6 +653,15 @@ * 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 -Nru postgresql-17-17.10/src/interfaces/ecpg/ecpglib/data.c postgresql-17-17.11/src/interfaces/ecpg/ecpglib/data.c --- postgresql-17-17.10/src/interfaces/ecpg/ecpglib/data.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/ecpg/ecpglib/data.c 2026-08-10 20:54:09.000000000 +0000 @@ -526,6 +526,13 @@ 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 -Nru postgresql-17-17.10/src/interfaces/ecpg/ecpglib/error.c postgresql-17-17.11/src/interfaces/ecpg/ecpglib/error.c --- postgresql-17-17.10/src/interfaces/ecpg/ecpglib/error.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/ecpg/ecpglib/error.c 2026-08-10 20:54:09.000000000 +0000 @@ -130,6 +130,13 @@ 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 -Nru postgresql-17-17.10/src/interfaces/ecpg/include/ecpgerrno.h postgresql-17-17.11/src/interfaces/ecpg/include/ecpgerrno.h --- postgresql-17-17.10/src/interfaces/ecpg/include/ecpgerrno.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/ecpg/include/ecpgerrno.h 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/interfaces/ecpg/preproc/ecpg.trailer postgresql-17-17.11/src/interfaces/ecpg/preproc/ecpg.trailer --- postgresql-17-17.10/src/interfaces/ecpg/preproc/ecpg.trailer 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/ecpg/preproc/ecpg.trailer 2026-08-10 20:54:09.000000000 +0000 @@ -1282,27 +1282,19 @@ * 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 -Nru postgresql-17-17.10/src/interfaces/ecpg/preproc/po/ru.po postgresql-17-17.11/src/interfaces/ecpg/preproc/po/ru.po --- postgresql-17-17.10/src/interfaces/ecpg/preproc/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/ecpg/preproc/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: ecpg (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"POT-Creation-Date: 2026-08-05 06:37+0300\n" "PO-Revision-Date: 2024-09-04 07:22+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -399,7 +399,7 @@ msgid "type \"%s\" is already defined" msgstr "тип \"%s\" уже определён" -#: preproc.y:577 preproc.y:19669 preproc.y:19991 variable.c:624 +#: preproc.y:577 preproc.y:19661 preproc.y:19983 variable.c:624 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "многомерные массивы с простыми типами данных не поддерживаются" @@ -567,23 +567,23 @@ msgid "pointers to varchar are not implemented" msgstr "указатели на varchar не реализованы" -#: preproc.y:19635 +#: preproc.y:19627 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "команда EXEC SQL VAR не может включать инициализатор" -#: preproc.y:19949 +#: preproc.y:19941 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "массивы индикаторов на входе недопустимы" -#: preproc.y:20136 +#: preproc.y:20128 #, c-format msgid "operator not allowed in variable definition" msgstr "недопустимый оператор в определении переменной" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:20177 +#: preproc.y:20169 #, c-format msgid "%s at or near \"%s\"" msgstr "%s (примерное положение: \"%s\")" diff -Nru postgresql-17-17.10/src/interfaces/ecpg/test/expected/sql-bytea.c postgresql-17-17.11/src/interfaces/ecpg/test/expected/sql-bytea.c --- postgresql-17-17.10/src/interfaces/ecpg/test/expected/sql-bytea.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/ecpg/test/expected/sql-bytea.c 2026-08-10 20:54:09.000000000 +0000 @@ -356,17 +356,36 @@ 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 -Nru postgresql-17-17.10/src/interfaces/ecpg/test/expected/sql-bytea.stderr postgresql-17-17.11/src/interfaces/ecpg/test/expected/sql-bytea.stderr --- postgresql-17-17.10/src/interfaces/ecpg/test/expected/sql-bytea.stderr 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/ecpg/test/expected/sql-bytea.stderr 2026-08-10 20:54:09.000000000 +0000 @@ -181,7 +181,29 @@ [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 -Nru postgresql-17-17.10/src/interfaces/ecpg/test/sql/bytea.pgc postgresql-17-17.11/src/interfaces/ecpg/test/sql/bytea.pgc --- postgresql-17-17.10/src/interfaces/ecpg/test/sql/bytea.pgc 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/ecpg/test/sql/bytea.pgc 2026-08-10 20:54:09.000000000 +0000 @@ -113,6 +113,11 @@ 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 -Nru postgresql-17-17.10/src/interfaces/libpq/fe-misc.c postgresql-17-17.11/src/interfaces/libpq/fe-misc.c --- postgresql-17-17.10/src/interfaces/libpq/fe-misc.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/libpq/fe-misc.c 2026-08-10 20:54:09.000000000 +0000 @@ -55,6 +55,8 @@ 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 @@ -578,6 +580,13 @@ /* ---------- * 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 @@ -590,8 +599,7 @@ int pqReadData(PGconn *conn) { - int someread = 0; - int nread; + int available; if (conn->sock == PGINVALID_SOCKET) { @@ -599,6 +607,40 @@ 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) { @@ -785,6 +827,110 @@ 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. * @@ -1076,14 +1222,12 @@ 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 */ do diff -Nru postgresql-17-17.10/src/interfaces/libpq/fe-protocol3.c postgresql-17-17.11/src/interfaces/libpq/fe-protocol3.c --- postgresql-17-17.10/src/interfaces/libpq/fe-protocol3.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/libpq/fe-protocol3.c 2026-08-10 20:54:09.000000000 +0000 @@ -42,7 +42,8 @@ (id) == PqMsg_FunctionCallResponse || \ (id) == PqMsg_NoticeResponse || \ (id) == PqMsg_NotificationResponse || \ - (id) == PqMsg_RowDescription) + (id) == PqMsg_RowDescription || \ + (id) == PqMsg_ParameterDescription) static void handleSyncLoss(PGconn *conn, char id, int msgLength); diff -Nru postgresql-17-17.10/src/interfaces/libpq/fe-secure-gssapi.c postgresql-17-17.11/src/interfaces/libpq/fe-secure-gssapi.c --- postgresql-17-17.10/src/interfaces/libpq/fe-secure-gssapi.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/libpq/fe-secure-gssapi.c 2026-08-10 20:54:09.000000000 +0000 @@ -471,6 +471,13 @@ 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 -Nru postgresql-17-17.10/src/interfaces/libpq/fe-secure-openssl.c postgresql-17-17.11/src/interfaces/libpq/fe-secure-openssl.c --- postgresql-17-17.10/src/interfaces/libpq/fe-secure-openssl.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/libpq/fe-secure-openssl.c 2026-08-10 20:54:09.000000000 +0000 @@ -25,6 +25,7 @@ #include #include #include +#include #include "libpq-fe.h" #include "fe-auth.h" @@ -66,7 +67,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, @@ -252,10 +253,40 @@ 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 @@ -489,7 +520,8 @@ * 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; @@ -508,7 +540,7 @@ #ifdef HAVE_ASN1_STRING_GET0_DATA namedata = ASN1_STRING_get0_data(name_entry); #else - namedata = ASN1_STRING_data(name_entry); + namedata = ASN1_STRING_data(unconstify(ASN1_STRING *, name_entry)); #endif len = ASN1_STRING_length(name_entry); @@ -680,14 +712,14 @@ */ 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) { @@ -695,7 +727,7 @@ (*names_examined)++; rc = openssl_verify_peer_name_matches_certificate_name(conn, - X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subject_name, cn_index)), + X509_NAME_ENTRY_get_data(X509_NAME_get_entry(unconstify(X509_NAME *, subject_name), cn_index)), &common_name); if (common_name) diff -Nru postgresql-17-17.10/src/interfaces/libpq/fe-secure.c postgresql-17-17.11/src/interfaces/libpq/fe-secure.c --- postgresql-17-17.10/src/interfaces/libpq/fe-secure.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/libpq/fe-secure.c 2026-08-10 20:54:09.000000000 +0000 @@ -259,6 +259,30 @@ } /* + * 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. * * Returns the number of bytes written, or a negative value (with errno diff -Nru postgresql-17-17.10/src/interfaces/libpq/libpq-int.h postgresql-17-17.11/src/interfaces/libpq/libpq-int.h --- postgresql-17-17.10/src/interfaces/libpq/libpq-int.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/libpq/libpq-int.h 2026-08-10 20:54:09.000000000 +0000 @@ -779,6 +779,7 @@ 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); @@ -832,9 +833,9 @@ 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. @@ -882,6 +883,7 @@ */ 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 -Nru postgresql-17-17.10/src/interfaces/libpq/po/de.po postgresql-17-17.11/src/interfaces/libpq/po/de.po --- postgresql-17-17.10/src/interfaces/libpq/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/libpq/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 08:28+0000\n" +"POT-Creation-Date: 2026-08-07 09:21+0000\n" "PO-Revision-Date: 2025-03-07 11:34+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -77,12 +77,12 @@ #: fe-connect.c:5788 fe-connect.c:5886 fe-connect.c:6137 fe-connect.c:6164 #: fe-connect.c:6240 fe-connect.c:6263 fe-connect.c:6287 fe-connect.c:6322 #: fe-connect.c:6408 fe-connect.c:6416 fe-connect.c:6773 fe-connect.c:6923 -#: fe-exec.c:530 fe-exec.c:1320 fe-exec.c:3259 fe-exec.c:4330 fe-exec.c:4523 -#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:210 fe-protocol3.c:233 -#: fe-protocol3.c:256 fe-protocol3.c:273 fe-protocol3.c:294 fe-protocol3.c:370 -#: fe-protocol3.c:738 fe-protocol3.c:977 fe-protocol3.c:1801 -#: fe-protocol3.c:2201 fe-secure-common.c:110 fe-secure-gssapi.c:508 -#: fe-secure-gssapi.c:699 fe-secure-openssl.c:427 fe-secure-openssl.c:1277 +#: fe-exec.c:531 fe-exec.c:1321 fe-exec.c:3274 fe-exec.c:4324 fe-exec.c:4517 +#: 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:372 +#: fe-protocol3.c:740 fe-protocol3.c:979 fe-protocol3.c:1803 +#: fe-protocol3.c:2214 fe-secure-common.c:110 fe-secure-gssapi.c:515 +#: fe-secure-gssapi.c:706 fe-secure-openssl.c:458 fe-secure-openssl.c:1309 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -337,7 +337,7 @@ msgid "connection pointer is NULL" msgstr "Verbindung ist ein NULL-Zeiger" -#: fe-cancel.c:82 fe-misc.c:598 +#: fe-cancel.c:82 fe-misc.c:606 #, c-format msgid "connection not open" msgstr "Verbindung nicht offen" @@ -801,8 +801,8 @@ msgid "connection pointer is NULL\n" msgstr "Verbindung ist ein NULL-Zeiger\n" -#: fe-connect.c:7185 fe-exec.c:718 fe-exec.c:980 fe-exec.c:3464 -#: fe-protocol3.c:992 fe-protocol3.c:1025 +#: fe-connect.c:7185 fe-exec.c:719 fe-exec.c:981 fe-exec.c:3479 +#: fe-protocol3.c:994 fe-protocol3.c:1027 msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" @@ -826,176 +826,176 @@ 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:3538 +#: fe-exec.c:470 fe-exec.c:3553 #, 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:2007 +#: fe-exec.c:532 fe-protocol3.c:2009 #, 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:1443 fe-exec.c:1512 fe-exec.c:1558 +#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 #, c-format msgid "command string is a null pointer" msgstr "Befehlszeichenkette ist ein NULL-Zeiger" -#: fe-exec.c:1449 fe-exec.c:3008 +#: fe-exec.c:1450 fe-exec.c:3023 #, c-format msgid "%s not allowed in pipeline mode" msgstr "%s im Pipeline-Modus nicht erlaubt" -#: fe-exec.c:1517 fe-exec.c:1563 fe-exec.c:1657 +#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 #, 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:1553 fe-exec.c:1652 +#: fe-exec.c:1554 fe-exec.c:1653 #, c-format msgid "statement name is a null pointer" msgstr "Anweisungsname ist ein NULL-Zeiger" -#: fe-exec.c:1694 fe-exec.c:3384 +#: fe-exec.c:1695 fe-exec.c:3399 #, c-format msgid "no connection to the server" msgstr "keine Verbindung mit dem Server" -#: fe-exec.c:1702 fe-exec.c:3392 +#: fe-exec.c:1703 fe-exec.c:3407 #, c-format msgid "another command is already in progress" msgstr "ein anderer Befehl ist bereits in Ausführung" -#: fe-exec.c:1732 +#: fe-exec.c:1733 #, c-format msgid "cannot queue commands during COPY" msgstr "während COPY können keine Befehle aufgereiht werden" -#: fe-exec.c:1851 +#: fe-exec.c:1852 #, c-format msgid "length must be given for binary parameter" msgstr "für binäre Parameter muss eine Länge angegeben werden" -#: fe-exec.c:2210 +#: fe-exec.c:2211 #, c-format msgid "unexpected asyncStatus: %d" msgstr "unerwarteter asyncStatus: %d" -#: fe-exec.c:2366 +#: fe-exec.c:2367 #, 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:2383 +#: fe-exec.c:2384 msgid "COPY terminated by new PQexec" msgstr "COPY von neuem PQexec beendet" -#: fe-exec.c:2399 +#: fe-exec.c:2400 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "PQexec ist während COPY BOTH nicht erlaubt" -#: fe-exec.c:2635 +#: fe-exec.c:2636 #, c-format msgid "unrecognized message type \"%c\"" msgstr "unbekannter Message-Typ »%c«" -#: fe-exec.c:2707 fe-exec.c:2761 fe-exec.c:2829 fe-protocol3.c:1938 +#: fe-exec.c:2708 fe-exec.c:2762 fe-exec.c:2830 fe-protocol3.c:1940 #, c-format msgid "no COPY in progress" msgstr "keine COPY in Ausführung" -#: fe-exec.c:3015 +#: fe-exec.c:3030 #, c-format msgid "connection in wrong state" msgstr "Verbindung im falschen Zustand" -#: fe-exec.c:3058 +#: fe-exec.c:3073 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "kann Pipeline-Modus nicht einschalten, Verbindung ist nicht inaktiv" -#: fe-exec.c:3094 fe-exec.c:3115 +#: fe-exec.c:3109 fe-exec.c:3130 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "kann Pipeline-Modus nicht beenden, wegen nicht eingesammelter Ergebnisse" -#: fe-exec.c:3098 +#: fe-exec.c:3113 #, 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:3109 +#: fe-exec.c:3124 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "kann Pipeline-Modus nicht beenden während COPY aktiv ist" -#: fe-exec.c:3308 +#: fe-exec.c:3323 #, 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:3427 +#: fe-exec.c:3442 msgid "invalid ExecStatusType code" msgstr "ungültiger ExecStatusType-Kode" -#: fe-exec.c:3454 +#: fe-exec.c:3469 msgid "PGresult is not an error result\n" msgstr "PGresult ist kein Fehlerresultat\n" -#: fe-exec.c:3522 fe-exec.c:3545 +#: fe-exec.c:3537 fe-exec.c:3560 #, 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:3560 +#: fe-exec.c:3575 #, 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:3871 +#: fe-exec.c:3886 #, c-format msgid "could not interpret result from server: %s" msgstr "konnte Ergebnis vom Server nicht interpretieren: %s" -#: fe-exec.c:4146 fe-exec.c:4281 +#: fe-exec.c:4161 fe-exec.c:4275 #, c-format msgid "incomplete multibyte character" msgstr "unvollständiges Mehrbyte-Zeichen" -#: fe-exec.c:4148 fe-exec.c:4300 +#: fe-exec.c:4163 fe-exec.c:4294 #, c-format msgid "invalid multibyte character" msgstr "ungültiges Mehrbytezeichen" -#: fe-exec.c:4402 +#: fe-exec.c:4396 #, c-format msgid "escaped string size exceeds the maximum allowed (%zu)" msgstr "Größe der escapten Zeichenkette überschreitet erlaubtes Maximum (%zu)" -#: fe-exec.c:4579 +#: fe-exec.c:4573 #, c-format msgid "escaped bytea size exceeds the maximum allowed (%zu)" msgstr "Größe des escapten bytea-Wertes überschreitet erlaubtes Maximum (%zu)" @@ -1046,18 +1046,18 @@ 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:776 fe-secure-openssl.c:203 fe-secure-openssl.c:309 -#: fe-secure.c:237 fe-secure.c:404 +#: fe-misc.c:818 fe-secure-openssl.c:204 fe-secure-openssl.c:340 +#: fe-secure.c:237 fe-secure.c:428 #, c-format msgid "" "server closed the connection unexpectedly\n" @@ -1068,172 +1068,182 @@ "\tDas heißt wahrscheinlich, dass der Server abnormal beendete\n" "\tbevor oder während die Anweisung bearbeitet wurde." -#: fe-misc.c:843 +#: fe-misc.c:927 +#, 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:989 msgid "connection not open\n" msgstr "Verbindung nicht offen\n" -#: fe-misc.c:1031 +#: fe-misc.c:1177 #, c-format msgid "timeout expired" msgstr "Timeout abgelaufen" -#: fe-misc.c:1075 +#: fe-misc.c:1221 #, c-format msgid "invalid socket" msgstr "ungültiges Socket" -#: fe-misc.c:1097 +#: fe-misc.c:1241 #, c-format msgid "%s() failed: %s" msgstr "%s() fehlgeschlagen: %s" -#: fe-protocol3.c:188 +#: fe-protocol3.c:190 #, 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:468 +#: fe-protocol3.c:470 #, 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:486 +#: fe-protocol3.c:488 #, 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:538 fe-protocol3.c:578 +#: fe-protocol3.c:540 fe-protocol3.c:580 msgid "insufficient data in \"T\" message" msgstr "nicht genug Daten in »T«-Nachricht" -#: fe-protocol3.c:649 fe-protocol3.c:855 +#: fe-protocol3.c:651 fe-protocol3.c:857 msgid "out of memory for query result" msgstr "Speicher für Anfrageergebnis aufgebraucht" -#: fe-protocol3.c:718 +#: fe-protocol3.c:720 msgid "insufficient data in \"t\" message" msgstr "nicht genug Daten in »t«-Nachricht" -#: fe-protocol3.c:777 fe-protocol3.c:809 fe-protocol3.c:827 +#: fe-protocol3.c:779 fe-protocol3.c:811 fe-protocol3.c:829 msgid "insufficient data in \"D\" message" msgstr "nicht genug Daten in »D«-Nachricht" -#: fe-protocol3.c:783 +#: fe-protocol3.c:785 msgid "unexpected field count in \"D\" message" msgstr "unerwartete Feldzahl in »D«-Nachricht" -#: fe-protocol3.c:1038 +#: fe-protocol3.c:1040 msgid "no error message available\n" msgstr "keine Fehlermeldung verfügbar\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1086 fe-protocol3.c:1105 +#: fe-protocol3.c:1088 fe-protocol3.c:1107 #, c-format msgid " at character %s" msgstr " bei Zeichen %s" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1120 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1121 +#: fe-protocol3.c:1123 #, c-format msgid "HINT: %s\n" msgstr "TIP: %s\n" -#: fe-protocol3.c:1124 +#: fe-protocol3.c:1126 #, c-format msgid "QUERY: %s\n" msgstr "ANFRAGE: %s\n" -#: fe-protocol3.c:1131 +#: fe-protocol3.c:1133 #, c-format msgid "CONTEXT: %s\n" msgstr "KONTEXT: %s\n" -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1142 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMANAME: %s\n" -#: fe-protocol3.c:1144 +#: fe-protocol3.c:1146 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABELLENNAME: %s\n" -#: fe-protocol3.c:1148 +#: fe-protocol3.c:1150 #, c-format msgid "COLUMN NAME: %s\n" msgstr "SPALTENNAME: %s\n" -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1154 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATENTYPNAME: %s\n" -#: fe-protocol3.c:1156 +#: fe-protocol3.c:1158 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT-NAME: %s\n" -#: fe-protocol3.c:1168 +#: fe-protocol3.c:1170 msgid "LOCATION: " msgstr "ORT: " -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1172 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1174 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1380 +#: fe-protocol3.c:1382 #, c-format msgid "LINE %d: " msgstr "ZEILE %d: " -#: fe-protocol3.c:1454 +#: fe-protocol3.c:1456 #, c-format msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" msgstr "Protokollversion nicht vom Server unterstützt: Client verwendet %u.%u, Server unterstützt bis %u.%u" -#: fe-protocol3.c:1460 +#: fe-protocol3.c:1462 #, c-format msgid "protocol extension not supported by server: %s" msgid_plural "protocol extensions not supported by server: %s" msgstr[0] "Protokollerweiterung nicht vom Server unterstützt: %s" msgstr[1] "Protokollerweiterungen nicht vom Server unterstützt: %s" -#: fe-protocol3.c:1468 +#: fe-protocol3.c:1470 #, c-format msgid "invalid %s message" msgstr "ungültige %s-Nachricht" -#: fe-protocol3.c:1833 +#: fe-protocol3.c:1835 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline: Text COPY OUT nicht ausgeführt" -#: fe-protocol3.c:2207 +#: fe-protocol3.c:2166 +#, c-format +msgid "server returned too much data" +msgstr "Server hat zu viele Daten zurückgesendet" + +#: fe-protocol3.c:2220 #, c-format msgid "protocol error: no function result" msgstr "Protokollfehler: kein Funktionsergebnis" -#: fe-protocol3.c:2218 +#: fe-protocol3.c:2231 #, c-format msgid "protocol error: id=0x%x" msgstr "Protokollfehler: id=0x%x" @@ -1284,12 +1294,12 @@ 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)" @@ -1303,100 +1313,110 @@ 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:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 +#: fe-secure-openssl.c:208 fe-secure-openssl.c:344 fe-secure-openssl.c:1556 #, c-format msgid "SSL SYSCALL error: %s" msgstr "SSL-SYSCALL-Fehler: %s" -#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 +#: fe-secure-openssl.c:214 fe-secure-openssl.c:350 fe-secure-openssl.c:1559 #, c-format msgid "SSL SYSCALL error: EOF detected" msgstr "SSL-SYSCALL-Fehler: Dateiende entdeckt" -#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 +#: fe-secure-openssl.c:224 fe-secure-openssl.c:360 fe-secure-openssl.c:1567 #, c-format msgid "SSL error: %s" msgstr "SSL-Fehler: %s" -#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 +#: fe-secure-openssl.c:238 fe-secure-openssl.c:374 #, c-format msgid "SSL connection has been closed unexpectedly" msgstr "SSL-Verbindung wurde unerwartet geschlossen" -#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 +#: fe-secure-openssl.c:243 fe-secure-openssl.c:379 fe-secure-openssl.c:1614 #, c-format msgid "unrecognized SSL error code: %d" msgstr "unbekannter SSL-Fehlercode: %d" -#: fe-secure-openssl.c:390 +#: fe-secure-openssl.c:273 +#, c-format +msgid "OpenSSL reports negative bytes pending" +msgstr "OpenSSL meldet eine negative Anzahl ausstehender Bytes" + +#: fe-secure-openssl.c:285 +#, c-format +msgid "OpenSSL reports INT_MAX bytes pending" +msgstr "OpenSSL meldet INT_MAX ausstehende Bytes" + +#: fe-secure-openssl.c:421 #, c-format msgid "could not determine server certificate signature algorithm" msgstr "konnte Signaturalgorithmus des Serverzertifikats nicht ermitteln" -#: fe-secure-openssl.c:410 +#: fe-secure-openssl.c:441 #, c-format msgid "could not find digest for NID %s" msgstr "konnte Digest für NID %s nicht finden" -#: fe-secure-openssl.c:419 +#: fe-secure-openssl.c:450 #, c-format msgid "could not generate peer certificate hash" msgstr "konnte Hash des Zertifikats der Gegenstelle nicht erzeugen" -#: fe-secure-openssl.c:501 +#: fe-secure-openssl.c:533 #, c-format msgid "SSL certificate's name entry is missing" msgstr "Namenseintrag fehlt im SSL-Zertifikat" -#: fe-secure-openssl.c:535 +#: fe-secure-openssl.c:567 #, c-format msgid "SSL certificate's address entry is missing" msgstr "Adresseintrag fehlt im SSL-Zertifikat" -#: fe-secure-openssl.c:935 +#: fe-secure-openssl.c:967 #, c-format msgid "could not create SSL context: %s" msgstr "konnte SSL-Kontext nicht erzeugen: %s" -#: fe-secure-openssl.c:977 +#: fe-secure-openssl.c:1009 #, 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:987 +#: fe-secure-openssl.c:1019 #, c-format msgid "could not set minimum SSL protocol version: %s" msgstr "konnte minimale SSL-Protokollversion nicht setzen: %s" -#: fe-secure-openssl.c:1003 +#: fe-secure-openssl.c:1035 #, 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:1013 +#: fe-secure-openssl.c:1045 #, c-format msgid "could not set maximum SSL protocol version: %s" msgstr "konnte maximale SSL-Protokollversion nicht setzen: %s" -#: fe-secure-openssl.c:1051 +#: fe-secure-openssl.c:1083 #, c-format msgid "could not load system root certificate paths: %s" msgstr "konnte System-Root-Zertifikat-Pfade nicht laden: %s" -#: fe-secure-openssl.c:1068 +#: fe-secure-openssl.c:1100 #, c-format msgid "could not read root certificate file \"%s\": %s" msgstr "konnte Root-Zertifikat-Datei »%s« nicht lesen: %s" -#: fe-secure-openssl.c:1120 +#: fe-secure-openssl.c:1152 #, c-format msgid "" "could not get home directory to locate root certificate file\n" @@ -1405,7 +1425,7 @@ "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:1123 +#: fe-secure-openssl.c:1155 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1414,117 +1434,117 @@ "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:1158 +#: fe-secure-openssl.c:1190 #, c-format msgid "could not open certificate file \"%s\": %s" msgstr "konnte Zertifikatdatei »%s« nicht öffnen: %s" -#: fe-secure-openssl.c:1176 +#: fe-secure-openssl.c:1208 #, c-format msgid "could not read certificate file \"%s\": %s" msgstr "konnte Zertifikatdatei »%s« nicht lesen: %s" -#: fe-secure-openssl.c:1200 +#: fe-secure-openssl.c:1232 #, c-format msgid "could not establish SSL connection: %s" msgstr "konnte SSL-Verbindung nicht aufbauen: %s" -#: fe-secure-openssl.c:1232 +#: fe-secure-openssl.c:1264 #, 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:1249 +#: fe-secure-openssl.c:1281 #, c-format msgid "could not set SSL ALPN extension: %s" msgstr "konnte SSL-ALPN-Erweiterung nicht setzen: %s" -#: fe-secure-openssl.c:1292 +#: fe-secure-openssl.c:1324 #, c-format msgid "could not load SSL engine \"%s\": %s" msgstr "konnte SSL-Engine »%s« nicht laden: %s" -#: fe-secure-openssl.c:1303 +#: fe-secure-openssl.c:1335 #, c-format msgid "could not initialize SSL engine \"%s\": %s" msgstr "konnte SSL-Engine »%s« nicht initialisieren: %s" -#: fe-secure-openssl.c:1318 +#: fe-secure-openssl.c:1350 #, 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:1331 +#: fe-secure-openssl.c:1363 #, 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:1368 +#: fe-secure-openssl.c:1400 #, c-format msgid "certificate present, but not private key file \"%s\"" msgstr "Zertifikat vorhanden, aber keine private Schlüsseldatei »%s«" -#: fe-secure-openssl.c:1371 +#: fe-secure-openssl.c:1403 #, 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:1379 +#: fe-secure-openssl.c:1411 #, 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:1412 +#: fe-secure-openssl.c:1444 #, 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:1436 +#: fe-secure-openssl.c:1468 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "konnte private Schlüsseldatei »%s« nicht laden: %s" -#: fe-secure-openssl.c:1452 +#: fe-secure-openssl.c:1484 #, 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:1521 +#: fe-secure-openssl.c:1553 #, c-format msgid "SSL error: certificate verify failed: %s" msgstr "SSL-Fehler: Zertifikatsüberprüfung fehlgeschlagen: %s" -#: fe-secure-openssl.c:1566 +#: fe-secure-openssl.c:1598 #, 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:1598 +#: fe-secure-openssl.c:1630 #, 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:1610 +#: fe-secure-openssl.c:1642 #, c-format msgid "SSL connection was established with unexpected ALPN protocol" msgstr "SSL-Verbindung wurde mit unerwartetem ALPN-Protokoll aufgebaut" -#: fe-secure-openssl.c:1627 +#: fe-secure-openssl.c:1659 #, c-format msgid "certificate could not be obtained: %s" msgstr "Zertifikat konnte nicht ermittelt werden: %s" -#: fe-secure-openssl.c:1734 +#: fe-secure-openssl.c:1766 #, c-format msgid "no SSL error reported" msgstr "kein SSL-Fehler berichtet" -#: fe-secure-openssl.c:1777 +#: fe-secure-openssl.c:1809 #, c-format msgid "SSL error code %lu" msgstr "SSL-Fehlercode %lu" -#: fe-secure-openssl.c:2076 +#: fe-secure-openssl.c:2108 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "WARNUNG: sslpassword abgeschnitten\n" @@ -1534,7 +1554,7 @@ msgid "could not receive data from server: %s" msgstr "konnte keine Daten vom Server empfangen: %s" -#: fe-secure.c:419 +#: fe-secure.c:443 #, c-format msgid "could not send data to server: %s" msgstr "konnte keine Daten an den Server senden: %s" diff -Nru postgresql-17-17.10/src/interfaces/libpq/po/ja.po postgresql-17-17.11/src/interfaces/libpq/po/ja.po --- postgresql-17-17.10/src/interfaces/libpq/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/libpq/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: libpq (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-11-11 13:58+0900\n" -"PO-Revision-Date: 2025-11-11 15:40+0900\n" +"POT-Creation-Date: 2026-05-12 14:46+0900\n" +"PO-Revision-Date: 2026-05-15 12:14+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -80,11 +80,11 @@ #: fe-connect.c:5788 fe-connect.c:5886 fe-connect.c:6137 fe-connect.c:6164 #: fe-connect.c:6240 fe-connect.c:6263 fe-connect.c:6287 fe-connect.c:6322 #: fe-connect.c:6408 fe-connect.c:6416 fe-connect.c:6773 fe-connect.c:6923 -#: fe-exec.c:530 fe-exec.c:1320 fe-exec.c:3259 fe-exec.c:4330 fe-exec.c:4523 -#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:210 fe-protocol3.c:233 -#: fe-protocol3.c:256 fe-protocol3.c:273 fe-protocol3.c:294 fe-protocol3.c:370 -#: fe-protocol3.c:738 fe-protocol3.c:977 fe-protocol3.c:1801 -#: fe-protocol3.c:2201 fe-secure-common.c:110 fe-secure-gssapi.c:508 +#: fe-exec.c:531 fe-exec.c:1321 fe-exec.c:3274 fe-exec.c:4324 fe-exec.c:4517 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:211 fe-protocol3.c:234 +#: fe-protocol3.c:257 fe-protocol3.c:274 fe-protocol3.c:295 fe-protocol3.c:371 +#: fe-protocol3.c:739 fe-protocol3.c:978 fe-protocol3.c:1802 +#: fe-protocol3.c:2213 fe-secure-common.c:110 fe-secure-gssapi.c:508 #: fe-secure-gssapi.c:699 fe-secure-openssl.c:427 fe-secure-openssl.c:1277 #, c-format msgid "out of memory" @@ -804,8 +804,8 @@ msgid "connection pointer is NULL\n" msgstr "接続ポインタはNULLです\n" -#: fe-connect.c:7185 fe-exec.c:718 fe-exec.c:980 fe-exec.c:3464 -#: fe-protocol3.c:992 fe-protocol3.c:1025 +#: fe-connect.c:7185 fe-exec.c:719 fe-exec.c:981 fe-exec.c:3479 +#: fe-protocol3.c:993 fe-protocol3.c:1026 msgid "out of memory\n" msgstr "メモリ不足\n" @@ -829,176 +829,176 @@ msgid "invalid integer value \"%s\" for connection option \"%s\"" msgstr "接続オプション\"%2$s\"に対する不正な整数値\"%1$s\"" -#: fe-exec.c:469 fe-exec.c:3538 +#: fe-exec.c:470 fe-exec.c:3553 #, c-format msgid "row number %d is out of range 0..%d" msgstr "行番号%dは0..%dの範囲を超えています" -#: fe-exec.c:531 fe-protocol3.c:2007 +#: fe-exec.c:532 fe-protocol3.c:2008 #, 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:1443 fe-exec.c:1512 fe-exec.c:1558 +#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 #, c-format msgid "command string is a null pointer" msgstr "コマンド文字列がヌルポインタです" -#: fe-exec.c:1449 fe-exec.c:3008 +#: fe-exec.c:1450 fe-exec.c:3023 #, c-format msgid "%s not allowed in pipeline mode" msgstr "%sはパイプラインモードでは使用できません" -#: fe-exec.c:1517 fe-exec.c:1563 fe-exec.c:1657 +#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 #, c-format msgid "number of parameters must be between 0 and %d" msgstr "パラメータ数は0から%dまでの間でなければなりません" -#: fe-exec.c:1553 fe-exec.c:1652 +#: fe-exec.c:1554 fe-exec.c:1653 #, c-format msgid "statement name is a null pointer" msgstr "文の名前がヌルポインタです" -#: fe-exec.c:1694 fe-exec.c:3384 +#: fe-exec.c:1695 fe-exec.c:3399 #, c-format msgid "no connection to the server" msgstr "サーバーへの接続がありません" -#: fe-exec.c:1702 fe-exec.c:3392 +#: fe-exec.c:1703 fe-exec.c:3407 #, c-format msgid "another command is already in progress" msgstr "他のコマンドがすでに処理中です" -#: fe-exec.c:1732 +#: fe-exec.c:1733 #, c-format msgid "cannot queue commands during COPY" msgstr "COPY中はコマンドのキューイングはできません" -#: fe-exec.c:1851 +#: fe-exec.c:1852 #, c-format msgid "length must be given for binary parameter" msgstr "バイナリパラメータには長さを指定する必要があります" -#: fe-exec.c:2210 +#: fe-exec.c:2211 #, c-format msgid "unexpected asyncStatus: %d" msgstr "想定外のasyncStatus: %d" -#: fe-exec.c:2366 +#: fe-exec.c:2367 #, c-format msgid "synchronous command execution functions are not allowed in pipeline mode" msgstr "同期的にコマンドを実行する関数はパイプラインモード中は実行できません" -#: fe-exec.c:2383 +#: fe-exec.c:2384 msgid "COPY terminated by new PQexec" msgstr "新たなPQexec\"によりCOPYが終了しました" -#: fe-exec.c:2399 +#: fe-exec.c:2400 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "COPY BOTH 実行中の PQexec は許可されていません" -#: fe-exec.c:2635 +#: fe-exec.c:2636 #, c-format msgid "unrecognized message type \"%c\"" msgstr "認識できないメッセージタイプ\"%c\"" -#: fe-exec.c:2707 fe-exec.c:2761 fe-exec.c:2829 fe-protocol3.c:1938 +#: fe-exec.c:2708 fe-exec.c:2762 fe-exec.c:2830 fe-protocol3.c:1939 #, c-format msgid "no COPY in progress" msgstr "実行中のCOPYはありません" -#: fe-exec.c:3015 +#: fe-exec.c:3030 #, c-format msgid "connection in wrong state" msgstr "接続状態が異常です" -#: fe-exec.c:3058 +#: fe-exec.c:3073 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "パイプラインモードに入れません、接続がアイドル状態ではありません" -#: fe-exec.c:3094 fe-exec.c:3115 +#: fe-exec.c:3109 fe-exec.c:3130 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "未回収の結果が残っている状態でパイプラインモードを抜けることはできません" -#: fe-exec.c:3098 +#: fe-exec.c:3113 #, c-format msgid "cannot exit pipeline mode while busy" msgstr "ビジー状態でパイプラインモードを抜けることはできません" -#: fe-exec.c:3109 +#: fe-exec.c:3124 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "COPY実行中にパイプラインモードを抜けることはできません" -#: fe-exec.c:3308 +#: fe-exec.c:3323 #, c-format msgid "cannot send pipeline when not in pipeline mode" msgstr "パイプラインモード外でパイプライン送出はできません" -#: fe-exec.c:3427 +#: fe-exec.c:3442 msgid "invalid ExecStatusType code" msgstr "ExecStatusTypeコードが不正です" -#: fe-exec.c:3454 +#: fe-exec.c:3469 msgid "PGresult is not an error result\n" msgstr "PGresutがエラー結果ではありません\n" -#: fe-exec.c:3522 fe-exec.c:3545 +#: fe-exec.c:3537 fe-exec.c:3560 #, c-format msgid "column number %d is out of range 0..%d" msgstr "列番号%dは0..%dの範囲を超えています" -#: fe-exec.c:3560 +#: fe-exec.c:3575 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "パラメータ%dは0..%dの範囲を超えています" -#: fe-exec.c:3871 +#: fe-exec.c:3886 #, c-format msgid "could not interpret result from server: %s" msgstr "サーバーからの結果を解釈できませんでした: %s" -#: fe-exec.c:4146 fe-exec.c:4281 +#: fe-exec.c:4161 fe-exec.c:4275 #, c-format msgid "incomplete multibyte character" msgstr "不完全なマルチバイト文字" -#: fe-exec.c:4148 fe-exec.c:4300 +#: fe-exec.c:4163 fe-exec.c:4294 #, c-format msgid "invalid multibyte character" msgstr "不正なマルチバイト文字" -#: fe-exec.c:4402 +#: fe-exec.c:4396 #, c-format msgid "escaped string size exceeds the maximum allowed (%zu)" msgstr "エスケープされた文字列のサイズが上限(%zu)を超えています" -#: fe-exec.c:4579 +#: fe-exec.c:4573 #, c-format msgid "escaped bytea size exceeds the maximum allowed (%zu)" msgstr "エスケープされたbyteaのサイズが上限(%zu)を超えています" @@ -1090,152 +1090,157 @@ msgid "%s() failed: %s" msgstr "%s() が失敗しました: %s" -#: fe-protocol3.c:188 +#: fe-protocol3.c:189 #, 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:468 +#: fe-protocol3.c:469 #, c-format msgid "message contents do not agree with length in message type \"%c\"" msgstr "メッセージの内容がメッセージタイプ\"%c\"での長さと合っていません" -#: fe-protocol3.c:486 +#: fe-protocol3.c:487 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "サーバーとの同期が失われました。受信したメッセージタイプは\"%c\"、長さは%d" -#: fe-protocol3.c:538 fe-protocol3.c:578 +#: fe-protocol3.c:539 fe-protocol3.c:579 msgid "insufficient data in \"T\" message" msgstr "\"T\"メッセージ内のデータが不十分です" -#: fe-protocol3.c:649 fe-protocol3.c:855 +#: fe-protocol3.c:650 fe-protocol3.c:856 msgid "out of memory for query result" msgstr "問い合わせ結果用のメモリが不足しています" -#: fe-protocol3.c:718 +#: fe-protocol3.c:719 msgid "insufficient data in \"t\" message" msgstr "\"t\"メッセージ内のデータが足りません" -#: fe-protocol3.c:777 fe-protocol3.c:809 fe-protocol3.c:827 +#: fe-protocol3.c:778 fe-protocol3.c:810 fe-protocol3.c:828 msgid "insufficient data in \"D\" message" msgstr "\"D\"\"メッセージ内のデータが不十分です" -#: fe-protocol3.c:783 +#: fe-protocol3.c:784 msgid "unexpected field count in \"D\" message" msgstr "\"D\"メッセージ内のフィールド数が想定外です。" -#: fe-protocol3.c:1038 +#: fe-protocol3.c:1039 msgid "no error message available\n" msgstr "エラーメッセージがありません\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1086 fe-protocol3.c:1105 +#: fe-protocol3.c:1087 fe-protocol3.c:1106 #, c-format msgid " at character %s" msgstr "(文字位置: %s)" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1119 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1121 +#: fe-protocol3.c:1122 #, c-format msgid "HINT: %s\n" msgstr "HINT: %s\n" -#: fe-protocol3.c:1124 +#: fe-protocol3.c:1125 #, c-format msgid "QUERY: %s\n" msgstr "QUERY: %s\n" -#: fe-protocol3.c:1131 +#: fe-protocol3.c:1132 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXT: %s\n" -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1141 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMA NAME: %s\n" -#: fe-protocol3.c:1144 +#: fe-protocol3.c:1145 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABLE NAME: %s\n" -#: fe-protocol3.c:1148 +#: fe-protocol3.c:1149 #, c-format msgid "COLUMN NAME: %s\n" msgstr "COLUMN NAME: %s\n" -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1153 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPE NAME: %s\n" -#: fe-protocol3.c:1156 +#: fe-protocol3.c:1157 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT NAME: %s\n" -#: fe-protocol3.c:1168 +#: fe-protocol3.c:1169 msgid "LOCATION: " msgstr "LOCATION: " -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1171 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1173 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1380 +#: fe-protocol3.c:1381 #, c-format msgid "LINE %d: " msgstr "行 %d: " -#: fe-protocol3.c:1454 +#: fe-protocol3.c:1455 #, c-format msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" msgstr "サーバーはこのプロトコルバージョンをサポートしていません。クライアントは%u.%uを使用、 サーバーは%u.%uまでをサポートします" -#: fe-protocol3.c:1460 +#: fe-protocol3.c:1461 #, c-format msgid "protocol extension not supported by server: %s" msgid_plural "protocol extensions not supported by server: %s" msgstr[0] "サーバーでサポートされていないプロトコル拡張: %s" -#: fe-protocol3.c:1468 +#: fe-protocol3.c:1469 #, c-format msgid "invalid %s message" msgstr "不正な%sメッセージ" -#: fe-protocol3.c:1833 +#: fe-protocol3.c:1834 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline: テキストのCOPY OUTを行っていません" -#: fe-protocol3.c:2207 +#: fe-protocol3.c:2165 +#, c-format +msgid "server returned too much data" +msgstr "サーバーが返却したデータが多すぎます" + +#: fe-protocol3.c:2219 #, c-format msgid "protocol error: no function result" msgstr "プロトコルエラー: 関数の結果がありません" -#: fe-protocol3.c:2218 +#: fe-protocol3.c:2230 #, c-format msgid "protocol error: id=0x%x" msgstr "プロトコルエラー: id=0x%x" diff -Nru postgresql-17-17.10/src/interfaces/libpq/po/ru.po postgresql-17-17.11/src/interfaces/libpq/po/ru.po --- postgresql-17-17.10/src/interfaces/libpq/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/interfaces/libpq/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: libpq (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2026-02-07 11:39+0200\n" -"PO-Revision-Date: 2026-02-07 10:48+0200\n" +"POT-Creation-Date: 2026-08-05 06:37+0300\n" +"PO-Revision-Date: 2026-08-05 07:41+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -82,12 +82,12 @@ #: fe-connect.c:5788 fe-connect.c:5886 fe-connect.c:6137 fe-connect.c:6164 #: fe-connect.c:6240 fe-connect.c:6263 fe-connect.c:6287 fe-connect.c:6322 #: fe-connect.c:6408 fe-connect.c:6416 fe-connect.c:6773 fe-connect.c:6923 -#: fe-exec.c:530 fe-exec.c:1320 fe-exec.c:3259 fe-exec.c:4330 fe-exec.c:4523 -#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:210 fe-protocol3.c:233 -#: fe-protocol3.c:256 fe-protocol3.c:273 fe-protocol3.c:294 fe-protocol3.c:370 -#: fe-protocol3.c:738 fe-protocol3.c:977 fe-protocol3.c:1801 -#: fe-protocol3.c:2201 fe-secure-common.c:110 fe-secure-gssapi.c:508 -#: fe-secure-gssapi.c:699 fe-secure-openssl.c:427 fe-secure-openssl.c:1277 +#: fe-exec.c:531 fe-exec.c:1321 fe-exec.c:3274 fe-exec.c:4324 fe-exec.c:4517 +#: 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:372 +#: fe-protocol3.c:740 fe-protocol3.c:979 fe-protocol3.c:1803 +#: fe-protocol3.c:2214 fe-secure-common.c:110 fe-secure-gssapi.c:515 +#: fe-secure-gssapi.c:706 fe-secure-openssl.c:458 fe-secure-openssl.c:1309 #, c-format msgid "out of memory" msgstr "нехватка памяти" @@ -360,7 +360,7 @@ msgid "connection pointer is NULL" msgstr "нулевой указатель соединения" -#: fe-cancel.c:82 fe-misc.c:598 +#: fe-cancel.c:82 fe-misc.c:606 #, c-format msgid "connection not open" msgstr "соединение не открыто" @@ -858,8 +858,8 @@ msgid "connection pointer is NULL\n" msgstr "нулевой указатель соединения\n" -#: fe-connect.c:7185 fe-exec.c:718 fe-exec.c:980 fe-exec.c:3464 -#: fe-protocol3.c:992 fe-protocol3.c:1025 +#: fe-connect.c:7185 fe-exec.c:719 fe-exec.c:981 fe-exec.c:3479 +#: fe-protocol3.c:994 fe-protocol3.c:1027 msgid "out of memory\n" msgstr "нехватка памяти\n" @@ -887,178 +887,178 @@ msgid "invalid integer value \"%s\" for connection option \"%s\"" msgstr "неверное целочисленное значение \"%s\" для параметра соединения \"%s\"" -#: fe-exec.c:469 fe-exec.c:3538 +#: fe-exec.c:470 fe-exec.c:3553 #, c-format msgid "row number %d is out of range 0..%d" msgstr "номер записи %d вне диапазона 0..%d" -#: fe-exec.c:531 fe-protocol3.c:2007 +#: fe-exec.c:532 fe-protocol3.c:2009 #, 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:1443 fe-exec.c:1512 fe-exec.c:1558 +#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 #, c-format msgid "command string is a null pointer" msgstr "указатель на командную строку нулевой" -#: fe-exec.c:1449 fe-exec.c:3008 +#: fe-exec.c:1450 fe-exec.c:3023 #, c-format msgid "%s not allowed in pipeline mode" msgstr "%s не допускается в конвейерном режиме" -#: fe-exec.c:1517 fe-exec.c:1563 fe-exec.c:1657 +#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 #, c-format msgid "number of parameters must be between 0 and %d" msgstr "число параметров должно быть от 0 до %d" -#: fe-exec.c:1553 fe-exec.c:1652 +#: fe-exec.c:1554 fe-exec.c:1653 #, c-format msgid "statement name is a null pointer" msgstr "указатель на имя оператора нулевой" -#: fe-exec.c:1694 fe-exec.c:3384 +#: fe-exec.c:1695 fe-exec.c:3399 #, c-format msgid "no connection to the server" msgstr "нет соединения с сервером" -#: fe-exec.c:1702 fe-exec.c:3392 +#: fe-exec.c:1703 fe-exec.c:3407 #, c-format msgid "another command is already in progress" msgstr "уже выполняется другая команда" -#: fe-exec.c:1732 +#: fe-exec.c:1733 #, c-format msgid "cannot queue commands during COPY" msgstr "во время COPY нельзя добавлять команды в очередь" -#: fe-exec.c:1851 +#: fe-exec.c:1852 #, c-format msgid "length must be given for binary parameter" msgstr "для двоичного параметра должна быть указана длина" -#: fe-exec.c:2210 +#: fe-exec.c:2211 #, c-format msgid "unexpected asyncStatus: %d" msgstr "неожиданный asyncStatus: %d" -#: fe-exec.c:2366 +#: fe-exec.c:2367 #, c-format msgid "" "synchronous command execution functions are not allowed in pipeline mode" msgstr "" "функции синхронного выполнения команд не допускаются в конвейерном режиме" -#: fe-exec.c:2383 +#: fe-exec.c:2384 msgid "COPY terminated by new PQexec" msgstr "операция COPY прервана вызовом PQexec" -#: fe-exec.c:2399 +#: fe-exec.c:2400 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "вызов PQexec не допускается в процессе COPY BOTH" -#: fe-exec.c:2635 +#: fe-exec.c:2636 #, c-format msgid "unrecognized message type \"%c\"" msgstr "нераспознанный тип сообщения \"%c\"" -#: fe-exec.c:2707 fe-exec.c:2761 fe-exec.c:2829 fe-protocol3.c:1938 +#: fe-exec.c:2708 fe-exec.c:2762 fe-exec.c:2830 fe-protocol3.c:1940 #, c-format msgid "no COPY in progress" msgstr "операция COPY не выполняется" -#: fe-exec.c:3015 +#: fe-exec.c:3030 #, c-format msgid "connection in wrong state" msgstr "соединение в неправильном состоянии" -#: fe-exec.c:3058 +#: fe-exec.c:3073 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "перейти в конвейерный режиме нельзя, соединение не простаивает" -#: fe-exec.c:3094 fe-exec.c:3115 +#: fe-exec.c:3109 fe-exec.c:3130 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "выйти из конвейерного режима нельзя, не собрав все результаты" -#: fe-exec.c:3098 +#: fe-exec.c:3113 #, c-format msgid "cannot exit pipeline mode while busy" msgstr "выйти из конвейерного режима в занятом состоянии нельзя" -#: fe-exec.c:3109 +#: fe-exec.c:3124 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "выйти из конвейерного режима во время COPY нельзя" -#: fe-exec.c:3308 +#: fe-exec.c:3323 #, c-format msgid "cannot send pipeline when not in pipeline mode" msgstr "отправить конвейер, не перейдя в конвейерный режим, нельзя" -#: fe-exec.c:3427 +#: fe-exec.c:3442 msgid "invalid ExecStatusType code" msgstr "неверный код ExecStatusType" -#: fe-exec.c:3454 +#: fe-exec.c:3469 msgid "PGresult is not an error result\n" msgstr "В PGresult не передан результат ошибки\n" -#: fe-exec.c:3522 fe-exec.c:3545 +#: fe-exec.c:3537 fe-exec.c:3560 #, c-format msgid "column number %d is out of range 0..%d" msgstr "номер столбца %d вне диапазона 0..%d" -#: fe-exec.c:3560 +#: fe-exec.c:3575 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "номер параметра %d вне диапазона 0..%d" -#: fe-exec.c:3871 +#: fe-exec.c:3886 #, c-format msgid "could not interpret result from server: %s" msgstr "не удалось интерпретировать ответ сервера: %s" -#: fe-exec.c:4146 fe-exec.c:4281 +#: fe-exec.c:4161 fe-exec.c:4275 #, c-format msgid "incomplete multibyte character" msgstr "неполный многобайтный символ" -#: fe-exec.c:4148 fe-exec.c:4300 +#: fe-exec.c:4163 fe-exec.c:4294 #, c-format msgid "invalid multibyte character" msgstr "неверный многобайтный символ" -#: fe-exec.c:4402 +#: fe-exec.c:4396 #, c-format msgid "escaped string size exceeds the maximum allowed (%zu)" msgstr "размер строки с экранированием превышает максимально допустимый (%zu)" -#: fe-exec.c:4579 +#: fe-exec.c:4573 #, c-format msgid "escaped bytea size exceeds the maximum allowed (%zu)" msgstr "" @@ -1110,18 +1110,18 @@ 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:776 fe-secure-openssl.c:203 fe-secure-openssl.c:309 -#: fe-secure.c:237 fe-secure.c:404 +#: fe-misc.c:818 fe-secure-openssl.c:204 fe-secure-openssl.c:340 +#: fe-secure.c:237 fe-secure.c:428 #, c-format msgid "" "server closed the connection unexpectedly\n" @@ -1132,31 +1132,37 @@ "\tСкорее всего сервер прекратил работу из-за сбоя\n" "\tдо или в процессе выполнения запроса." -#: fe-misc.c:843 +#: fe-misc.c:927 +#, c-format +msgid "drained only %zd of %zd pending bytes in transport buffer" +msgstr "" +"выбрано только %zd из %zd байт, ожидающих получения в транспортном буфере" + +#: fe-misc.c:989 msgid "connection not open\n" msgstr "соединение не открыто\n" -#: fe-misc.c:1031 +#: fe-misc.c:1177 #, c-format msgid "timeout expired" msgstr "тайм-аут" -#: fe-misc.c:1075 +#: fe-misc.c:1221 #, c-format msgid "invalid socket" msgstr "неверный сокет" -#: fe-misc.c:1097 +#: fe-misc.c:1241 #, c-format msgid "%s() failed: %s" msgstr "ошибка в %s(): %s" -#: fe-protocol3.c:188 +#: fe-protocol3.c:190 #, 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\" " @@ -1165,117 +1171,117 @@ "сервер отправил данные (сообщение \"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:468 +#: fe-protocol3.c:470 #, c-format msgid "message contents do not agree with length in message type \"%c\"" msgstr "содержимое не соответствует длине в сообщении типа \"%c\"" -#: fe-protocol3.c:486 +#: fe-protocol3.c:488 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "" "потеряна синхронизация с сервером: получено сообщение типа \"%c\", длина %d" -#: fe-protocol3.c:538 fe-protocol3.c:578 +#: fe-protocol3.c:540 fe-protocol3.c:580 msgid "insufficient data in \"T\" message" msgstr "недостаточно данных в сообщении \"T\"" -#: fe-protocol3.c:649 fe-protocol3.c:855 +#: fe-protocol3.c:651 fe-protocol3.c:857 msgid "out of memory for query result" msgstr "недостаточно памяти для результата запроса" -#: fe-protocol3.c:718 +#: fe-protocol3.c:720 msgid "insufficient data in \"t\" message" msgstr "недостаточно данных в сообщении \"t\"" -#: fe-protocol3.c:777 fe-protocol3.c:809 fe-protocol3.c:827 +#: fe-protocol3.c:779 fe-protocol3.c:811 fe-protocol3.c:829 msgid "insufficient data in \"D\" message" msgstr "недостаточно данных в сообщении \"D\"" -#: fe-protocol3.c:783 +#: fe-protocol3.c:785 msgid "unexpected field count in \"D\" message" msgstr "неверное число полей в сообщении \"D\"" -#: fe-protocol3.c:1038 +#: fe-protocol3.c:1040 msgid "no error message available\n" msgstr "нет сообщения об ошибке\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1086 fe-protocol3.c:1105 +#: fe-protocol3.c:1088 fe-protocol3.c:1107 #, c-format msgid " at character %s" msgstr " символ %s" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1120 #, c-format msgid "DETAIL: %s\n" msgstr "ПОДРОБНОСТИ: %s\n" -#: fe-protocol3.c:1121 +#: fe-protocol3.c:1123 #, c-format msgid "HINT: %s\n" msgstr "ПОДСКАЗКА: %s\n" -#: fe-protocol3.c:1124 +#: fe-protocol3.c:1126 #, c-format msgid "QUERY: %s\n" msgstr "ЗАПРОС: %s\n" -#: fe-protocol3.c:1131 +#: fe-protocol3.c:1133 #, c-format msgid "CONTEXT: %s\n" msgstr "КОНТЕКСТ: %s\n" -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1142 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "СХЕМА: %s\n" -#: fe-protocol3.c:1144 +#: fe-protocol3.c:1146 #, c-format msgid "TABLE NAME: %s\n" msgstr "ТАБЛИЦА: %s\n" -#: fe-protocol3.c:1148 +#: fe-protocol3.c:1150 #, c-format msgid "COLUMN NAME: %s\n" msgstr "СТОЛБЕЦ: %s\n" -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1154 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "ТИП ДАННЫХ: %s\n" -#: fe-protocol3.c:1156 +#: fe-protocol3.c:1158 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "ОГРАНИЧЕНИЕ: %s\n" -#: fe-protocol3.c:1168 +#: fe-protocol3.c:1170 msgid "LOCATION: " msgstr "ПОЛОЖЕНИЕ: " -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1172 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1172 +#: fe-protocol3.c:1174 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1380 +#: fe-protocol3.c:1382 #, c-format msgid "LINE %d: " msgstr "СТРОКА %d: " -#: fe-protocol3.c:1454 +#: fe-protocol3.c:1456 #, c-format msgid "" "protocol version not supported by server: client uses %u.%u, server supports " @@ -1284,7 +1290,7 @@ "сервер не поддерживает нужную версию протокола: клиент использует %u.%u, " "сервер поддерживает версии до %u.%u" -#: fe-protocol3.c:1460 +#: fe-protocol3.c:1462 #, c-format msgid "protocol extension not supported by server: %s" msgid_plural "protocol extensions not supported by server: %s" @@ -1292,22 +1298,27 @@ msgstr[1] "сервер не поддерживает эти расширения протокола: %s" msgstr[2] "сервер не поддерживает эти расширения протокола: %s" -#: fe-protocol3.c:1468 +#: fe-protocol3.c:1470 #, c-format msgid "invalid %s message" msgstr "неверное сообщение %s" -#: fe-protocol3.c:1833 +#: fe-protocol3.c:1835 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline можно вызывать только во время COPY OUT с текстом" -#: fe-protocol3.c:2207 +#: fe-protocol3.c:2166 +#, c-format +msgid "server returned too much data" +msgstr "сервер передал слишком много данных" + +#: fe-protocol3.c:2220 #, c-format msgid "protocol error: no function result" msgstr "ошибка протокола: нет результата функции" -#: fe-protocol3.c:2218 +#: fe-protocol3.c:2231 #, c-format msgid "protocol error: id=0x%x" msgstr "ошибка протокола: id=0x%x" @@ -1369,12 +1380,12 @@ 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)" @@ -1388,100 +1399,110 @@ 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:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 +#: fe-secure-openssl.c:208 fe-secure-openssl.c:344 fe-secure-openssl.c:1556 #, c-format msgid "SSL SYSCALL error: %s" msgstr "ошибка SSL SYSCALL: %s" -#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 +#: fe-secure-openssl.c:214 fe-secure-openssl.c:350 fe-secure-openssl.c:1559 #, c-format msgid "SSL SYSCALL error: EOF detected" msgstr "ошибка SSL SYSCALL: конец файла (EOF)" -#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 +#: fe-secure-openssl.c:224 fe-secure-openssl.c:360 fe-secure-openssl.c:1567 #, c-format msgid "SSL error: %s" msgstr "ошибка SSL: %s" -#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 +#: fe-secure-openssl.c:238 fe-secure-openssl.c:374 #, c-format msgid "SSL connection has been closed unexpectedly" msgstr "SSL-соединение было неожиданно закрыто" -#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 +#: fe-secure-openssl.c:243 fe-secure-openssl.c:379 fe-secure-openssl.c:1614 #, c-format msgid "unrecognized SSL error code: %d" msgstr "нераспознанный код ошибки SSL: %d" -#: fe-secure-openssl.c:390 +#: fe-secure-openssl.c:273 +#, c-format +msgid "OpenSSL reports negative bytes pending" +msgstr "OpenSSL сообщил, что число ожидающих байт отрицательное" + +#: fe-secure-openssl.c:285 +#, c-format +msgid "OpenSSL reports INT_MAX bytes pending" +msgstr "OpenSSL сообщил, что число ожидающих байт равно INT_MAX" + +#: fe-secure-openssl.c:421 #, c-format msgid "could not determine server certificate signature algorithm" msgstr "не удалось определить алгоритм подписи сертификата сервера" -#: fe-secure-openssl.c:410 +#: fe-secure-openssl.c:441 #, c-format msgid "could not find digest for NID %s" msgstr "не удалось найти алгоритм хеширования по NID %s" -#: fe-secure-openssl.c:419 +#: fe-secure-openssl.c:450 #, c-format msgid "could not generate peer certificate hash" msgstr "не удалось сгенерировать хеш сертификата сервера" -#: fe-secure-openssl.c:501 +#: fe-secure-openssl.c:533 #, c-format msgid "SSL certificate's name entry is missing" msgstr "в SSL-сертификате отсутствует запись имени" -#: fe-secure-openssl.c:535 +#: fe-secure-openssl.c:567 #, c-format msgid "SSL certificate's address entry is missing" msgstr "в SSL-сертификате отсутствует запись адреса" -#: fe-secure-openssl.c:935 +#: fe-secure-openssl.c:967 #, c-format msgid "could not create SSL context: %s" msgstr "не удалось создать контекст SSL: %s" -#: fe-secure-openssl.c:977 +#: fe-secure-openssl.c:1009 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version" msgstr "неверное значение \"%s\" для минимальной версии протокола SSL" -#: fe-secure-openssl.c:987 +#: fe-secure-openssl.c:1019 #, c-format msgid "could not set minimum SSL protocol version: %s" msgstr "не удалось задать минимальную версию протокола SSL: %s" -#: fe-secure-openssl.c:1003 +#: fe-secure-openssl.c:1035 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version" msgstr "неверное значение \"%s\" для максимальной версии протокола SSL" -#: fe-secure-openssl.c:1013 +#: fe-secure-openssl.c:1045 #, c-format msgid "could not set maximum SSL protocol version: %s" msgstr "не удалось задать максимальную версию протокола SSL: %s" -#: fe-secure-openssl.c:1051 +#: fe-secure-openssl.c:1083 #, c-format msgid "could not load system root certificate paths: %s" msgstr "не удалось выбрать системные пути для корневых сертификатов: %s" -#: fe-secure-openssl.c:1068 +#: fe-secure-openssl.c:1100 #, c-format msgid "could not read root certificate file \"%s\": %s" msgstr "не удалось прочитать файл корневых сертификатов \"%s\": %s" -#: fe-secure-openssl.c:1120 +#: fe-secure-openssl.c:1152 #, c-format msgid "" "could not get home directory to locate root certificate file\n" @@ -1494,7 +1515,7 @@ "(sslrootcert=system) или отключите проверку сертификата сервера, изменив " "sslmode." -#: fe-secure-openssl.c:1123 +#: fe-secure-openssl.c:1155 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1507,67 +1528,67 @@ "(sslrootcert=system) или отключите проверку сертификата сервера, изменив " "sslmode." -#: fe-secure-openssl.c:1158 +#: fe-secure-openssl.c:1190 #, c-format msgid "could not open certificate file \"%s\": %s" msgstr "не удалось открыть файл сертификата \"%s\": %s" -#: fe-secure-openssl.c:1176 +#: fe-secure-openssl.c:1208 #, c-format msgid "could not read certificate file \"%s\": %s" msgstr "не удалось прочитать файл сертификата \"%s\": %s" -#: fe-secure-openssl.c:1200 +#: fe-secure-openssl.c:1232 #, c-format msgid "could not establish SSL connection: %s" msgstr "не удалось установить SSL-соединение: %s" -#: fe-secure-openssl.c:1232 +#: fe-secure-openssl.c:1264 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s" msgstr "не удалось задать SNI (Server Name Indication) для SSL-подключения: %s" -#: fe-secure-openssl.c:1249 +#: fe-secure-openssl.c:1281 #, c-format msgid "could not set SSL ALPN extension: %s" msgstr "не удалось установить расширение SSL ALPN: %s" -#: fe-secure-openssl.c:1292 +#: fe-secure-openssl.c:1324 #, c-format msgid "could not load SSL engine \"%s\": %s" msgstr "не удалось загрузить модуль SSL ENGINE \"%s\": %s" -#: fe-secure-openssl.c:1303 +#: fe-secure-openssl.c:1335 #, c-format msgid "could not initialize SSL engine \"%s\": %s" msgstr "не удалось инициализировать модуль SSL ENGINE \"%s\": %s" -#: fe-secure-openssl.c:1318 +#: fe-secure-openssl.c:1350 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" msgstr "не удалось прочитать закрытый ключ SSL \"%s\" из модуля \"%s\": %s" -#: fe-secure-openssl.c:1331 +#: fe-secure-openssl.c:1363 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" msgstr "не удалось загрузить закрытый ключ SSL \"%s\" из модуля \"%s\": %s" -#: fe-secure-openssl.c:1368 +#: fe-secure-openssl.c:1400 #, c-format msgid "certificate present, but not private key file \"%s\"" msgstr "при наличии сертификата отсутствует файл закрытого ключа \"%s\"" -#: fe-secure-openssl.c:1371 +#: fe-secure-openssl.c:1403 #, c-format msgid "could not stat private key file \"%s\": %m" msgstr "не удалось получить информацию о файле закрытого ключа \"%s\": %m" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1411 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "файл закрытого ключа \"%s\" - не обычный файл" -#: fe-secure-openssl.c:1412 +#: fe-secure-openssl.c:1444 #, c-format msgid "" "private key file \"%s\" has group or world access; file must have " @@ -1579,22 +1600,22 @@ "текущему пользователю, либо u=rw,g=r (0640) или более строгие, если он " "принадлежит root" -#: fe-secure-openssl.c:1436 +#: fe-secure-openssl.c:1468 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "не удалось загрузить файл закрытого ключа \"%s\": %s" -#: fe-secure-openssl.c:1452 +#: fe-secure-openssl.c:1484 #, c-format msgid "certificate does not match private key file \"%s\": %s" msgstr "сертификат не соответствует файлу закрытого ключа \"%s\": %s" -#: fe-secure-openssl.c:1521 +#: fe-secure-openssl.c:1553 #, c-format msgid "SSL error: certificate verify failed: %s" msgstr "ошибка SSL: не удалось проверить сертификат: %s" -#: fe-secure-openssl.c:1566 +#: fe-secure-openssl.c:1598 #, c-format msgid "" "This may indicate that the server does not support any SSL protocol version " @@ -1603,34 +1624,34 @@ "Это может указывать на то, что сервер не поддерживает ни одну версию " "протокола SSL между %s и %s." -#: fe-secure-openssl.c:1598 +#: fe-secure-openssl.c:1630 #, c-format msgid "" "direct SSL connection was established without ALPN protocol negotiation " "extension" msgstr "прямое SSL-соединение было установлено без расширения ALPN" -#: fe-secure-openssl.c:1610 +#: fe-secure-openssl.c:1642 #, c-format msgid "SSL connection was established with unexpected ALPN protocol" msgstr "SSL-соединение было установлено с неподдерживаемым протоколом ALPN" -#: fe-secure-openssl.c:1627 +#: fe-secure-openssl.c:1659 #, c-format msgid "certificate could not be obtained: %s" msgstr "не удалось получить сертификат: %s" -#: fe-secure-openssl.c:1734 +#: fe-secure-openssl.c:1766 #, c-format msgid "no SSL error reported" msgstr "нет сообщения об ошибке SSL" -#: fe-secure-openssl.c:1777 +#: fe-secure-openssl.c:1809 #, c-format msgid "SSL error code %lu" msgstr "код ошибки SSL: %lu" -#: fe-secure-openssl.c:2076 +#: fe-secure-openssl.c:2108 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: значение sslpassword усечено\n" @@ -1640,7 +1661,7 @@ msgid "could not receive data from server: %s" msgstr "не удалось получить данные с сервера: %s" -#: fe-secure.c:419 +#: fe-secure.c:443 #, c-format msgid "could not send data to server: %s" msgstr "не удалось передать данные серверу: %s" diff -Nru postgresql-17-17.10/src/pl/plperl/SPI.xs postgresql-17-17.11/src/pl/plperl/SPI.xs --- postgresql-17-17.10/src/pl/plperl/SPI.xs 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plperl/SPI.xs 2026-08-10 20:54:09.000000000 +0000 @@ -75,7 +75,7 @@ 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 @@ 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 @@ 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 -Nru postgresql-17-17.10/src/pl/plperl/expected/plperl_array.out postgresql-17-17.11/src/pl/plperl/expected/plperl_array.out --- postgresql-17-17.10/src/pl/plperl/expected/plperl_array.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plperl/expected/plperl_array.out 2026-08-10 20:54:09.000000000 +0000 @@ -274,3 +274,10 @@ {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 -Nru postgresql-17-17.10/src/pl/plperl/plperl.c postgresql-17-17.11/src/pl/plperl/plperl.c --- postgresql-17-17.10/src/pl/plperl/plperl.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plperl/plperl.c 2026-08-10 20:54:09.000000000 +0000 @@ -1080,8 +1080,8 @@ 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); @@ -1148,7 +1148,7 @@ 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; @@ -1165,6 +1165,10 @@ * 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, @@ -1174,7 +1178,7 @@ { dTHX; int i; - int len = av_len(av) + 1; + int len = dims[cur_depth - 1]; for (i = 0; i < len; i++) { @@ -1500,7 +1504,7 @@ * 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, @@ -1536,7 +1540,7 @@ &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]; @@ -1786,9 +1790,9 @@ 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))) @@ -2799,7 +2803,7 @@ * 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; @@ -2807,9 +2811,9 @@ 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 */ @@ -3595,13 +3599,13 @@ "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); /************************************************************ @@ -3772,8 +3776,8 @@ ************************************************************/ if (argc > 0) { - nulls = (char *) palloc(argc); - argvalues = (Datum *) palloc(argc * sizeof(Datum)); + nulls = palloc_array(char, argc); + argvalues = palloc_array(Datum, argc); } else { @@ -3885,8 +3889,8 @@ ************************************************************/ 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 -Nru postgresql-17-17.10/src/pl/plperl/sql/plperl_array.sql postgresql-17-17.11/src/pl/plperl/sql/plperl_array.sql --- postgresql-17-17.10/src/pl/plperl/sql/plperl_array.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plperl/sql/plperl_array.sql 2026-08-10 20:54:09.000000000 +0000 @@ -206,3 +206,10 @@ $$; 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 -Nru postgresql-17-17.10/src/pl/plpgsql/src/pl_comp.c postgresql-17-17.11/src/pl/plpgsql/src/pl_comp.c --- postgresql-17-17.10/src/pl/plpgsql/src/pl_comp.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpgsql/src/pl_comp.c 2026-08-10 20:54:09.000000000 +0000 @@ -2468,6 +2468,20 @@ if (procStruct->pronargs > 0) { + /* + * Protect against overrun of fixed-size hashkey->argtypes array. + * 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))); + /* get the argument types */ memcpy(hashkey->argtypes, procStruct->proargtypes.values, procStruct->pronargs * sizeof(Oid)); diff -Nru postgresql-17-17.10/src/pl/plpgsql/src/pl_exec.c postgresql-17-17.11/src/pl/plpgsql/src/pl_exec.c --- postgresql-17-17.10/src/pl/plpgsql/src/pl_exec.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpgsql/src/pl_exec.c 2026-08-10 20:54:09.000000000 +0000 @@ -7884,13 +7884,21 @@ * 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 -Nru postgresql-17-17.10/src/pl/plpython/expected/plpython_composite.out postgresql-17-17.11/src/pl/plpython/expected/plpython_composite.out --- postgresql-17-17.10/src/pl/plpython/expected/plpython_composite.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/expected/plpython_composite.out 2026-08-10 20:54:09.000000000 +0000 @@ -606,3 +606,19 @@ 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 -Nru postgresql-17-17.10/src/pl/plpython/expected/plpython_spi.out postgresql-17-17.11/src/pl/plpython/expected/plpython_spi.out --- postgresql-17-17.10/src/pl/plpython/expected/plpython_spi.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/expected/plpython_spi.out 2026-08-10 20:54:09.000000000 +0000 @@ -464,3 +464,54 @@ (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 -Nru postgresql-17-17.10/src/pl/plpython/expected/plpython_types.out postgresql-17-17.11/src/pl/plpython/expected/plpython_types.out --- postgresql-17-17.10/src/pl/plpython/expected/plpython_types.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/expected/plpython_types.out 2026-08-10 20:54:09.000000000 +0000 @@ -796,6 +796,22 @@ 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 -Nru postgresql-17-17.10/src/pl/plpython/plpy_cursorobject.c postgresql-17-17.11/src/pl/plpython/plpy_cursorobject.c --- postgresql-17-17.10/src/pl/plpython/plpy_cursorobject.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/plpy_cursorobject.c 2026-08-10 20:54:09.000000000 +0000 @@ -231,6 +231,11 @@ 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 -Nru postgresql-17-17.10/src/pl/plpython/plpy_spi.c postgresql-17-17.11/src/pl/plpython/plpy_spi.c --- postgresql-17-17.10/src/pl/plpython/plpy_spi.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/plpy_spi.c 2026-08-10 20:54:09.000000000 +0000 @@ -90,6 +90,11 @@ 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 @@ -252,6 +257,11 @@ 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 -Nru postgresql-17-17.10/src/pl/plpython/plpy_typeio.c postgresql-17-17.11/src/pl/plpython/plpy_typeio.c --- postgresql-17-17.10/src/pl/plpython/plpy_typeio.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/plpy_typeio.c 2026-08-10 20:54:09.000000000 +0000 @@ -1206,6 +1206,10 @@ /* 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(); { @@ -1452,7 +1456,10 @@ 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 -Nru postgresql-17-17.10/src/pl/plpython/po/de.po postgresql-17-17.11/src/pl/plpython/po/de.po --- postgresql-17-17.10/src/pl/plpython/po/de.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/po/de.po 2026-08-10 20:54:09.000000000 +0000 @@ -9,7 +9,7 @@ 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" +"POT-Creation-Date: 2026-08-07 09:19+0000\n" "PO-Revision-Date: 2023-05-05 07:45+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -24,49 +24,55 @@ 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:154 #, 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:170 plpy_spi.c:209 #, c-format msgid "could not execute plan" msgstr "konnte Plan nicht ausführen" -#: plpy_cursorobject.c:174 plpy_spi.c:208 +#: plpy_cursorobject.c:173 plpy_spi.c:212 #, 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:237 plpy_spi.c:96 plpy_spi.c:263 plpy_typeio.c:1211 +#: plpy_typeio.c:1462 +#, c-format +msgid "could not get element %d from sequence" +msgstr "konnte Element %d aus Sequenz nicht ermitteln" + +#: plpy_cursorobject.c:322 #, c-format msgid "iterating a closed cursor" msgstr "Iteration mit einem geschlossenen Cursor" -#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 +#: plpy_cursorobject.c:330 plpy_cursorobject.c:396 #, 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:388 #, 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:431 plpy_spi.c:403 #, 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:483 #, 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:530 #, c-format msgid "%s" msgstr "%s" @@ -106,82 +112,82 @@ 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:246 +#, 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:392 plpy_exec.c:416 #, c-format msgid "unexpected return value from trigger procedure" msgstr "unerwarteter Rückgabewert von Triggerprozedur" -#: plpy_exec.c:370 +#: plpy_exec.c:393 #, c-format msgid "Expected None or a string." msgstr "Erwartete None oder eine Zeichenkette." -#: plpy_exec.c:383 +#: plpy_exec.c:406 #, 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:417 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Erwartete None, \"OK\", \"SKIP\" oder \"MODIFY\"." -#: plpy_exec.c:444 +#: plpy_exec.c:468 #, 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:472 #, 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:701 #, c-format msgid "while creating return value" msgstr "beim Erzeugen des Rückgabewerts" -#: plpy_exec.c:924 +#: plpy_exec.c:952 #, 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:957 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] ist kein Dictionary" -#: plpy_exec.c:954 +#: plpy_exec.c:982 #, 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:989 #, 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:994 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "Systemattribut »%s« kann nicht gesetzt werden" -#: plpy_exec.c:971 +#: plpy_exec.c:999 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kann generierte Spalte »%s« nicht setzen" -#: plpy_exec.c:1029 +#: plpy_exec.c:1057 #, c-format msgid "while modifying trigger row" msgstr "beim Ändern der Triggerzeile" -#: plpy_exec.c:1087 +#: plpy_exec.c:1115 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "Abbruch einer Subtransaktion, die nicht beendet wurde, wird erzwungen" @@ -270,27 +276,27 @@ msgid "invalid SQLSTATE code" msgstr "ungültiger SQLSTATE-Code" -#: plpy_procedure.c:225 +#: plpy_procedure.c:226 #, 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:230 #, 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:308 #, 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" @@ -305,27 +311,27 @@ 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:103 #, 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:175 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute hat eine Anfrage oder einen Plan erwartet" -#: plpy_spi.c:189 +#: plpy_spi.c:193 #, c-format 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:299 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan fehlgeschlagen: %s" -#: plpy_spi.c:339 +#: plpy_spi.c:341 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute fehlgeschlagen: %s" @@ -390,52 +396,52 @@ 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:1226 plpy_typeio.c:1241 plpy_typeio.c:1257 #, 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:1231 #, 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:1333 #, c-format msgid "malformed record literal: \"%s\"" msgstr "fehlerhafte Record-Konstante: »%s«" -#: plpy_typeio.c:1330 +#: plpy_typeio.c:1334 #, c-format msgid "Missing left parenthesis." msgstr "Linke Klammer fehlt." -#: plpy_typeio.c:1331 plpy_typeio.c:1532 +#: plpy_typeio.c:1335 plpy_typeio.c:1539 #, 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:1382 #, c-format msgid "key \"%s\" not found in mapping" msgstr "Schlüssel »%s« nicht in Mapping gefunden" -#: plpy_typeio.c:1379 +#: plpy_typeio.c:1383 #, 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:1436 #, 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:1537 #, 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:1540 #, 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." diff -Nru postgresql-17-17.10/src/pl/plpython/po/ja.po postgresql-17-17.11/src/pl/plpython/po/ja.po --- postgresql-17-17.10/src/pl/plpython/po/ja.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/po/ja.po 2026-08-10 20:54:09.000000000 +0000 @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL 15)\n" +"Project-Id-Version: plpython (PostgreSQL 17)\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 09:58+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,480 +18,447 @@ "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: plpy_cursorobject.c:78 +#: plpy_cursorobject.c:72 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor は問い合わせもしくは実行計画を期待していました" -#: plpy_cursorobject.c:161 +#: plpy_cursorobject.c:154 #, 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:170 plpy_spi.c:209 #, c-format msgid "could not execute plan" msgstr "実行計画を実行できませんでした" -#: plpy_cursorobject.c:180 plpy_spi.c:214 +#: plpy_cursorobject.c:173 plpy_spi.c:212 #, 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:237 plpy_spi.c:96 plpy_spi.c:263 plpy_typeio.c:1211 +#: plpy_typeio.c:1462 +#, c-format +msgid "could not get element %d from sequence" +msgstr "シーケンスから要素 %d を取得できませんでした" + +#: plpy_cursorobject.c:322 #, c-format msgid "iterating a closed cursor" msgstr "反復利用しようとしているカーソルは、すでにクローズされています" -#: plpy_cursorobject.c:337 plpy_cursorobject.c:403 +#: plpy_cursorobject.c:330 plpy_cursorobject.c:396 #, c-format msgid "iterating a cursor in an aborted subtransaction" -msgstr "" -"中断されたサブトランザクションの中でカーソルを反復利用しようとしています" +msgstr "中断されたサブトランザクションの中でカーソルを反復利用しようとしています" -#: plpy_cursorobject.c:395 +#: plpy_cursorobject.c:388 #, c-format msgid "fetch from a closed cursor" msgstr "クローズされたカーソルからのフェッチ" -#: plpy_cursorobject.c:438 plpy_spi.c:409 +#: plpy_cursorobject.c:431 plpy_spi.c:403 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "問い合わせの結果に含まれる行数が、Pythonのリストに対して多すぎます" -#: plpy_cursorobject.c:490 +#: plpy_cursorobject.c:483 #, 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:530 #, c-format msgid "%s" msgstr "%s" -#: plpy_exec.c:143 +#: plpy_exec.c:139 #, c-format msgid "unsupported set function return mode" msgstr "非サポートの集合関数リターンモードです。" -#: plpy_exec.c:144 +#: plpy_exec.c:140 #, 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:153 #, c-format msgid "returned object cannot be iterated" msgstr "返されたオブジェクトは反復利用できません" -#: plpy_exec.c:158 +#: plpy_exec.c:154 #, 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:168 #, c-format msgid "error fetching next item from iterator" msgstr "反復子から次の項目を取り出せませんでした" -#: plpy_exec.c:215 +#: plpy_exec.c:211 #, c-format msgid "PL/Python procedure did not return None" msgstr "PL/Python プロシージャが None を返しませんでした" -#: plpy_exec.c:219 +#: plpy_exec.c:215 #, 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:246 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されました" + +#: plpy_exec.c:392 plpy_exec.c:416 #, c-format msgid "unexpected return value from trigger procedure" msgstr "トリガプロシージャから期待しない戻り値が返されました" -#: plpy_exec.c:376 +#: plpy_exec.c:393 #, c-format msgid "Expected None or a string." msgstr "None もしくは文字列を期待していました。" -#: plpy_exec.c:391 +#: plpy_exec.c:406 #, 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:417 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "None, \"OK\", \"SKIP\", \"MODIFY\" のいずれかを期待していました。" -#: plpy_exec.c:452 +#: plpy_exec.c:468 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "引数を設定する際に、PyList_SetItem() に失敗しました" -#: plpy_exec.c:456 +#: plpy_exec.c:472 #, 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:701 #, c-format msgid "while creating return value" msgstr "戻り値を生成する際に" -#: plpy_exec.c:919 +#: plpy_exec.c:952 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] は削除されました。行を変更できません。" -#: plpy_exec.c:924 +#: plpy_exec.c:957 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] は辞書ではありません" -#: plpy_exec.c:951 +#: plpy_exec.c:982 #, 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:989 #, 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:994 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "システム属性\"%s\"は設定できません" -#: plpy_exec.c:968 +#: plpy_exec.c:999 #, c-format -#| msgid "cannot alter inherited column \"%s\"" msgid "cannot set generated column \"%s\"" msgstr "生成列\"%s\"は設定できません" -#: plpy_exec.c:1026 +#: plpy_exec.c:1057 #, c-format msgid "while modifying trigger row" msgstr "トリガ行を変更する際に" -#: plpy_exec.c:1087 +#: plpy_exec.c:1115 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "終了していないサブトランザクションを強制的にアボートしています" -#: plpy_main.c:125 +#: plpy_main.c:109 #, c-format msgid "multiple Python libraries are present in session" msgstr "セッションに複数の Python ライブラリが存在します" -#: plpy_main.c:126 +#: plpy_main.c:110 #, 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:122 #, c-format msgid "untrapped error in initialization" msgstr "初期化中に捕捉できないエラーがありました" -#: plpy_main.c:165 +#: plpy_main.c:145 #, c-format msgid "could not import \"__main__\" module" msgstr "\"__main__\" モジュールをインポートできませんでした" -#: plpy_main.c:174 +#: plpy_main.c:154 #, c-format msgid "could not initialize globals" msgstr "グローバル変数(globals)を初期化できませんでした" -#: plpy_main.c:399 +#: plpy_main.c:352 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "PL/Pythonプロシージャ\"%s\"" -#: plpy_main.c:402 +#: plpy_main.c:355 #, c-format msgid "PL/Python function \"%s\"" msgstr "PL/Python関数\"%s\"" -#: plpy_main.c:410 +#: plpy_main.c:363 #, c-format msgid "PL/Python anonymous code block" msgstr "PL/Pythonの無名コードブロック" -#: plpy_plpymodule.c:186 plpy_plpymodule.c:189 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "\"plpy\"モジュールをインポートできませんでした" -#: plpy_plpymodule.c:204 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "spiexceptionsモジュールを生成できませんでした" -#: plpy_plpymodule.c:212 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "spiexceptionsモジュールを追加できませんでした" -#: plpy_plpymodule.c:280 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "SPI例外を生成できませんでした" -#: plpy_plpymodule.c:448 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "plpy.elogで引数を展開できませんでした" -#: plpy_plpymodule.c:457 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "plpy.elogでエラーメッセージをパースできませんでした" -#: plpy_plpymodule.c:474 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "名前と位置で 'message' 引数が渡されました" -#: plpy_plpymodule.c:501 +#: plpy_plpymodule.c:478 #, 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:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "無効なSQLSTATEコードです" -#: plpy_procedure.c:230 +#: plpy_procedure.c:226 #, c-format msgid "trigger functions can only be called as triggers" msgstr "トリガー関数はトリガーとしてのみ呼び出せます" -#: plpy_procedure.c:234 +#: plpy_procedure.c:230 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "PL/Python関数は%s型を返せません" -#: plpy_procedure.c:312 +#: plpy_procedure.c:308 #, 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:117 plpy_resultobject.c:143 plpy_resultobject.c:169 #, c-format msgid "command did not produce a result set" msgstr "コマンドは結果セットを生成しませんでした" -#: plpy_spi.c:60 +#: plpy_spi.c:56 #, c-format msgid "second argument of plpy.prepare must be a sequence" msgstr "plpy.prepareの第二引数はシーケンスでなければなりません" -#: plpy_spi.c:104 +#: plpy_spi.c:103 #, 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:175 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute は問い合わせもしくは実行計画を期待していました" -#: plpy_spi.c:195 +#: plpy_spi.c:193 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute は第二引数としてシーケンスを取ります" -#: plpy_spi.c:305 +#: plpy_spi.c:299 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan が失敗しました: %s" -#: plpy_spi.c:347 +#: plpy_spi.c:341 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute が失敗しました: %s" -#: plpy_subxactobject.c:97 +#: plpy_subxactobject.c:92 #, c-format msgid "this subtransaction has already been entered" msgstr "すでにこのサブトランザクションの中に入っています" -#: plpy_subxactobject.c:103 plpy_subxactobject.c:161 +#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 #, c-format msgid "this subtransaction has already been exited" msgstr "このサブトランザクションからすでに抜けています" -#: plpy_subxactobject.c:155 +#: plpy_subxactobject.c:150 #, c-format msgid "this subtransaction has not been entered" msgstr "このサブトランザクションには入っていません" -#: plpy_subxactobject.c:167 +#: plpy_subxactobject.c:162 #, 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への変換に失敗しました" -#: plpy_typeio.c:915 +#: plpy_typeio.c:912 #, c-format msgid "could not create bytes representation of Python object" msgstr "Pythonオブジェクトのバイト表現を生成できませんでした" -#: plpy_typeio.c:1063 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "Pythonオブジェクトの文字列表現を生成できませんでした" -#: plpy_typeio.c:1074 +#: plpy_typeio.c:1060 #, 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:1157 #, 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:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "関数の戻り値について、シーケンスの長さを決定できませんでした" -#: plpy_typeio.c:1190 plpy_typeio.c:1194 -#, c-format -msgid "array size exceeds the maximum allowed" -msgstr "配列のサイズが制限値を超えています" - -#: plpy_typeio.c:1220 +#: plpy_typeio.c:1226 plpy_typeio.c:1241 plpy_typeio.c:1257 #, 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でした" +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "多次元配列の配列式の次数があっていなければなりません" -#: plpy_typeio.c:1268 +#: plpy_typeio.c:1231 #, 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:1333 #, c-format msgid "malformed record literal: \"%s\"" msgstr "不正な形式のレコードリテラル: \"%s\"" -#: plpy_typeio.c:1348 +#: plpy_typeio.c:1334 #, c-format msgid "Missing left parenthesis." msgstr "左括弧がありません。" -#: plpy_typeio.c:1349 plpy_typeio.c:1550 +#: plpy_typeio.c:1335 plpy_typeio.c:1539 #, 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:1382 #, c-format msgid "key \"%s\" not found in mapping" msgstr "マッピング上にキー\"%s\"が見つかりません" -#: plpy_typeio.c:1397 +#: plpy_typeio.c:1383 #, 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:1436 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "返されたシーケンスの長さが行のカラム数とマッチしませんでした" -#: plpy_typeio.c:1548 +#: plpy_typeio.c:1537 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "属性\"%s\"がPythonオブジェクト中に存在しません" -#: plpy_typeio.c:1551 +#: plpy_typeio.c:1540 #, 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:31 #, c-format msgid "could not convert Python Unicode object to bytes" msgstr "PythonのUnicodeオブジェクトをバイト列に変換できませんでした" -#: plpy_util.c:41 +#: plpy_util.c:37 #, 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 -Nru postgresql-17-17.10/src/pl/plpython/po/ru.po postgresql-17-17.11/src/pl/plpython/po/ru.po --- postgresql-17-17.10/src/pl/plpython/po/ru.po 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/po/ru.po 2026-08-10 20:54:09.000000000 +0000 @@ -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-02 11:37+0300\n" -"PO-Revision-Date: 2019-08-29 15:42+0300\n" +"POT-Creation-Date: 2026-08-05 06:37+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 @@ msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor принимает в качестве второго аргумента последовательность" -#: plpy_cursorobject.c:170 plpy_spi.c:204 +#: plpy_cursorobject.c:170 plpy_spi.c:209 #, c-format msgid "could not execute plan" msgstr "нельзя выполнить план" -#: plpy_cursorobject.c:173 plpy_spi.c:207 +#: plpy_cursorobject.c:173 plpy_spi.c:212 #, 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[1] "Ожидалась последовательность из %d аргументов, получено %d: %s" msgstr[2] "Ожидалась последовательность из %d аргументов, получено %d: %s" -#: plpy_cursorobject.c:317 +#: plpy_cursorobject.c:237 plpy_spi.c:96 plpy_spi.c:263 plpy_typeio.c:1211 +#: plpy_typeio.c:1462 +#, c-format +msgid "could not get element %d from sequence" +msgstr "не удалось получить элемент %d из последовательности" + +#: plpy_cursorobject.c:322 #, c-format msgid "iterating a closed cursor" msgstr "перемещение закрытого курсора" -#: plpy_cursorobject.c:325 plpy_cursorobject.c:391 +#: plpy_cursorobject.c:330 plpy_cursorobject.c:396 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "перемещение курсора в прерванной подтранзакции" -#: plpy_cursorobject.c:383 +#: plpy_cursorobject.c:388 #, c-format msgid "fetch from a closed cursor" msgstr "выборка из закрытого курсора" -#: plpy_cursorobject.c:426 plpy_spi.c:393 +#: plpy_cursorobject.c:431 plpy_spi.c:403 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "" "результат запроса содержит слишком много строк для передачи в списке Python" -#: plpy_cursorobject.c:478 +#: plpy_cursorobject.c:483 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "закрытие курсора в прерванной подтранзакции" @@ -319,27 +325,27 @@ msgid "second argument of plpy.prepare must be a sequence" msgstr "вторым аргументом plpy.prepare должна быть последовательность" -#: plpy_spi.c:98 +#: plpy_spi.c:103 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: имя типа с порядковым номером %d не является строкой" -#: plpy_spi.c:170 +#: plpy_spi.c:175 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute ожидает запрос или план" -#: plpy_spi.c:188 +#: plpy_spi.c:193 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute принимает в качестве второго аргумента последовательность" -#: plpy_spi.c:289 +#: plpy_spi.c:299 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "ошибка в SPI_execute_plan: %s" -#: plpy_spi.c:331 +#: plpy_spi.c:341 #, c-format msgid "SPI_execute failed: %s" msgstr "ошибка в SPI_execute: %s" @@ -413,7 +419,7 @@ "не удалось определить длину последовательности в возвращаемом функцией " "значении" -#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 +#: plpy_typeio.c:1226 plpy_typeio.c:1241 plpy_typeio.c:1257 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -421,22 +427,22 @@ "для многомерных массивов должны задаваться выражения с соответствующими " "размерностями" -#: plpy_typeio.c:1227 +#: plpy_typeio.c:1231 #, c-format msgid "number of array dimensions exceeds the maximum allowed (%d)" msgstr "число размерностей массива превышает предел (%d)" -#: plpy_typeio.c:1329 +#: plpy_typeio.c:1333 #, c-format msgid "malformed record literal: \"%s\"" msgstr "ошибка в литерале записи: \"%s\"" -#: plpy_typeio.c:1330 +#: plpy_typeio.c:1334 #, c-format msgid "Missing left parenthesis." msgstr "Отсутствует левая скобка." -#: plpy_typeio.c:1331 plpy_typeio.c:1532 +#: plpy_typeio.c:1335 plpy_typeio.c:1539 #, c-format msgid "" "To return a composite type in an array, return the composite type as a " @@ -445,12 +451,12 @@ "Чтобы возвратить составной тип в массиве, нужно возвратить составное " "значение в виде кортежа Python, например: \"[('foo',)]\"." -#: plpy_typeio.c:1378 +#: plpy_typeio.c:1382 #, c-format msgid "key \"%s\" not found in mapping" msgstr "ключ \"%s\" не найден в сопоставлении" -#: plpy_typeio.c:1379 +#: plpy_typeio.c:1383 #, c-format msgid "" "To return null in a column, add the value None to the mapping with the key " @@ -459,17 +465,17 @@ "Чтобы присвоить столбцу NULL, добавьте в сопоставление значение None с " "ключом-именем столбца." -#: plpy_typeio.c:1432 +#: plpy_typeio.c:1436 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "длина возвращённой последовательности не равна числу столбцов в строке" -#: plpy_typeio.c:1530 +#: plpy_typeio.c:1537 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "в объекте Python не существует атрибут \"%s\"" -#: plpy_typeio.c:1533 +#: plpy_typeio.c:1540 #, c-format msgid "" "To return null in a column, let the returned object have an attribute named " diff -Nru postgresql-17-17.10/src/pl/plpython/sql/plpython_composite.sql postgresql-17-17.11/src/pl/plpython/sql/plpython_composite.sql --- postgresql-17-17.10/src/pl/plpython/sql/plpython_composite.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/sql/plpython_composite.sql 2026-08-10 20:54:09.000000000 +0000 @@ -233,3 +233,15 @@ 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 -Nru postgresql-17-17.10/src/pl/plpython/sql/plpython_spi.sql postgresql-17-17.11/src/pl/plpython/sql/plpython_spi.sql --- postgresql-17-17.10/src/pl/plpython/sql/plpython_spi.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/sql/plpython_spi.sql 2026-08-10 20:54:09.000000000 +0000 @@ -320,3 +320,42 @@ 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 -Nru postgresql-17-17.10/src/pl/plpython/sql/plpython_types.sql postgresql-17-17.11/src/pl/plpython/sql/plpython_types.sql --- postgresql-17-17.10/src/pl/plpython/sql/plpython_types.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/plpython/sql/plpython_types.sql 2026-08-10 20:54:09.000000000 +0000 @@ -417,6 +417,19 @@ 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 -Nru postgresql-17-17.10/src/pl/tcl/pltcl.c postgresql-17-17.11/src/pl/tcl/pltcl.c --- postgresql-17-17.10/src/pl/tcl/pltcl.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/pl/tcl/pltcl.c 2026-08-10 20:54:09.000000000 +0000 @@ -1410,6 +1410,7 @@ volatile MemoryContext proc_cxt = NULL; Tcl_DString proc_internal_def; 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)); @@ -1457,16 +1458,16 @@ ************************************************************/ Tcl_DStringInit(&proc_internal_def); Tcl_DStringInit(&proc_internal_body); + Tcl_DStringInit(&proc_internal_args); PG_TRY(); { bool is_trigger = OidIsValid(tgreloid); char internal_proname[128]; 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]; Tcl_Interp *interp; int i; int tcl_rc; @@ -1499,7 +1500,7 @@ * 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(NameStr(procStruct->proname)); MemoryContextSetIdentifier(proc_cxt, prodesc->user_proname); prodesc->internal_proname = pstrdup(internal_proname); @@ -1508,8 +1509,8 @@ 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 */ @@ -1576,7 +1577,6 @@ ************************************************************/ if (!is_trigger && !is_event_trigger) { - proc_internal_args[0] = '\0'; for (i = 0; i < prodesc->nargs; i++) { Oid argtype = procStruct->proargtypes.values[i]; @@ -1609,8 +1609,8 @@ } 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); } @@ -1618,13 +1618,14 @@ 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); } /************************************************************ @@ -1637,7 +1638,8 @@ ************************************************************/ 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 @@ -1717,6 +1719,7 @@ MemoryContextDelete(proc_cxt); Tcl_DStringFree(&proc_internal_def); Tcl_DStringFree(&proc_internal_body); + Tcl_DStringFree(&proc_internal_args); PG_RE_THROW(); } PG_END_TRY(); @@ -1745,6 +1748,7 @@ Tcl_DStringFree(&proc_internal_def); Tcl_DStringFree(&proc_internal_body); + Tcl_DStringFree(&proc_internal_args); ReleaseSysCache(procTup); @@ -2028,7 +2032,7 @@ * 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; /************************************************************ @@ -2584,12 +2588,12 @@ "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); /************************************************************ @@ -2832,7 +2836,7 @@ * 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++) { @@ -3203,7 +3207,7 @@ attinmeta = NULL; } - values = (char **) palloc0(tupdesc->natts * sizeof(char *)); + values = palloc0_array(char *, tupdesc->natts); if (kvObjc % 2 != 0) ereport(ERROR, diff -Nru postgresql-17-17.10/src/port/pgmkdirp.c postgresql-17-17.11/src/port/pgmkdirp.c --- postgresql-17-17.10/src/port/pgmkdirp.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/port/pgmkdirp.c 2026-08-10 20:54:09.000000000 +0000 @@ -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 @@ if (p[0] == '/' && p[1] == '/') { /* network drive */ - p = strstr(p + 2, "/"); + p = strchr(p + 2, '/'); if (p == NULL) { errno = EINVAL; @@ -119,24 +118,46 @@ 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 -Nru postgresql-17-17.10/src/test/isolation/expected/ddl-dependency-locking.out postgresql-17-17.11/src/test/isolation/expected/ddl-dependency-locking.out --- postgresql-17-17.10/src/test/isolation/expected/ddl-dependency-locking.out 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/isolation/expected/ddl-dependency-locking.out 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/isolation/expected/drop-owned-grant.out postgresql-17-17.11/src/test/isolation/expected/drop-owned-grant.out --- postgresql-17-17.10/src/test/isolation/expected/drop-owned-grant.out 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/isolation/expected/drop-owned-grant.out 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/isolation/expected/pub-concurrent-drop.out postgresql-17-17.11/src/test/isolation/expected/pub-concurrent-drop.out --- postgresql-17-17.10/src/test/isolation/expected/pub-concurrent-drop.out 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/isolation/expected/pub-concurrent-drop.out 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/isolation/isolation_schedule postgresql-17-17.11/src/test/isolation/isolation_schedule --- postgresql-17-17.10/src/test/isolation/isolation_schedule 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/isolation/isolation_schedule 2026-08-10 20:54:09.000000000 +0000 @@ -116,3 +116,6 @@ test: serializable-parallel-3 test: matview-write-skew test: lock-nowait +test: ddl-dependency-locking +test: pub-concurrent-drop +test: drop-owned-grant diff -Nru postgresql-17-17.10/src/test/isolation/specs/ddl-dependency-locking.spec postgresql-17-17.11/src/test/isolation/specs/ddl-dependency-locking.spec --- postgresql-17-17.10/src/test/isolation/specs/ddl-dependency-locking.spec 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/isolation/specs/ddl-dependency-locking.spec 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/isolation/specs/drop-owned-grant.spec postgresql-17-17.11/src/test/isolation/specs/drop-owned-grant.spec --- postgresql-17-17.10/src/test/isolation/specs/drop-owned-grant.spec 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/isolation/specs/drop-owned-grant.spec 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/isolation/specs/pub-concurrent-drop.spec postgresql-17-17.11/src/test/isolation/specs/pub-concurrent-drop.spec --- postgresql-17-17.10/src/test/isolation/specs/pub-concurrent-drop.spec 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/isolation/specs/pub-concurrent-drop.spec 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/modules/injection_points/Makefile postgresql-17-17.11/src/test/modules/injection_points/Makefile --- postgresql-17-17.10/src/test/modules/injection_points/Makefile 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/injection_points/Makefile 2026-08-10 20:54:09.000000000 +0000 @@ -13,7 +13,9 @@ REGRESS_OPTS = --dlpath=$(top_builddir)/src/test/regress ISOLATION = inplace \ + reindex_concurrently_deferred \ syscache-update-pruned \ + wait_cleanup \ heap_lock_update # The injection points are cluster-wide, so disable installcheck diff -Nru postgresql-17-17.10/src/test/modules/injection_points/expected/reindex_concurrently_deferred.out postgresql-17-17.11/src/test/modules/injection_points/expected/reindex_concurrently_deferred.out --- postgresql-17-17.10/src/test/modules/injection_points/expected/reindex_concurrently_deferred.out 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/injection_points/expected/reindex_concurrently_deferred.out 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/modules/injection_points/expected/wait_cleanup.out postgresql-17-17.11/src/test/modules/injection_points/expected/wait_cleanup.out --- postgresql-17-17.10/src/test/modules/injection_points/expected/wait_cleanup.out 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/injection_points/expected/wait_cleanup.out 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/modules/injection_points/injection_points.c postgresql-17-17.11/src/test/modules/injection_points/injection_points.c --- postgresql-17-17.10/src/test/modules/injection_points/injection_points.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/injection_points/injection_points.c 2026-08-10 20:54:09.000000000 +0000 @@ -18,6 +18,7 @@ #include "postgres.h" #include "fmgr.h" +#include "injection_points.h" #include "miscadmin.h" #include "nodes/pg_list.h" #include "nodes/value.h" @@ -38,30 +39,6 @@ #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. */ @@ -196,6 +173,19 @@ 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) @@ -240,24 +230,26 @@ /* And sleep.. */ ConditionVariablePrepareToSleep(&inj_state->wait_point); - for (;;) + PG_ENSURE_ERROR_CLEANUP(injection_wait_cleanup, Int32GetDatum(index)); { - uint32 new_wait_counts; - - SpinLockAcquire(&inj_state->lock); - new_wait_counts = inj_state->wait_counts[index]; - SpinLockRelease(&inj_state->lock); + for (;;) + { + uint32 new_wait_counts; - if (old_wait_counts != new_wait_counts) - break; - ConditionVariableSleep(&inj_state->wait_point, injection_wait_event); + 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); + } + 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 -Nru postgresql-17-17.10/src/test/modules/injection_points/injection_points.h postgresql-17-17.11/src/test/modules/injection_points/injection_points.h --- postgresql-17-17.10/src/test/modules/injection_points/injection_points.h 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/injection_points/injection_points.h 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/modules/injection_points/meson.build postgresql-17-17.11/src/test/modules/injection_points/meson.build --- postgresql-17-17.10/src/test/modules/injection_points/meson.build 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/injection_points/meson.build 2026-08-10 20:54:09.000000000 +0000 @@ -43,7 +43,9 @@ 'isolation': { 'specs': [ 'inplace', + 'reindex_concurrently_deferred', 'syscache-update-pruned', + 'wait_cleanup', 'heap_lock_update', ], 'runningcheck': false, # see syscache-update-pruned diff -Nru postgresql-17-17.10/src/test/modules/injection_points/specs/reindex_concurrently_deferred.spec postgresql-17-17.11/src/test/modules/injection_points/specs/reindex_concurrently_deferred.spec --- postgresql-17-17.10/src/test/modules/injection_points/specs/reindex_concurrently_deferred.spec 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/injection_points/specs/reindex_concurrently_deferred.spec 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/modules/injection_points/specs/wait_cleanup.spec postgresql-17-17.11/src/test/modules/injection_points/specs/wait_cleanup.spec --- postgresql-17-17.10/src/test/modules/injection_points/specs/wait_cleanup.spec 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/injection_points/specs/wait_cleanup.spec 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/modules/test_misc/meson.build postgresql-17-17.11/src/test/modules/test_misc/meson.build --- postgresql-17-17.10/src/test/modules/test_misc/meson.build 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/test_misc/meson.build 2026-08-10 20:54:09.000000000 +0000 @@ -16,6 +16,7 @@ 't/005_timeouts.pl', 't/007_catcache_inval.pl', 't/008_replslot_single_user.pl', + 't/013_temp_obj_multisession.pl', ], }, } diff -Nru postgresql-17-17.10/src/test/modules/test_misc/t/013_temp_obj_multisession.pl postgresql-17-17.11/src/test/modules/test_misc/t/013_temp_obj_multisession.pl --- postgresql-17-17.10/src/test/modules/test_misc/t/013_temp_obj_multisession.pl 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/modules/test_misc/t/013_temp_obj_multisession.pl 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm postgresql-17-17.11/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm --- postgresql-17-17.10/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm 2026-08-10 20:54:09.000000000 +0000 @@ -157,6 +157,14 @@ '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 -Nru postgresql-17-17.10/src/test/perl/PostgreSQL/Test/Cluster.pm postgresql-17-17.11/src/test/perl/PostgreSQL/Test/Cluster.pm --- postgresql-17-17.10/src/test/perl/PostgreSQL/Test/Cluster.pm 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/perl/PostgreSQL/Test/Cluster.pm 2026-08-10 20:54:09.000000000 +0000 @@ -104,6 +104,7 @@ use File::Spec; use File::stat qw(stat); use File::Temp (); +use IO::Socket::INET; use IPC::Run; use PostgreSQL::Version; use PostgreSQL::Test::RecursiveCopy; diff -Nru postgresql-17-17.10/src/test/recovery/meson.build postgresql-17-17.11/src/test/recovery/meson.build --- postgresql-17-17.10/src/test/recovery/meson.build 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/recovery/meson.build 2026-08-10 20:54:09.000000000 +0000 @@ -55,7 +55,10 @@ '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 -Nru postgresql-17-17.10/src/test/recovery/t/004_timeline_switch.pl postgresql-17-17.11/src/test/recovery/t/004_timeline_switch.pl --- postgresql-17-17.10/src/test/recovery/t/004_timeline_switch.pl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/recovery/t/004_timeline_switch.pl 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/recovery/t/053_standby_login_event_trigger.pl postgresql-17-17.11/src/test/recovery/t/053_standby_login_event_trigger.pl --- postgresql-17-17.10/src/test/recovery/t/053_standby_login_event_trigger.pl 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/recovery/t/053_standby_login_event_trigger.pl 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/recovery/t/054_unlogged_sequence_promotion.pl postgresql-17-17.11/src/test/recovery/t/054_unlogged_sequence_promotion.pl --- postgresql-17-17.10/src/test/recovery/t/054_unlogged_sequence_promotion.pl 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/recovery/t/054_unlogged_sequence_promotion.pl 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/recovery/t/055_cascade_reconnect.pl postgresql-17-17.11/src/test/recovery/t/055_cascade_reconnect.pl --- postgresql-17-17.10/src/test/recovery/t/055_cascade_reconnect.pl 1970-01-01 00:00:00.000000000 +0000 +++ postgresql-17-17.11/src/test/recovery/t/055_cascade_reconnect.pl 2026-08-10 20:54:09.000000000 +0000 @@ -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 -Nru postgresql-17-17.10/src/test/regress/expected/alter_table.out postgresql-17-17.11/src/test/regress/expected/alter_table.out --- postgresql-17-17.10/src/test/regress/expected/alter_table.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/alter_table.out 2026-08-10 20:54:09.000000000 +0000 @@ -2866,11 +2866,12 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/collate.linux.utf8.out postgresql-17-17.11/src/test/regress/expected/collate.linux.utf8.out --- postgresql-17-17.10/src/test/regress/expected/collate.linux.utf8.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/collate.linux.utf8.out 2026-08-10 20:54:09.000000000 +0000 @@ -477,6 +477,24 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/compression_pglz.out postgresql-17-17.11/src/test/regress/expected/compression_pglz.out --- postgresql-17-17.10/src/test/regress/expected/compression_pglz.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/compression_pglz.out 2026-08-10 20:54:09.000000000 +0000 @@ -60,6 +60,18 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/copy.out postgresql-17-17.11/src/test/regress/expected/copy.out --- postgresql-17-17.10/src/test/regress/expected/copy.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/copy.out 2026-08-10 20:54:09.000000000 +0000 @@ -249,13 +249,9 @@ -- 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 -Nru postgresql-17-17.10/src/test/regress/expected/encoding.out postgresql-17-17.11/src/test/regress/expected/encoding.out --- postgresql-17-17.10/src/test/regress/expected/encoding.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/encoding.out 2026-08-10 20:54:09.000000000 +0000 @@ -416,6 +416,25 @@ 🚀 (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 -Nru postgresql-17-17.10/src/test/regress/expected/generated.out postgresql-17-17.11/src/test/regress/expected/generated.out --- postgresql-17-17.10/src/test/regress/expected/generated.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/generated.out 2026-08-10 20:54:09.000000000 +0000 @@ -1211,6 +1211,56 @@ 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 "public.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 "public.gtest_leaf" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | +Partition of: gtest_node FOR VALUES IN (1) + + Partitioned table "public.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 "public.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 -Nru postgresql-17-17.10/src/test/regress/expected/gist.out postgresql-17-17.11/src/test/regress/expected/gist.out --- postgresql-17-17.10/src/test/regress/expected/gist.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/gist.out 2026-08-10 20:54:09.000000000 +0000 @@ -387,6 +387,42 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/hash_part.out postgresql-17-17.11/src/test/regress/expected/hash_part.out --- postgresql-17-17.10/src/test/regress/expected/hash_part.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/hash_part.out 2026-08-10 20:54:09.000000000 +0000 @@ -40,6 +40,13 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/indexing.out postgresql-17-17.11/src/test/regress/expected/indexing.out --- postgresql-17-17.10/src/test/regress/expected/indexing.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/indexing.out 2026-08-10 20:54:09.000000000 +0000 @@ -1745,3 +1745,18 @@ (3 rows) drop table parted_replica_tab; +-- 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 -Nru postgresql-17-17.10/src/test/regress/expected/join.out postgresql-17-17.11/src/test/regress/expected/join.out --- postgresql-17-17.10/src/test/regress/expected/join.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/join.out 2026-08-10 20:54:09.000000000 +0000 @@ -3928,6 +3928,33 @@ 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) + -- Test proper handling of appendrel PHVs during useless-RTE removal explain (costs off) select * from diff -Nru postgresql-17-17.10/src/test/regress/expected/jsonb_jsonpath.out postgresql-17-17.11/src/test/regress/expected/jsonb_jsonpath.out --- postgresql-17-17.10/src/test/regress/expected/jsonb_jsonpath.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/jsonb_jsonpath.out 2026-08-10 20:54:09.000000000 +0000 @@ -2286,6 +2286,38 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/money.out postgresql-17-17.11/src/test/regress/expected/money.out --- postgresql-17-17.10/src/test/regress/expected/money.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/money.out 2026-08-10 20:54:09.000000000 +0000 @@ -539,6 +539,14 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/object_address.out postgresql-17-17.11/src/test/regress/expected/object_address.out --- postgresql-17-17.10/src/test/regress/expected/object_address.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/object_address.out 2026-08-10 20:54:09.000000000 +0000 @@ -43,6 +43,10 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/partition_prune.out postgresql-17-17.11/src/test/regress/expected/partition_prune.out --- postgresql-17-17.10/src/test/regress/expected/partition_prune.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/partition_prune.out 2026-08-10 20:54:09.000000000 +0000 @@ -671,6 +671,52 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/privileges.out postgresql-17-17.11/src/test/regress/expected/privileges.out --- postgresql-17-17.10/src/test/regress/expected/privileges.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/privileges.out 2026-08-10 20:54:09.000000000 +0000 @@ -1321,16 +1321,23 @@ 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); @@ -1338,6 +1345,8 @@ 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); @@ -1345,10 +1354,22 @@ 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); @@ -1357,30 +1378,57 @@ 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; @@ -1388,7 +1436,11 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/psql.out postgresql-17-17.11/src/test/regress/expected/psql.out --- postgresql-17-17.10/src/test/regress/expected/psql.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/psql.out 2026-08-10 20:54:09.000000000 +0000 @@ -2723,6 +2723,32 @@ +------------------+-------------------+ 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) @@ -4566,6 +4592,22 @@ \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} @@ -5680,6 +5722,11 @@ (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 -Nru postgresql-17-17.10/src/test/regress/expected/rangetypes.out postgresql-17-17.11/src/test/regress/expected/rangetypes.out --- postgresql-17-17.10/src/test/regress/expected/rangetypes.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/rangetypes.out 2026-08-10 20:54:09.000000000 +0000 @@ -1547,6 +1547,21 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/rules.out postgresql-17-17.11/src/test/regress/expected/rules.out --- postgresql-17-17.10/src/test/regress/expected/rules.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/rules.out 2026-08-10 20:54:09.000000000 +0000 @@ -3199,6 +3199,8 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/sqljson.out postgresql-17-17.11/src/test/regress/expected/sqljson.out --- postgresql-17-17.10/src/test/regress/expected/sqljson.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/sqljson.out 2026-08-10 20:54:09.000000000 +0000 @@ -1142,6 +1142,42 @@ 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 +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? ---------- @@ -1367,3 +1403,101 @@ (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 (?) + -> 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) +(11 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 (?), row_number() OVER (?), i + -> Sort + Output: i, (jsonb_agg(i) OVER (?)) + Sort Key: i.i + -> WindowAgg + Output: i, jsonb_agg(i) OVER (?) + -> Sort + Output: i + Sort Key: i.i DESC + -> Function Scan on pg_catalog.generate_series i + Output: i + Function Call: generate_series(1, 3) +(13 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 -Nru postgresql-17-17.10/src/test/regress/expected/sqljson_jsontable.out postgresql-17-17.11/src/test/regress/expected/sqljson_jsontable.out --- postgresql-17-17.10/src/test/regress/expected/sqljson_jsontable.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/sqljson_jsontable.out 2026-08-10 20:54:09.000000000 +0000 @@ -250,6 +250,22 @@ {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 -Nru postgresql-17-17.10/src/test/regress/expected/sqljson_queryfuncs.out postgresql-17-17.11/src/test/regress/expected/sqljson_queryfuncs.out --- postgresql-17-17.10/src/test/regress/expected/sqljson_queryfuncs.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/sqljson_queryfuncs.out 2026-08-10 20:54:09.000000000 +0000 @@ -433,6 +433,27 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/stats_ext.out postgresql-17-17.11/src/test/regress/expected/stats_ext.out --- postgresql-17-17.10/src/test/regress/expected/stats_ext.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/stats_ext.out 2026-08-10 20:54:09.000000000 +0000 @@ -55,6 +55,10 @@ 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; @@ -3459,3 +3463,28 @@ 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; diff -Nru postgresql-17-17.10/src/test/regress/expected/triggers.out postgresql-17-17.11/src/test/regress/expected/triggers.out --- postgresql-17-17.10/src/test/regress/expected/triggers.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/triggers.out 2026-08-10 20:54:09.000000000 +0000 @@ -46,12 +46,12 @@ -- (fkey3) --> fkeys2 (pkey23) -- create trigger check_fkeys_pkey_exist - before insert or update on fkeys + after insert or update on fkeys for each row execute function check_primary_key ('fkey1', 'fkey2', 'pkeys', 'pkey1', 'pkey2'); create trigger check_fkeys_pkey2_exist - before insert or update on fkeys + after insert or update on fkeys for each row execute function check_primary_key ('fkey3', 'fkeys2', 'pkey23'); -- @@ -59,7 +59,7 @@ -- (fkey21, fkey22) --> pkeys (pkey1, pkey2) -- create trigger check_fkeys2_pkey_exist - before insert or update on fkeys2 + after insert or update on fkeys2 for each row execute procedure check_primary_key ('fkey21', 'fkey22', 'pkeys', 'pkey1', 'pkey2'); @@ -74,7 +74,7 @@ -- fkeys (fkey1, fkey2) and fkeys2 (fkey21, fkey22) -- create trigger check_pkeys_fkey_cascade - before delete or update on pkeys + after delete or update on pkeys for each row execute procedure check_foreign_key (2, 'cascade', 'pkey1', 'pkey2', @@ -85,7 +85,7 @@ -- fkeys (fkey3) -- create trigger check_fkeys2_fkey_restrict - before delete or update on fkeys2 + after delete or update on fkeys2 for each row execute procedure check_foreign_key (1, 'restrict', 'pkey23', 'fkeys', 'fkey3'); insert into fkeys2 values (10, '1', 1); @@ -117,11 +117,10 @@ NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys2 are deleted update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 50 and pkey2 = '5'; NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are deleted -ERROR: "check_fkeys2_fkey_restrict": tuple is referenced in "fkeys" -CONTEXT: SQL statement "delete from fkeys2 where fkey21 = $1 and fkey22 = $2 " -update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 10 and pkey2 = '1'; -NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys are deleted NOTICE: check_pkeys_fkey_cascade: 1 tuple(s) of fkeys2 are deleted +update pkeys set pkey1 = 7, pkey2 = '70' where pkey1 = 10 and pkey2 = '1'; +ERROR: duplicate key value violates unique constraint "pkeys_i" +DETAIL: Key (pkey1, pkey2)=(7, 70) already exists. SELECT trigger_name, event_manipulation, event_object_schema, event_object_table, action_order, action_condition, action_orientation, action_timing, action_reference_old_table, action_reference_new_table @@ -130,16 +129,16 @@ ORDER BY trigger_name COLLATE "C", 2; trigger_name | event_manipulation | event_object_schema | event_object_table | action_order | action_condition | action_orientation | action_timing | action_reference_old_table | action_reference_new_table ----------------------------+--------------------+---------------------+--------------------+--------------+------------------+--------------------+---------------+----------------------------+---------------------------- - check_fkeys2_fkey_restrict | DELETE | public | fkeys2 | 1 | | ROW | BEFORE | | - check_fkeys2_fkey_restrict | UPDATE | public | fkeys2 | 1 | | ROW | BEFORE | | - check_fkeys2_pkey_exist | INSERT | public | fkeys2 | 1 | | ROW | BEFORE | | - check_fkeys2_pkey_exist | UPDATE | public | fkeys2 | 2 | | ROW | BEFORE | | - check_fkeys_pkey2_exist | INSERT | public | fkeys | 1 | | ROW | BEFORE | | - check_fkeys_pkey2_exist | UPDATE | public | fkeys | 1 | | ROW | BEFORE | | - check_fkeys_pkey_exist | INSERT | public | fkeys | 2 | | ROW | BEFORE | | - check_fkeys_pkey_exist | UPDATE | public | fkeys | 2 | | ROW | BEFORE | | - check_pkeys_fkey_cascade | DELETE | public | pkeys | 1 | | ROW | BEFORE | | - check_pkeys_fkey_cascade | UPDATE | public | pkeys | 1 | | ROW | BEFORE | | + check_fkeys2_fkey_restrict | DELETE | public | fkeys2 | 1 | | ROW | AFTER | | + check_fkeys2_fkey_restrict | UPDATE | public | fkeys2 | 1 | | ROW | AFTER | | + check_fkeys2_pkey_exist | INSERT | public | fkeys2 | 1 | | ROW | AFTER | | + check_fkeys2_pkey_exist | UPDATE | public | fkeys2 | 2 | | ROW | AFTER | | + check_fkeys_pkey2_exist | INSERT | public | fkeys | 1 | | ROW | AFTER | | + check_fkeys_pkey2_exist | UPDATE | public | fkeys | 1 | | ROW | AFTER | | + check_fkeys_pkey_exist | INSERT | public | fkeys | 2 | | ROW | AFTER | | + check_fkeys_pkey_exist | UPDATE | public | fkeys | 2 | | ROW | AFTER | | + check_pkeys_fkey_cascade | DELETE | public | pkeys | 1 | | ROW | AFTER | | + check_pkeys_fkey_cascade | UPDATE | public | pkeys | 1 | | ROW | AFTER | | (10 rows) DROP TABLE pkeys; diff -Nru postgresql-17-17.10/src/test/regress/expected/unicode.out postgresql-17-17.11/src/test/regress/expected/unicode.out --- postgresql-17-17.10/src/test/regress/expected/unicode.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/unicode.out 2026-08-10 20:54:09.000000000 +0000 @@ -105,3 +105,81 @@ 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 -Nru postgresql-17-17.10/src/test/regress/expected/window.out postgresql-17-17.11/src/test/regress/expected/window.out --- postgresql-17-17.10/src/test/regress/expected/window.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/window.out 2026-08-10 20:54:09.000000000 +0000 @@ -4211,13 +4211,13 @@ (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 @@ -4227,6 +4227,40 @@ -> Seq Scan on empsalary (3 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 + Run Condition: (count(empsalary.empno) OVER (?) <= 3) + -> Seq Scan on empsalary +(3 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 + -> Seq Scan on empsalary +(4 rows) + -- Try another case with a WindowFunc with a byref return type SELECT * FROM (SELECT row_number() OVER (PARTITION BY salary) AS rn, @@ -4405,6 +4439,172 @@ -> Seq Scan on empsalary (8 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 + Run Condition: (count(*) OVER (?) <= 3) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(5 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 + Run Condition: (count(*) OVER (?) <= 3) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(5 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 + Run Condition: (count(*) OVER (?) <= 3) + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(5 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 + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 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 + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 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 + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 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 + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 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 + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 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 + -> Sort + Sort Key: empsalary.salary + -> Seq Scan on empsalary +(6 rows) + -- Test Sort node collapsing EXPLAIN (COSTS OFF) SELECT * FROM diff -Nru postgresql-17-17.10/src/test/regress/expected/xml.out postgresql-17-17.11/src/test/regress/expected/xml.out --- postgresql-17-17.10/src/test/regress/expected/xml.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/xml.out 2026-08-10 20:54:09.000000000 +0000 @@ -4,13 +4,19 @@ ); 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 @@ 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 @@ (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 @@ (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 @@ 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 @@ (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 @@ {} (1 row) +SELECT xpath('//namespace::foo', ''); + xpath +-------------------- + {http://127.0.0.1} +(1 row) + -- Round-trip non-ASCII data through xpath(). DO $$ DECLARE diff -Nru postgresql-17-17.10/src/test/regress/expected/xml_1.out postgresql-17-17.11/src/test/regress/expected/xml_1.out --- postgresql-17-17.10/src/test/regress/expected/xml_1.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/xml_1.out 2026-08-10 20:54:09.000000000 +0000 @@ -12,1484 +12,13 @@ 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", + - "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", + - "Output": ["xmldata.data"] + - }, + - { + - "Node Type": "Table Function Scan", + - "Parent Relationship": "Inner", + - "Parallel Aware": false, + - "Async Capable": false, + - "Table Function Name": "xmltable", + - "Alias": "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)" + - } + - ] + - } + - } + - ] -(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 -Nru postgresql-17-17.10/src/test/regress/expected/xml_2.out postgresql-17-17.11/src/test/regress/expected/xml_2.out --- postgresql-17-17.10/src/test/regress/expected/xml_2.out 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/expected/xml_2.out 1970-01-01 00:00:00.000000000 +0000 @@ -1,1866 +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", + - "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", + - "Output": ["xmldata.data"] + - }, + - { + - "Node Type": "Table Function Scan", + - "Parent Relationship": "Inner", + - "Parallel Aware": false, + - "Async Capable": false, + - "Table Function Name": "xmltable", + - "Alias": "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)" + - } + - ] + - } + - } + - ] -(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 -Nru postgresql-17-17.10/src/test/regress/sql/alter_table.sql postgresql-17-17.11/src/test/regress/sql/alter_table.sql --- postgresql-17-17.10/src/test/regress/sql/alter_table.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/alter_table.sql 2026-08-10 20:54:09.000000000 +0000 @@ -1149,7 +1149,9 @@ \. select * from attest; copy attest(a) from stdin; +\. copy attest("........pg.dropped.1........") from stdin; +\. copy attest(b,c) from stdin; 31 32 \. diff -Nru postgresql-17-17.10/src/test/regress/sql/collate.linux.utf8.sql postgresql-17-17.11/src/test/regress/sql/collate.linux.utf8.sql --- postgresql-17-17.10/src/test/regress/sql/collate.linux.utf8.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/collate.linux.utf8.sql 2026-08-10 20:54:09.000000000 +0000 @@ -188,6 +188,9 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/compression_pglz.sql postgresql-17-17.11/src/test/regress/sql/compression_pglz.sql --- postgresql-17-17.10/src/test/regress/sql/compression_pglz.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/compression_pglz.sql 2026-08-10 20:54:09.000000000 +0000 @@ -48,6 +48,16 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/copy.sql postgresql-17-17.11/src/test/regress/sql/copy.sql --- postgresql-17-17.10/src/test/regress/sql/copy.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/copy.sql 2026-08-10 20:54:09.000000000 +0000 @@ -209,6 +209,7 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/copy2.sql postgresql-17-17.11/src/test/regress/sql/copy2.sql --- postgresql-17-17.10/src/test/regress/sql/copy2.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/copy2.sql 2026-08-10 20:54:09.000000000 +0000 @@ -52,45 +52,74 @@ -- 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); +\. -- 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; @@ -147,14 +176,19 @@ \. 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 @@ -351,10 +385,12 @@ -- 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; @@ -380,10 +416,12 @@ -- 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 '' @@ -613,19 +651,25 @@ -- 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 -Nru postgresql-17-17.10/src/test/regress/sql/copyselect.sql postgresql-17-17.11/src/test/regress/sql/copyselect.sql --- postgresql-17-17.10/src/test/regress/sql/copyselect.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/copyselect.sql 2026-08-10 20:54:09.000000000 +0000 @@ -42,6 +42,7 @@ -- This should fail -- copy (select * from test1) from stdin; +\. -- -- This should fail -- diff -Nru postgresql-17-17.10/src/test/regress/sql/encoding.sql postgresql-17-17.11/src/test/regress/sql/encoding.sql --- postgresql-17-17.10/src/test/regress/sql/encoding.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/encoding.sql 2026-08-10 20:54:09.000000000 +0000 @@ -228,6 +228,18 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/generated.sql postgresql-17-17.11/src/test/regress/sql/generated.sql --- postgresql-17-17.10/src/test/regress/sql/generated.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/generated.sql 2026-08-10 20:54:09.000000000 +0000 @@ -198,10 +198,13 @@ \. 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; @@ -218,6 +221,7 @@ \. COPY gtest3 (a, b) FROM stdin; +\. SELECT * FROM gtest3 ORDER BY a; @@ -556,6 +560,21 @@ \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 -Nru postgresql-17-17.10/src/test/regress/sql/gist.sql postgresql-17-17.11/src/test/regress/sql/gist.sql --- postgresql-17-17.10/src/test/regress/sql/gist.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/gist.sql 2026-08-10 20:54:09.000000000 +0000 @@ -169,6 +169,35 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/hash_part.sql postgresql-17-17.11/src/test/regress/sql/hash_part.sql --- postgresql-17-17.10/src/test/regress/sql/hash_part.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/hash_part.sql 2026-08-10 20:54:09.000000000 +0000 @@ -35,6 +35,9 @@ -- 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 -Nru postgresql-17-17.10/src/test/regress/sql/indexing.sql postgresql-17-17.11/src/test/regress/sql/indexing.sql --- postgresql-17-17.10/src/test/regress/sql/indexing.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/indexing.sql 2026-08-10 20:54:09.000000000 +0000 @@ -978,3 +978,17 @@ where indexrelid::regclass::text like 'parted_replica%' order by indexrelid::regclass::text collate "C"; drop table parted_replica_tab; + +-- 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 -Nru postgresql-17-17.10/src/test/regress/sql/join.sql postgresql-17-17.11/src/test/regress/sql/join.sql --- postgresql-17-17.10/src/test/regress/sql/join.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/join.sql 2026-08-10 20:54:09.000000000 +0000 @@ -1282,6 +1282,16 @@ (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; + -- Test proper handling of appendrel PHVs during useless-RTE removal explain (costs off) select * from diff -Nru postgresql-17-17.10/src/test/regress/sql/jsonb_jsonpath.sql postgresql-17-17.11/src/test/regress/sql/jsonb_jsonpath.sql --- postgresql-17-17.10/src/test/regress/sql/jsonb_jsonpath.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/jsonb_jsonpath.sql 2026-08-10 20:54:09.000000000 +0000 @@ -512,6 +512,13 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/money.sql postgresql-17-17.11/src/test/regress/sql/money.sql --- postgresql-17-17.10/src/test/regress/sql/money.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/money.sql 2026-08-10 20:54:09.000000000 +0000 @@ -142,6 +142,10 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/object_address.sql postgresql-17-17.11/src/test/regress/sql/object_address.sql --- postgresql-17-17.10/src/test/regress/sql/object_address.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/object_address.sql 2026-08-10 20:54:09.000000000 +0000 @@ -46,6 +46,10 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/partition_prune.sql postgresql-17-17.11/src/test/regress/sql/partition_prune.sql --- postgresql-17-17.10/src/test/regress/sql/partition_prune.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/partition_prune.sql 2026-08-10 20:54:09.000000000 +0000 @@ -99,6 +99,26 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/privileges.sql postgresql-17-17.11/src/test/regress/sql/privileges.sql --- postgresql-17-17.10/src/test/regress/sql/privileges.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/privileges.sql 2026-08-10 20:54:09.000000000 +0000 @@ -247,6 +247,7 @@ 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 @@ -290,6 +291,7 @@ 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 ) ); @@ -533,6 +535,7 @@ -- 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 \. @@ -931,18 +934,24 @@ 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); @@ -950,10 +959,19 @@ 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 @@ -966,18 +984,24 @@ 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); @@ -985,18 +1009,41 @@ 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; @@ -1004,7 +1051,11 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/psql.sql postgresql-17-17.11/src/test/regress/sql/psql.sql --- postgresql-17-17.10/src/test/regress/sql/psql.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/psql.sql 2026-08-10 20:54:09.000000000 +0000 @@ -446,6 +446,17 @@ 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 @@ -1048,6 +1059,17 @@ \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} @@ -1493,6 +1515,15 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/rangetypes.sql postgresql-17-17.11/src/test/regress/sql/rangetypes.sql --- postgresql-17-17.10/src/test/regress/sql/rangetypes.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/rangetypes.sql 2026-08-10 20:54:09.000000000 +0000 @@ -434,6 +434,20 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/rowsecurity.sql postgresql-17-17.11/src/test/regress/sql/rowsecurity.sql --- postgresql-17-17.10/src/test/regress/sql/rowsecurity.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/rowsecurity.sql 2026-08-10 20:54:09.000000000 +0000 @@ -1653,8 +1653,10 @@ 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 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/rules.sql postgresql-17-17.11/src/test/regress/sql/rules.sql --- postgresql-17-17.10/src/test/regress/sql/rules.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/rules.sql 2026-08-10 20:54:09.000000000 +0000 @@ -1087,6 +1087,7 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/sqljson.sql postgresql-17-17.11/src/test/regress/sql/sqljson.sql --- postgresql-17-17.10/src/test/regress/sql/sqljson.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/sqljson.sql 2026-08-10 20:54:09.000000000 +0000 @@ -395,6 +395,28 @@ 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 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/sqljson_jsontable.sql postgresql-17-17.11/src/test/regress/sql/sqljson_jsontable.sql --- postgresql-17-17.10/src/test/regress/sql/sqljson_jsontable.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/sqljson_jsontable.sql 2026-08-10 20:54:09.000000000 +0000 @@ -132,6 +132,15 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/sqljson_queryfuncs.sql postgresql-17-17.11/src/test/regress/sql/sqljson_queryfuncs.sql --- postgresql-17-17.10/src/test/regress/sql/sqljson_queryfuncs.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/sqljson_queryfuncs.sql 2026-08-10 20:54:09.000000000 +0000 @@ -105,6 +105,14 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/stats_ext.sql postgresql-17-17.11/src/test/regress/sql/stats_ext.sql --- postgresql-17-17.10/src/test/regress/sql/stats_ext.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/stats_ext.sql 2026-08-10 20:54:09.000000000 +0000 @@ -41,6 +41,8 @@ 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; @@ -1783,3 +1785,21 @@ 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; diff -Nru postgresql-17-17.10/src/test/regress/sql/triggers.sql postgresql-17-17.11/src/test/regress/sql/triggers.sql --- postgresql-17-17.10/src/test/regress/sql/triggers.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/triggers.sql 2026-08-10 20:54:09.000000000 +0000 @@ -57,13 +57,13 @@ -- (fkey3) --> fkeys2 (pkey23) -- create trigger check_fkeys_pkey_exist - before insert or update on fkeys + after insert or update on fkeys for each row execute function check_primary_key ('fkey1', 'fkey2', 'pkeys', 'pkey1', 'pkey2'); create trigger check_fkeys_pkey2_exist - before insert or update on fkeys + after insert or update on fkeys for each row execute function check_primary_key ('fkey3', 'fkeys2', 'pkey23'); @@ -72,7 +72,7 @@ -- (fkey21, fkey22) --> pkeys (pkey1, pkey2) -- create trigger check_fkeys2_pkey_exist - before insert or update on fkeys2 + after insert or update on fkeys2 for each row execute procedure check_primary_key ('fkey21', 'fkey22', 'pkeys', 'pkey1', 'pkey2'); @@ -88,7 +88,7 @@ -- fkeys (fkey1, fkey2) and fkeys2 (fkey21, fkey22) -- create trigger check_pkeys_fkey_cascade - before delete or update on pkeys + after delete or update on pkeys for each row execute procedure check_foreign_key (2, 'cascade', 'pkey1', 'pkey2', @@ -100,7 +100,7 @@ -- fkeys (fkey3) -- create trigger check_fkeys2_fkey_restrict - before delete or update on fkeys2 + after delete or update on fkeys2 for each row execute procedure check_foreign_key (1, 'restrict', 'pkey23', 'fkeys', 'fkey3'); diff -Nru postgresql-17-17.10/src/test/regress/sql/unicode.sql postgresql-17-17.11/src/test/regress/sql/unicode.sql --- postgresql-17-17.10/src/test/regress/sql/unicode.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/unicode.sql 2026-08-10 20:54:09.000000000 +0000 @@ -36,3 +36,23 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/window.sql postgresql-17-17.11/src/test/regress/sql/window.sql --- postgresql-17-17.10/src/test/regress/sql/window.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/window.sql 2026-08-10 20:54:09.000000000 +0000 @@ -1361,16 +1361,37 @@ 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 @@ 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 -Nru postgresql-17-17.10/src/test/regress/sql/xml.sql postgresql-17-17.11/src/test/regress/sql/xml.sql --- postgresql-17-17.10/src/test/regress/sql/xml.sql 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/regress/sql/xml.sql 2026-08-10 20:54:09.000000000 +0000 @@ -5,7 +5,14 @@ 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('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 '&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('name(/*)', ''); SELECT xpath('/nosuchtag', ''); SELECT xpath('root', ''); +SELECT xpath('//namespace::foo', ''); -- Round-trip non-ASCII data through xpath(). DO $$ diff -Nru postgresql-17-17.10/src/test/ssl/t/001_ssltests.pl postgresql-17-17.11/src/test/ssl/t/001_ssltests.pl --- postgresql-17-17.10/src/test/ssl/t/001_ssltests.pl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/ssl/t/001_ssltests.pl 2026-08-10 20:54:09.000000000 +0000 @@ -773,7 +773,7 @@ "$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!, # temporarily(?) skip this check due to timing issue # log_like => [ # qr{Client certificate verification failed at depth 0: certificate revoked}, @@ -878,7 +878,7 @@ "$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!, # temporarily(?) skip this check due to timing issue # log_like => [ # qr{Client certificate verification failed at depth 0: certificate revoked}, diff -Nru postgresql-17-17.10/src/test/subscription/t/021_twophase.pl postgresql-17-17.11/src/test/subscription/t/021_twophase.pl --- postgresql-17-17.10/src/test/subscription/t/021_twophase.pl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/subscription/t/021_twophase.pl 2026-08-10 20:54:09.000000000 +0000 @@ -310,6 +310,47 @@ 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 -Nru postgresql-17-17.10/src/test/subscription/t/023_twophase_stream.pl postgresql-17-17.11/src/test/subscription/t/023_twophase_stream.pl --- postgresql-17-17.10/src/test/subscription/t/023_twophase_stream.pl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/subscription/t/023_twophase_stream.pl 2026-08-10 20:54:09.000000000 +0000 @@ -439,6 +439,8 @@ )); $node_subscriber->restart; +$offset = -s $node_subscriber->logfile; + $node_publisher->safe_psql( 'postgres', q{ BEGIN; @@ -447,8 +449,6 @@ 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 -Nru postgresql-17-17.10/src/test/subscription/t/100_bugs.pl postgresql-17-17.11/src/test/subscription/t/100_bugs.pl --- postgresql-17-17.10/src/test/subscription/t/100_bugs.pl 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/test/subscription/t/100_bugs.pl 2026-08-10 20:54:09.000000000 +0000 @@ -487,6 +487,32 @@ is( $result, qq(2|f 3|t), 'check replicated update on subscriber'); +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"; + +# 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'); @@ -584,7 +610,7 @@ 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"); @@ -597,4 +623,49 @@ $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 -Nru postgresql-17-17.10/src/timezone/data/tzdata.zi postgresql-17-17.11/src/timezone/data/tzdata.zi --- postgresql-17-17.10/src/timezone/data/tzdata.zi 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/timezone/data/tzdata.zi 2026-08-10 20:54:09.000000000 +0000 @@ -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 - 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 @@ 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/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 @@ -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 -Nru postgresql-17-17.10/src/tools/pg_bsd_indent/indent.c postgresql-17-17.11/src/tools/pg_bsd_indent/indent.c --- postgresql-17-17.10/src/tools/pg_bsd_indent/indent.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/tools/pg_bsd_indent/indent.c 2026-08-10 20:54:09.000000000 +0000 @@ -535,7 +535,7 @@ 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 @@ * 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 -Nru postgresql-17-17.10/src/tools/pg_bsd_indent/indent.h postgresql-17-17.11/src/tools/pg_bsd_indent/indent.h --- postgresql-17-17.10/src/tools/pg_bsd_indent/indent.h 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/tools/pg_bsd_indent/indent.h 2026-08-10 20:54:09.000000000 +0000 @@ -39,9 +39,7 @@ 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 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 -Nru postgresql-17-17.10/src/tools/pg_bsd_indent/io.c postgresql-17-17.11/src/tools/pg_bsd_indent/io.c --- postgresql-17-17.10/src/tools/pg_bsd_indent/io.c 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/tools/pg_bsd_indent/io.c 2026-08-10 20:54:09.000000000 +0000 @@ -553,53 +553,22 @@ } 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 -Nru postgresql-17-17.10/src/tools/pgindent/typedefs.list postgresql-17-17.11/src/tools/pgindent/typedefs.list --- postgresql-17-17.10/src/tools/pgindent/typedefs.list 2026-05-11 19:46:41.000000000 +0000 +++ postgresql-17-17.11/src/tools/pgindent/typedefs.list 2026-08-10 20:54:09.000000000 +0000 @@ -2246,6 +2246,7 @@ PsqlScanResult PsqlScanState PsqlScanStateData +PsqlScanStateSave PsqlSettings Publication PublicationActions @@ -3805,6 +3806,7 @@ pthread_once_t pthread_t ptrdiff_t +publication_tables_state published_rel pull_var_clause_context pull_varattnos_context